diff options
| author | Mitchell Riedstra <mitch@riedstra.dev> | 2025-12-24 19:49:57 -0500 |
|---|---|---|
| committer | Mitchell Riedstra <mitch@riedstra.dev> | 2025-12-24 19:49:57 -0500 |
| commit | 939ac4319cb047a37ba46f84eff81948063f6954 (patch) | |
| tree | 5112cf8aad73125a13f5b52c0290a7f26f948b52 | |
| parent | 3a1b5ba15b89c907f9bf66a0761ffdd73b32208b (diff) | |
| download | unixv4-939ac4319cb047a37ba46f84eff81948063f6954.tar.gz unixv4-939ac4319cb047a37ba46f84eff81948063f6954.tar.xz | |
Add working webpage for unix v4
250 files changed, 39972 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ebbe4a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +img.tar +disk.img +simh.zip diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..fa16c73 --- /dev/null +++ b/Containerfile @@ -0,0 +1,45 @@ +FROM docker.io/alpine:3.23 + +RUN apk update && apk upgrade + +RUN apk add \ + build-base \ + curl \ + libarchive-tools \ + libedit-dev \ + libpcap-dev \ + libpng-dev \ + sdl2-dev \ + pcre-dev + + +COPY simh.zip /opt/ +RUN mkdir -p /opt/simh +WORKDIR /opt/simh +RUN bsdtar --strip-components=1 -xzvf /opt/simh.zip +# RUN make pdp11 +RUN make CFLAGS_G='-march=i386' pdp11 -j$(nproc) +RUN cp BIN/pdp11 /usr/bin/pdp11 + +RUN mkdir /opt/unixv4 +COPY boot.ini /opt/unixv4/ +COPY disk.rk /opt/unixv4/ +WORKDIR /opt/unixv4 + +RUN apk del \ + build-base \ + curl \ + libarchive-tools \ + libedit-dev \ + libpcap-dev \ + libpng-dev \ + sdl2-dev \ + pcre-dev + +RUN rm -rf /var/cache/apk /opt/simh /opt/simh.zip + +RUN apk add pcre sdl2 + +COPY entrypoint.sh /bin/ + +ENTRYPOINT /bin/entrypoint.sh @@ -2,5 +2,5 @@ set cpu 11/45 att rk0 disk.rk d sr 1 boot rk -# type k -# type unix +type k +type unix diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..285a76b --- /dev/null +++ b/build.sh @@ -0,0 +1,27 @@ +#!/bin/sh +set -ex +export BUILDAH_LAYERS=true +sudo=sudo +[ -n "$(command -v doas)" ] && [ -x $(command -v doas) ] && sudo=doas +docker=docker +[ -n "$(command -v podman)" ] && [ -x "$(command -v podman)" ] && docker=podman + +simh_url="https://github.com/simh/simh/archive/master.zip" +simh_archive="./simh.zip" +if ! [ -e "$simh_archive" ] ; then + wget -O "$simh_archive" "$simh_url" +fi + +$docker build --platform=i386 -t unixv4 . +$docker run --name unixv4emulator --entrypoint=/bin/true --replace unixv4 +$docker export unixv4emulator > img.tar +$docker container rm unixv4emulator +truncate -s 50M disk.img +$sudo kpartx -av disk.img +$sudo mkfs.ext2 /dev/loop0 +$sudo mount /dev/loop0 /mnt +$sudo tar -C /mnt -xpvf img.tar +$sudo umount /mnt +$sudo kpartx -dv disk.img + + diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..7bdd9eb --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/sh +if ! test -t ; then + echo "need an interactive terminal" + exit 1 +fi + +echo "You will need to type:" +echo " k<enter>" +echo " unix<enter>" +echo "" +echo "Where <enter> is the literal enter/return key." +echo "Once you get to the login prompt, the root user without a password" +echo "Will be available to you." +echo "" +echo "Note: to stop the simulation you can press c-e and type quit" + +exec /usr/bin/pdp11 boot.ini diff --git a/jslinux-2019-12-21/bbl64.bin b/jslinux-2019-12-21/bbl64.bin Binary files differnew file mode 100755 index 0000000..382672c --- /dev/null +++ b/jslinux-2019-12-21/bbl64.bin diff --git a/jslinux-2019-12-21/images/bg-scrollbar-thumb-y.png b/jslinux-2019-12-21/images/bg-scrollbar-thumb-y.png Binary files differnew file mode 100644 index 0000000..2ce41f2 --- /dev/null +++ b/jslinux-2019-12-21/images/bg-scrollbar-thumb-y.png diff --git a/jslinux-2019-12-21/images/bg-scrollbar-track-y.png b/jslinux-2019-12-21/images/bg-scrollbar-track-y.png Binary files differnew file mode 100644 index 0000000..2636c54 --- /dev/null +++ b/jslinux-2019-12-21/images/bg-scrollbar-track-y.png diff --git a/jslinux-2019-12-21/images/bg-scrollbar-trackend-y.png b/jslinux-2019-12-21/images/bg-scrollbar-trackend-y.png Binary files differnew file mode 100644 index 0000000..16d740c --- /dev/null +++ b/jslinux-2019-12-21/images/bg-scrollbar-trackend-y.png diff --git a/jslinux-2019-12-21/images/upload-icon.png b/jslinux-2019-12-21/images/upload-icon.png Binary files differnew file mode 100644 index 0000000..0efc325 --- /dev/null +++ b/jslinux-2019-12-21/images/upload-icon.png diff --git a/jslinux-2019-12-21/index.html b/jslinux-2019-12-21/index.html new file mode 100644 index 0000000..2e32891 --- /dev/null +++ b/jslinux-2019-12-21/index.html @@ -0,0 +1,68 @@ +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>JSLinux</title> + <link href="style.css" type="text/css" rel="stylesheet"/> +<style> +</style> +</head> +<body> + +<h1>Run Unix v4 from your browser</h1> + +<p> +Technically, we're booting Linux, to emulate a PDP-11. + +Once Linux is booted run: + +<pre><code> +cd /opt/unixv4 +pdp11 boot.ini +</code></pre> + +Once you see some info about the controller not being valid, type +<pre>k</pre> it should push you to a newline, then type <pre>unix</pre> +then hit enter. + +From there you should have a login prompt, at which you can type <pre>root</pre> +and play with the system as you see fit. +</p> +<div id="term_wrap"> + <div id="term_container"> + </div> + <div> + <textarea id="term_paste" cols="10" rows="1" autocorrect="off">Paste Here</textarea> + <label> + <img title="Upload files" src="images/upload-icon.png"><input type="file" id="files" multiple onchange="on_update_files(this.files)"> + </label> + <progress id="net_progress"> + </progress> + </div> +</div> +<script type="text/javascript" src="term.js"></script> +<script type="text/javascript" src="jslinux.js"></script> + +<p> +Special thanks to: +<ul> + <li> + <a href="https://x.com/akero_p">aap</a> for the disk image and basic + instructions found <a href="http://squoze.net/UNIX/v4/README">here</a> + </li> + <li> + Everyone involved with reading the tape and getting it to + <a href="https://archive.org/details/utah_unix_v4_raw">Archive.org</a> + </li> + <li> + Everyone at <a href="https://github.com/simh/simh">simh</a> for the + PDP-11 emulator + </li> + <li> + And finally Fabrice Bellard for + <a href="https://bellard.org/jslinux">JSLinux</a> and TinyEMU + </li> +</ul> +</p> +</body> +</html> diff --git a/jslinux-2019-12-21/jslinux.js b/jslinux-2019-12-21/jslinux.js new file mode 100644 index 0000000..39d45ac --- /dev/null +++ b/jslinux-2019-12-21/jslinux.js @@ -0,0 +1,646 @@ +/* + * JS Linux main + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +"use strict"; + +var term, console_write1; +var graphic_display, display_key_event, display_mouse_event; +var net_state, net_write_packet, net_set_carrier; +var display_wheel_event; +var fs_import_file; +var Module = {}; +var downloading_timer_pending = false; +var downloading_timer; + +function on_update_file(f) +{ + var f, reader; + reader = new FileReader(); + reader.onload = function (ev) { + var buf, buf_addr, buf_len; + buf = new Uint8Array(reader.result); + buf_len = buf.length; + buf_addr = _malloc(buf_len); + HEAPU8.set(buf, buf_addr); + /* the buffer is freed by the function */ + fs_import_file(f.name, buf_addr, buf_len); + }; + reader.readAsArrayBuffer(f); +} + +function on_update_files(files) +{ + var i, n; + n = files.length; + for(i = 0; i < n; i++) { + on_update_file(files[i]); + } +} + +function term_handler(str) +{ + var i; + for(i = 0; i < str.length; i++) { + console_write1(str.charCodeAt(i)); + } +} + +function downloading_timer_cb() +{ + var el = document.getElementById("net_progress"); + el.style.visibility = "hidden"; + downloading_timer_pending = false; +} + +function update_downloading(flag) +{ + var el; + if (flag) { + if (downloading_timer_pending) { + clearTimeout(downloading_timer); + downloading_timer_pending = false; + } else { + el = document.getElementById("net_progress"); + el.style.visibility = "visible"; + } + } else { + downloading_timer_pending = true; + downloading_timer = setTimeout(downloading_timer_cb, 500); + } +} + +function get_params() +{ + var url, query_str, p, tab, i, params, tab2; + query_str = window.location.href; + p = query_str.indexOf("?"); + if (p < 0) + return {}; + query_str = query_str.substr(p + 1); + tab = query_str.split("&"); + params = {}; + for(i = 0; i < tab.length; i++) { + tab2 = tab[i].split("="); + params[decodeURIComponent(tab2[0])] = decodeURIComponent(tab2[1]); + } + return params; +} + +function get_absolute_url(fname) +{ + var path, p; + + if (fname.indexOf(":") >= 0) + return fname; + path = window.location.pathname; + p = path.lastIndexOf("/"); + if (p < 0) + return fname; + return window.location.origin + path.slice(0, p + 1) + fname; +} + +function GraphicDisplay(parent_el, width, height) +{ + this.width = width; + this.height = height; + + this.canvas_el = document.createElement("canvas"); + this.canvas_el.width = width; /* logical width */ + this.canvas_el.height = height; /* logical width */ + /* displayed size */ + this.canvas_el.style.width = width + "px"; + this.canvas_el.style.height = height + "px"; + this.canvas_el.style.cursor = "none"; + + parent_el.appendChild(this.canvas_el); + + this.ctx = this.canvas_el.getContext("2d"); + /* clear the display */ + this.ctx.fillStyle = "#000000"; + this.ctx.fillRect(0, 0, width, height); + + this.image = this.ctx.createImageData(width, height); + + this.key_pressed = new Uint8Array(128); + + document.addEventListener("keydown", + this.keyDownHandler.bind(this), false); + document.addEventListener("keyup", + this.keyUpHandler.bind(this), false); + document.addEventListener("blur", + this.blurHandler.bind(this), false); + + this.canvas_el.onmousedown = this.mouseMoveHandler.bind(this); + this.canvas_el.onmouseup = this.mouseMoveHandler.bind(this); + this.canvas_el.onmousemove = this.mouseMoveHandler.bind(this); + this.canvas_el.oncontextmenu = this.onContextMenuHandler.bind(this); + this.canvas_el.onwheel = this.wheelHandler.bind(this); +} + +GraphicDisplay.code_to_input_map = { + "Escape": 0x01, + "Digit1": 0x02, + "Digit2": 0x03, + "Digit3": 0x04, + "Digit4": 0x05, + "Digit5": 0x06, + "Digit6": 0x07, + "Digit7": 0x08, + "Digit8": 0x09, + "Digit9": 0x0a, + "Digit0": 0x0b, + "Minus": 0x0c, + "Equal": 0x0d, + "Backspace": 0x0e, + "Tab": 0x0f, + "KeyQ": 0x10, + "KeyW": 0x11, + "KeyE": 0x12, + "KeyR": 0x13, + "KeyT": 0x14, + "KeyY": 0x15, + "KeyU": 0x16, + "KeyI": 0x17, + "KeyO": 0x18, + "KeyP": 0x19, + "BracketLeft": 0x1a, + "BracketRight": 0x1b, + "Enter": 0x1c, + "ControlLeft": 0x1d, + "KeyA": 0x1e, + "KeyS": 0x1f, + "KeyD": 0x20, + "KeyF": 0x21, + "KeyG": 0x22, + "KeyH": 0x23, + "KeyJ": 0x24, + "KeyK": 0x25, + "KeyL": 0x26, + "Semicolon": 0x27, + "Quote": 0x28, + "Backquote": 0x29, + "ShiftLeft": 0x2a, + "Backslash": 0x2b, + "KeyZ": 0x2c, + "KeyX": 0x2d, + "KeyC": 0x2e, + "KeyV": 0x2f, + "KeyB": 0x30, + "KeyN": 0x31, + "KeyM": 0x32, + "Comma": 0x33, + "Period": 0x34, + "Slash": 0x35, + "ShiftRight": 0x36, + "NumpadMultiply": 0x37, + "AltLeft": 0x38, + "Space": 0x39, + "CapsLock": 0x3a, + "F1": 0x3b, + "F2": 0x3c, + "F3": 0x3d, + "F4": 0x3e, + "F5": 0x3f, + "F6": 0x40, + "F7": 0x41, + "F8": 0x42, + "F9": 0x43, + "F10": 0x44, + "NumLock": 0x45, + "ScrollLock": 0x46, + "Numpad7": 0x47, + "Numpad8": 0x48, + "Numpad9": 0x49, + "NumpadSubtract": 0x4a, + "Numpad4": 0x4b, + "Numpad5": 0x4c, + "Numpad6": 0x4d, + "NumpadAdd": 0x4e, + "Numpad1": 0x4f, + "Numpad2": 0x50, + "Numpad3": 0x51, + "Numpad0": 0x52, + "NumpadDecimal": 0x53, + "IntlBackslash": 0x56, + "F11": 0x57, + "F12": 0x58, + + "NumpadEnter": 96, + "ControlRight": 97, + "NumpadDivide": 98, + "AltRight": 100, + "Home": 102, + "ArrowUp": 103, + "PageUp": 104, + "ArrowLeft": 105, + "ArrowRight": 106, + "End": 107, + "ArrowDown": 108, + "PageDown": 109, + "Insert": 110, + "Delete": 111, + "OSLeft": 125, + "OSRight": 126, + "ContextMenu": 127, +}; + +GraphicDisplay.key_code_to_input_map = new Uint8Array([ + 0, 0, 0, 0, 0, 0, 0, 0, + 0x0E, 0x0F, 0, 0, 0, 0x1C, 0, 0, + 0x2A, 0x1D, 0x38, 0, 0x3A, 0, 0, 0, /* 0x10 */ + 0, 0, 0, 0x01, 0, 0, 0, 0, + 0x39, 104, 109, 107, 102, 105, 103, 106, /* 0x20 */ + 0x50, 0, 0, 0, 0, 0x52, 0x53, 0, + 0x0B, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, /* 0x30 */ + 0x09, 0x0A, 0, 0x27, 0, 0x0D, 0, 0, + 0, 0x1E, 0x30, 0x2E, 0x20, 0x12, 0x21, 0x22, /* 0x40 */ + 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, + 0x19, 0x10, 0x13, 0x1F, 0x14, 0x16, 0x2F, 0x11, /* 0x50 */ + 0x2D, 0x15, 0x2C, 125, 126, 127, 0, 0, + 0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47, /* 0x60 */ + 0x48, 0x49, 0x37, 0x4e, 0, 0x4a, 0x53, 98, + 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, /* 0x70 */ + 0x43, 0x44, 0x57, 0x58, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0x45, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */ + 0, 0, 0, 0, 0, 0x0C, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */ + 0, 0, 0x27, 0x0D, 0x33, 0x0C, 0x34, 0x35, + 0x29, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */ + 0, 0, 0, 0x1A, 0x2B, 0x1B, 0x28, 0, + 125, 100, 0, 0, 0, 0, 0, 0, /* 0xe0 */ + 0, 0, 0, 0, 0, 0, 0, 0, +]); + +GraphicDisplay.prototype.keyHandler = function keyHandler(ev, isDown) +{ + var code, input_key_code; + + /* At least avoid exiting the navigator if Ctrl-Q or Ctrl-W are + * pressed */ + if (ev.ctrlKey) { + window.onbeforeunload = function() { + window.onbeforeunload = null; + return "CTRL-W or Ctrl-Q cannot be sent to the emulator."; + }; + } else { + window.onbeforeunload = null; + } + + if (typeof ev.code != "undefined") { + code = ev.code; + input_key_code = GraphicDisplay.code_to_input_map[code]; + if (typeof input_key_code != "undefined") { +// console.log("code=" + code + " isDown=" + isDown + " input_key_code=" + input_key_code); + this.key_pressed[input_key_code] = isDown; + display_key_event(isDown, input_key_code); + + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); + return false; + } + } else { + /* fallback using keyCodes. Works only with an US keyboard */ + code = ev.keyCode; + if (code < 256) { + input_key_code = GraphicDisplay.key_code_to_input_map[code]; +// console.log("keyCode=" + code + " isDown=" + isDown + " input_key_code=" + input_key_code); + if (input_key_code) { + this.key_pressed[input_key_code] = isDown; + display_key_event(isDown, input_key_code); + + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); + return false; + } + } + } + return true; +} + +GraphicDisplay.prototype.keyDownHandler = function keyDownHandler(ev) +{ + return this.keyHandler(ev, 1); +} + +GraphicDisplay.prototype.keyUpHandler = function keyUpHandler(ev) +{ + return this.keyHandler(ev, 0); +} + +GraphicDisplay.prototype.blurHandler = function blurHandler(ev, isDown) +{ + var i, n, key_pressed; + /* allow unloading the page */ + window.onbeforeunload = null; + /* release all keys */ + key_pressed = this.key_pressed; + for(i = 0; i < key_pressed.length; i++) { + if (key_pressed[i]) { + display_key_event(0, i); + key_pressed[i] = 0; + } + } +} + +GraphicDisplay.prototype.mouseMoveHandler = function (ev) +{ + var x, y, rect, buttons; + rect = this.canvas_el.getBoundingClientRect(); + x = ev.clientX - rect.left; + y = ev.clientY - rect.top; + buttons = ev.buttons & 7; +// console.log("mouse: x=" + x + " y=" + y + " buttons=" + buttons); + display_mouse_event(x, y, buttons); + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); + return false; +} + +GraphicDisplay.prototype.wheelHandler = function (ev) +{ + if (ev.deltaY < 0) { + display_wheel_event(1); + } else if (ev.deltaY > 0) { + display_wheel_event(-1); + } + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); +} + +/* disable contextual menu */ +GraphicDisplay.prototype.onContextMenuHandler = function (ev) +{ + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); + return false; +} + +/* Network support */ + +function Ethernet(url) +{ + try { + this.socket = new WebSocket(url); + } catch(err) { + this.socket = null; + console.log("Could not open websocket url=" + url); + return; + } + this.socket.binaryType = 'arraybuffer'; + this.socket.onmessage = this.messageHandler.bind(this); + this.socket.onclose = this.closeHandler.bind(this); + this.socket.onopen = this.openHandler.bind(this); + this.socket.onerror = this.errorHandler.bind(this); +} + +Ethernet.prototype.openHandler = function(e) +{ + net_set_carrier(1); +} + +Ethernet.prototype.closeHandler = function(e) +{ + net_set_carrier(0); +} + +Ethernet.prototype.errorHandler = function(e) +{ + console.log("Websocket error=" + e); +} + +Ethernet.prototype.messageHandler = function(e) +{ + var str, buf_len, buf_addr, buf; + if (e.data instanceof ArrayBuffer) { + buf_len = e.data.byteLength; + buf = new Uint8Array(e.data); + buf_addr = _malloc(buf_len); + HEAPU8.set(buf, buf_addr); + net_write_packet(buf_addr, buf_len); + _free(buf_addr); + } else { + str = e.data.toString(); + if (str.substring(0, 5) == "ping:") { + try { + this.socket.send('pong:' + str.substring(5)); + } catch (err) { + } + } + } +} + +Ethernet.prototype.recv_packet = function(buf) +{ + if (this.socket) { + try { + this.socket.send(buf); + } catch (err) { + } + } +} + +function start_vm(user, pwd) +{ + var url, mem_size, cpu, params, vm_url, cmdline, cols, rows, guest_url; + var font_size, graphic_enable, width, height, net_url, alloc_size; + var drive_url, vm_file; + + function loadScript(src, f) { + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement("script"); + script.src = src; + var done = false; + script.onload = script.onreadystatechange = function() { + // attach to both events for cross browser finish detection: + if ( !done && (!this.readyState || + this.readyState == "loaded" || this.readyState == "complete") ) { + done = true; + if (f) { + f(); + } + script.onload = script.onreadystatechange = null; + head.removeChild(script); + } + }; + head.appendChild(script); + } + + function start() + { + /* C functions called from javascript */ + console_write1 = Module.cwrap('console_queue_char', null, ['number']); + fs_import_file = Module.cwrap('fs_import_file', null, ['string', 'number', 'number']); + display_key_event = Module.cwrap('display_key_event', null, ['number', 'number']); + display_mouse_event = Module.cwrap('display_mouse_event', null, ['number', 'number', 'number']); + display_wheel_event = Module.cwrap('display_wheel_event', null, ['number']); + net_write_packet = Module.cwrap('net_write_packet', null, ['number', 'number']); + net_set_carrier = Module.cwrap('net_set_carrier', null, ['number']); + + net_state = null; + if (net_url != "") { + net_state = new Ethernet(net_url); + } + + Module.ccall("vm_start", null, ["string", "number", "string", "string", "number", "number", "number", "string"], [url, mem_size, cmdline, pwd, width, height, (net_state != null) | 0, drive_url]); + pwd = null; + } + + /* read the parameters */ + + params = get_params(); + cpu = params["cpu"] || "x86"; + url = params["url"]; + if (!url) { + if (cpu == "riscv") + url = "root-riscv64.cfg"; + else + url = "root-x86.cfg"; + } + url = get_absolute_url(url); + mem_size = (params["mem"] | 0) || 128; /* in mb */ + cmdline = params["cmdline"] || ""; + cols = (params["cols"] | 0) || 80; + rows = (params["rows"] | 0) || 30; + font_size = (params["font_size"] | 0) || 15; + guest_url = params["guest_url"] || ""; + width = (params["w"] | 0) || 1024; + height = (params["h"] | 0) || 640; + graphic_enable = params["graphic"] | 0; + net_url = params["net_url"] || ""; /* empty string means no network */ + if (typeof net_url == "undefined") + net_url = "wss://relay.widgetry.org/"; + drive_url = params["drive_url"] || ""; + + if (user) { + cmdline += " LOGIN_USER=" + user; + } else if (guest_url) { + cmdline += " GUEST_URL=" + guest_url; + } + + if (graphic_enable) { + graphic_display = new GraphicDisplay(document.getElementById("term_container"), width, height); + } else { + width = 0; + height = 0; + /* start the terminal */ + term = new Term(cols, rows, term_handler, 10000); + term.open(document.getElementById("term_container"), + document.getElementById("term_paste")); + term.term_el.style.fontSize = font_size + "px"; + term.write("Loading...\r\n"); + } + +// console.log("cpu=" + cpu + " url=" + url + " mem=" + mem_size); + + switch(cpu) { + case "x86": + vm_file = "x86emu"; + break; + case "riscv64": + case "riscv": + vm_file = "riscvemu64"; + break; + case "riscv32": + vm_file = "riscvemu32"; + break; + default: + term.writeln("Unknown cpu=" + cpu); + return; + } + + if (typeof WebAssembly === "object") { + /* wasm support : the memory grows automatically */ + vm_url = vm_file + "-wasm.js"; + } else { + /* set the total memory */ + alloc_size = mem_size; + if (cpu == "x86") + alloc_size += 16; + if (graphic_enable) { + /* frame buffer memory */ + alloc_size += (width * height * 4 + 1048576 - 1) >> 20; + } + alloc_size += 32; /* extra space (XXX: reduce it ?) */ + alloc_size = (alloc_size + 15) & -16; /* align to 16 MB */ + Module.TOTAL_MEMORY = alloc_size << 20; + vm_url = vm_file + ".js"; + } + Module.preRun = start; + + loadScript(vm_url, null); +} + +function on_login() +{ + var login_wrap_el = document.getElementById("wrap"); + var term_wrap_el = document.getElementById("term_wrap"); + var form = document.getElementById("form"); + var status = document.getElementById("status"); + var user = form.user.value; + var pwd = form.password.value; + + if (user.length <= 1) { + status.innerHTML = "User name must be provided"; + return false; + } + + login_wrap_el.style.display = "none"; + term_wrap_el.style.display = "block"; + form.password.value = ""; + form.user.value = ""; + + start_vm(user, pwd); + + return false; +} + +(function() { + var login, params; + + params = get_params(); + login = params["login"] || 0; + if (login) { + var login_wrap_el = document.getElementById("wrap"); + login_wrap_el.style.display = "block"; + } else { + var term_wrap_el = document.getElementById("term_wrap"); + term_wrap_el.style.display = "block"; + start_vm(null, null); + } +})(); diff --git a/jslinux-2019-12-21/kernel-riscv64.bin b/jslinux-2019-12-21/kernel-riscv64.bin Binary files differnew file mode 100755 index 0000000..18b3136 --- /dev/null +++ b/jslinux-2019-12-21/kernel-riscv64.bin diff --git a/jslinux-2019-12-21/kernel-x86.bin b/jslinux-2019-12-21/kernel-x86.bin Binary files differnew file mode 100644 index 0000000..d29d300 --- /dev/null +++ b/jslinux-2019-12-21/kernel-x86.bin diff --git a/jslinux-2019-12-21/readme.txt b/jslinux-2019-12-21/readme.txt new file mode 100644 index 0000000..89d182e --- /dev/null +++ b/jslinux-2019-12-21/readme.txt @@ -0,0 +1,27 @@ +JSLinux demo +============ + +You must copy all the files to a directory on a web server in order to +run the demo (it is needed so that the XML HTTP Requests work +correctly). Assuming it is installed in http://localhost/jslinux, +explore in a browser: + +http://localhost/jslinux + +A minimal busybox distribution for RISCV-64 and x86 is provided. The +RISCV-64 version is executed by default. To run the x86 version, +explore: + +http://localhost/jslinux?cpu=x86 + +The source jslinux.js can be modified to change the default +configuration. + +More complete Linux distributions (such as buildroot) can be used +provided you keep using the same precompiled Linux kernels. The +TinyEMU 'splitimg' tool must be used to convert a diskimage to a list +of files. For example: + +splitimg root-riscv64.bin root-riscv64 256 + +The demo VM configurations are in root-riscv64.cfg and root-x86.cfg. diff --git a/jslinux-2019-12-21/riscvemu32-wasm.js b/jslinux-2019-12-21/riscvemu32-wasm.js new file mode 100644 index 0000000..d3b2608 --- /dev/null +++ b/jslinux-2019-12-21/riscvemu32-wasm.js @@ -0,0 +1,4 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;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;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);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};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}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}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}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){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(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 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";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?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>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)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;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:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;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];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";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;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 UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;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){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){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<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,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;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;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 allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}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__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="riscvemu32-wasm.wast";var wasmBinaryFile="riscvemu32-wasm.wasm";var asmjsCodeFile="riscvemu32-wasm.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("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);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;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)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+29488;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=29488;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}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!")}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 SYSCALLS={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}),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 ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;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{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{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 _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}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};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,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/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){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)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}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{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("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=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;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,1e3/fps);else _emscripten_set_main_loop_timing(1,1);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++}),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);_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}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("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"]=[];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}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){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){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);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;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);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);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&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});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&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){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{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}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)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);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){err("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){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){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(){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()}}),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){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;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}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);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(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);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_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_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()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}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}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("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)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=184;Module["wasmMaxTableSize"]=184;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _console_queue_char=Module["_console_queue_char"]=(function(){return Module["asm"]["_console_queue_char"].apply(null,arguments)});var _display_key_event=Module["_display_key_event"]=(function(){return Module["asm"]["_display_key_event"].apply(null,arguments)});var _display_mouse_event=Module["_display_mouse_event"]=(function(){return Module["asm"]["_display_mouse_event"].apply(null,arguments)});var _display_wheel_event=Module["_display_wheel_event"]=(function(){return Module["asm"]["_display_wheel_event"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _fs_import_file=Module["_fs_import_file"]=(function(){return Module["asm"]["_fs_import_file"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _net_set_carrier=Module["_net_set_carrier"]=(function(){return Module["asm"]["_net_set_carrier"].apply(null,arguments)});var _net_write_packet=Module["_net_write_packet"]=(function(){return Module["asm"]["_net_write_packet"].apply(null,arguments)});var _vm_start=Module["_vm_start"]=(function(){return Module["asm"]["_vm_start"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiijjjjj=Module["dynCall_iiiiiiijjjjj"]=(function(){return Module["asm"]["dynCall_iiiiiiijjjjj"].apply(null,arguments)});var dynCall_iiijii=Module["dynCall_iiijii"]=(function(){return Module["asm"]["dynCall_iiijii"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiji=Module["dynCall_viiji"]=(function(){return Module["asm"]["dynCall_viiji"].apply(null,arguments)});Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + diff --git a/jslinux-2019-12-21/riscvemu32-wasm.wasm b/jslinux-2019-12-21/riscvemu32-wasm.wasm Binary files differnew file mode 100644 index 0000000..f640595 --- /dev/null +++ b/jslinux-2019-12-21/riscvemu32-wasm.wasm diff --git a/jslinux-2019-12-21/riscvemu32.js b/jslinux-2019-12-21/riscvemu32.js new file mode 100644 index 0000000..b81d3db --- /dev/null +++ b/jslinux-2019-12-21/riscvemu32.js @@ -0,0 +1,19 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;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;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);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};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}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}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}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){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(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 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";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?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>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)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;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:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;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];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";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;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 UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;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){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){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<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){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){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;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 allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) 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"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}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__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+28480;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});memoryInitializer="data:application/octet-stream;base64,AAAAAAAAAABjY2NjfHx8fHd3d3d7e3t78vLy8mtra2tvb29vxcXFxTAwMDABAQEBZ2dnZysrKyv+/v7+19fX16urq6t2dnZ2ysrKyoKCgoLJycnJfX19ffr6+vpZWVlZR0dHR/Dw8PCtra2t1NTU1KKioqKvr6+vnJycnKSkpKRycnJywMDAwLe3t7f9/f39k5OTkyYmJiY2NjY2Pz8/P/f39/fMzMzMNDQ0NKWlpaXl5eXl8fHx8XFxcXHY2NjYMTExMRUVFRUEBAQEx8fHxyMjIyPDw8PDGBgYGJaWlpYFBQUFmpqamgcHBwcSEhISgICAgOLi4uLr6+vrJycnJ7KysrJ1dXV1CQkJCYODg4MsLCwsGhoaGhsbGxtubm5uWlpaWqCgoKBSUlJSOzs7O9bW1tazs7OzKSkpKePj4+MvLy8vhISEhFNTU1PR0dHRAAAAAO3t7e0gICAg/Pz8/LGxsbFbW1tbampqasvLy8u+vr6+OTk5OUpKSkpMTExMWFhYWM/Pz8/Q0NDQ7+/v76qqqqr7+/v7Q0NDQ01NTU0zMzMzhYWFhUVFRUX5+fn5AgICAn9/f39QUFBQPDw8PJ+fn5+oqKioUVFRUaOjo6NAQEBAj4+Pj5KSkpKdnZ2dODg4OPX19fW8vLy8tra2ttra2tohISEhEBAQEP/////z8/Pz0tLS0s3Nzc0MDAwMExMTE+zs7OxfX19fl5eXl0REREQXFxcXxMTExKenp6d+fn5+PT09PWRkZGRdXV1dGRkZGXNzc3NgYGBggYGBgU9PT0/c3NzcIiIiIioqKiqQkJCQiIiIiEZGRkbu7u7uuLi4uBQUFBTe3t7eXl5eXgsLCwvb29vb4ODg4DIyMjI6Ojo6CgoKCklJSUkGBgYGJCQkJFxcXFzCwsLC09PT06ysrKxiYmJikZGRkZWVlZXk5OTkeXl5eefn5+fIyMjINzc3N21tbW2NjY2N1dXV1U5OTk6pqampbGxsbFZWVlb09PT06urq6mVlZWV6enp6rq6urggICAi6urq6eHh4eCUlJSUuLi4uHBwcHKampqa0tLS0xsbGxujo6Ojd3d3ddHR0dB8fHx9LS0tLvb29vYuLi4uKioqKcHBwcD4+Pj61tbW1ZmZmZkhISEgDAwMD9vb29g4ODg5hYWFhNTU1NVdXV1e5ubm5hoaGhsHBwcEdHR0dnp6enuHh4eH4+Pj4mJiYmBERERFpaWlp2dnZ2Y6Ojo6UlJSUm5ubmx4eHh6Hh4eH6enp6c7Ozs5VVVVVKCgoKN/f39+MjIyMoaGhoYmJiYkNDQ0Nv7+/v+bm5uZCQkJCaGhoaEFBQUGZmZmZLS0tLQ8PDw+wsLCwVFRUVLu7u7sWFhYWAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAbAAAANgAAAAAAAAAAUKf0UVNlQX7DpBcall4nOstrqzvxRZ0fq1j6rJMD40tV+jAg9m12rZF2zIglTAL1/NflT9fLKsWARDUmj6NitUlasd5nG7olmA7qReHA/l0CdS/DEvBMgaOXRo3G+dNr51+PA5WckhXrem2/2llSlS2DvtTTIXRYKWngSUTIyY5qicJ1eHmO9Gs+WJndcbkntk/hvhetiPBmrCDJtDrOfRhK32OCMRrlYDNRl0V/U2Lgd2SxhK5ruxyggf6UKwj5WGhIcBn9RY+HbN6Ut/h7UiPTc6viAktyV48f4yqrVWYHKOuyA8K1L5p7xYalCDfT8ocoMLKlvyO6agMCXIIW7Sscz4qStHmn8PIH86HiaU7N9Npl1b4FBh9iNNGK/qbEnVMuNKBV86Iy4YoFdev2pDnsgwuq72BABp9xXlEQbr35iiE+PQbdlq4FPt1GveZNtY1UkQVdxHFv1AYE/xVQYCT7mBmX6b3WzENAiXee2We9QuiwiIuJBzhbGefb7sh5Rwp8oekPQnzJHoT4AAAAAIOGgAlI7SsyrHARHk5yWmz7/w79VjiFDx7Vrj0nOS02ZNkPCiGmXGjRVFubOi42JLFnCgwP51eT0pbutJ6RmxtPxcCAoiDcYWlLd1oWGhIcCrqT4uUqoMBD4CI8HRcbEgsNCQ6tx4vyuai2LcipHhSFGfFXTAd1r7vdme79YH+jnyYB97z1clzFO2ZENH77W3YpQ4vcxiPLaPzttmPx5LjK3DHXEIVjQkAilxMgEcaEfSRKhfg9u9IRMvmubaEpx0svnh3zMLLc7FKGDdDjwXdsFrMrmblwqfpIlBEiZOlHxIz8qBo/8KDYLH1W75AzIsdOSYfB0TjZ/qLKjDYL1JjPgfWmKN56pSaOt9qkv60/5J06LA2SeFCbzF9qYkZ+VMITjfbouNiQXvc5LvWvw4K+gF2ffJPQaakt1W+zEiXPO5msyKd9GBBuY5zoe7s72wl4Js30GFluAbea7KiaT4NlbpXmfub/qgjPvCHm6BXv2Zvnus42b0rUCZ/q1nywKa+ypDExIz8qMJSlxsBmojU3vE50psqC/LDQkOAV2KczSpgE8ffa7EEOUM1/L/aRF43WTXZNsO9DVE2qzN8EluTjtdGeG4hqTLgfLMF/UWVGBOpenV01jAFzdIf6LkEL+1odZ7NS0tuSM1YQ6RNH1m2MYdeaegyhN44U+FmJPBPr7iepzjXJYbft5RzhPLFHelnf0pw/c/JVec4UGL83x3PqzfdTW6r9XxRvPd+G20R4gfOvyj7EaLksNCQ4X0CjwnLDHRYMJeK8i0k8KEGVDf9xAag53rMMCJzktNiQwVZkYYTLe3C2MtV0XGxIQle40Kf0UVBlQX5TpBcaw14nOpZrqzvLRZ0f8Vj6rKsD40uT+jAgVW12rfZ2zIiRTAL1JdflT/zLKsXXRDUmgKNitY9asd5JG7olZw7qRZjA/l3hdS/DAvBMgRKXRo2j+dNrxl+PA+eckhWVem2/61lSldqDvtQtIXRY02ngSSnIyY5EicJ1anmO9Hg+WJlrcbkn3U/hvratiPAXrCDJZjrOfbRK32MYMRrlgjNRl2B/U2JFd2Sx4K5ru4Sggf4cKwj5lGhIcFj9RY8ZbN6Uh/h7UrfTc6sjAkty4o8f41erVWYqKOuyB8K1LwN7xYaaCDfTpYcoMPKlvyOyagMCuoIW7Vwcz4ortHmnkvIH8/DiaU6h9Nplzb4FBtViNNEf/qbEilMuNJ1V86Kg4YoFMuv2pHXsgws572BAqp9xXgYQbr1RiiE++Qbdlj0FPt2uveZNRo1UkbVdxHEF1AYEbxVQYP/7mBkk6b3Wl0NAicye2Wd3QuiwvYuJB4hbGec47sh52wp8oUcPQnzpHoT4yQAAAACGgAmD7SsySHARHqxyWmxO/w79+ziFD1bVrj0eOS02J9kPCmSmXGghVFub0S42JDpnCgyx51eTD5butNKRmxuexcCATyDcYaJLd1ppGhIcFrqT4goqoMDl4CI8QxcbEh0NCQ4Lx4vyrai2LbmpHhTIGfFXhQd1r0zdme67YH+j/SYB95/1cly8O2ZExX77WzQpQ4t2xiPL3Pzttmjx5Lhj3DHXyoVjQhAilxNAEcaEICRKhX09u9L4MvmuEaEpx20vnh1LMLLc81KGDezjwXfQFrMrbLlwqZlIlBH6ZOlHIoz8qMQ/8KAaLH1W2JAzIu9OSYfH0TjZwaLKjP4L1Jg2gfWmz956pSiOt9omv60/pJ06LOSSeFANzF9qm0Z+VGITjfbCuNiQ6Pc5Ll6vw4L1gF2fvpPQaXwt1W+pEiXPs5msyDt9GBCnY5zobrs723t4Js0JGFlu9Lea7AGaT4OobpXmZeb/qn7PvCEI6BXv5pvnutk2b0rOCZ/q1HywKdaypDGvIz8qMZSlxjBmojXAvE50N8qC/KbQkOCw2KczFZgE8Ura7EH3UM1/DvaRFy/WTXaNsO9DTU2qzFQEluTftdGe44hqTBsfLMG4UWVGf+penQQ1jAFddIf6c0EL+y4dZ7Na0tuSUlYQ6TNH1m0TYdeajAyhN3oU+FmOPBPriSepzu7JYbc15Rzh7bFHejzf0pxZc/JVP84UGHk3x3O/zfdT6qr9X1tvPd8U20R4hvOvyoHEaLk+NCQ4LECjwl/DHRZyJeK8DEk8KIuVDf9BAag5cbMMCN7ktNicwVZkkITLe2G2MtVwXGxIdFe40EL0UVCnQX5TZRcaw6QnOpZeqzvLa50f8UX6rKtY40uTAzAgVfp2rfZtzIiRdgL1JUzlT/zXKsXXyzUmgERitY+jsd5JWrolZxvqRZgO/l3hwC/DAnVMgRLwRo2jl9NrxvmPA+dfkhWVnG2/63pSldpZvtQtg3RY0yHgSSlpyY5EyMJ1aomO9Hh5WJlrPrkn3XHhvrZPiPAXrSDJZqzOfbQ632MYShrlgjFRl2AzU2JFf2Sx4Hdru4Sugf4coAj5lCtIcFhoRY8Z/d6Uh2x7Urf4c6sj00ty4gIf41ePVWYqq+uyByi1LwPCxYaaezfTpQgoMPKHvyOypQMCumoW7VyCz4orHHmnkrQH8/DyaU6h4tplzfQFBtW+NNEfYqbEiv4uNJ1T86KgVYoFMuH2pHXrgws57GBAqu9xXgafbr1RECE++Yrdlj0GPt2uBeZNRr1UkbWNxHEFXQYEb9RQYP8VmBkk+73Wl+lAicxD2Wd3nuiwvUKJB4iLGec4W8h52+58oUcKQnzpD4T4yR4AAAAAgAmDhisySO0RHqxwWmxOcg79+/+FD1Y4rj0e1S02JzkPCmTZXGghplub0VQ2JDouCgyxZ1eTD+futNKWmxuekcCAT8XcYaIgd1ppSxIcFhqT4gq6oMDlKiI8Q+AbEh0XCQ4LDYvyrce2LbmoHhTIqfFXhRl1r0wHme673X+j/WAB958mcly89WZExTv7WzR+Q4t2KSPL3Mbttmj85Lhj8THXytxjQhCFlxNAIsaEIBFKhX0ku9L4PfmuETIpx22hnh1LL7Lc8zCGDexSwXfQ47MrbBZwqZm5lBH6SOlHImT8qMSM8KAaP31W2CwzIu+QSYfHTjjZwdHKjP6i1Jg2C/Wmz4F6pSjet9omjq0/pL86LOSdeFANkl9qm8x+VGJGjfbCE9iQ6Lg5Ll73w4L1r12fvoDQaXyT1W+pLSXPsxKsyDuZGBCnfZzobmM723u7Js0JeFlu9Bia7AG3T4OompXmZW7/qn7mvCEIzxXv5ujnutmbb0rONp/q1AmwKdZ8pDGvsj8qMSOlxjCUojXAZk50N7yC/KbKkOCw0KczFdgE8UqY7EH32s1/DlCRFy/2TXaN1u9DTbCqzFRNluTfBNGe47VqTBuILMG4H2VGf1FenQTqjAFdNYf6c3QL+y5BZ7NaHduSUtIQ6TNW1m0TR9eajGGhN3oM+FmOFBPriTypzu4nYbc1yRzh7eVHejyx0pxZ3/JVP3MUGHnOx3O/N/dT6s39X1uqPd8Ub0R4htuvyoHzaLk+xCQ4LDSjwl9AHRZyw+K8DCU8KItJDf9Blag5cQEMCN6ztNic5FZkkMHLe2GEMtVwtmxIdFy40EJXUVCn9H5TZUEaw6QXOpZeJzvLa6sf8UWdrKtY+kuTA+MgVfowrfZtdoiRdsz1JUwCT/zX5cXXyyomgEQ1tY+jYt5JWrElZxu6RZgO6l3hwP7DAnUvgRLwTI2jl0ZrxvnTA+dfjxWVnJK/63ptldpZUtQtg75Y0yF0SSlp4I5EyMl1aonC9Hh5jplrPlgn3XG5vrZP4fAXrYjJZqwgfbQ6zmMYSt/lgjEal2AzUWJFf1Ox4Hdku4Sua/4coIH5lCsIcFhoSI8Z/UWUh2zeUrf4e6sj03Ny4gJL41ePH2Yqq1WyByjrLwPCtYaae8XTpQg3MPKHKCOypb8CumoD7VyCFoorHM+nkrR58/DyB06h4mllzfTaBtW+BdEfYjTEiv6mNJ1TLqKgVfMFMuGKpHXr9gs57INAqu9gXgafcb1REG4++Yohlj0G3d2uBT5NRr3mkbWNVHEFXcQEb9QGYP8VUBkk+5jWl+m9icxDQGd3ntmwvULoB4iLiec4Wxl52+7IoUcKfHzpD0L4yR6EAAAAAAmDhoAySO0rHqxwEWxOclr9+/8OD1Y4hT0e1a42JzktCmTZD2ghplyb0VRbJDouNgyxZwqTD+dXtNKW7huekZuAT8XAYaIg3FppS3ccFhoS4gq6k8DlKqA8Q+AiEh0XGw4LDQnyrceLLbmothTIqR5XhRnxr0wHde673Zmj/WB/958mAVy89XJExTtmWzR++4t2KUPL3MYjtmj87bhj8eTXytwxQhCFYxNAIpeEIBHGhX0kStL4PbuuETL5x22hKR1LL57c8zCyDexShnfQ48ErbBazqZm5cBH6SJRHImTpqMSM/KAaP/BW2Cx9Iu+QM4fHTknZwdE4jP6iypg2C9Smz4H1pSjeetomjrc/pL+tLOSdOlANknhqm8xfVGJGfvbCE42Q6LjYLl73OYL1r8OfvoBdaXyT0G+pLdXPsxIlyDuZrBCnfRjobmOc23u7O80JeCZu9BhZ7AG3moOomk/mZW6Vqn7m/yEIz7zv5ugVutmb50rONm/q1AmfKdZ8sDGvsqQqMSM/xjCUpTXAZqJ0N7xO/KbKguCw0JAzFdin8UqYBEH32ux/DlDNFy/2kXaN1k1DTbDvzFRNquTfBJae47XRTBuIasG4HyxGf1FlnQTqXgFdNYz6c3SH+y5BC7NaHWeSUtLb6TNWEG0TR9aajGHXN3oMoVmOFPjriTwTzu4nqbc1yWHh7eUcejyxR5xZ39JVP3PyGHnOFHO/N8dT6s33X1uq/d8Ubz14httEyoHzr7k+xGg4LDQkwl9AoxZywx28DCXiKItJPP9BlQ05cQGoCN6zDNic5LRkkMFWe2GEy9VwtjJIdFxs0EJXuKVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fOfSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/MzINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaWNw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkAAAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+fJeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAgGv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxHPT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5FxcuF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwkHBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQet/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8VFSo1ru7bToWFixjY8alfHz4hHd37pl7e/aN8vL/DWtr1r1vb96xxcWRVDAwYFABAQIDZ2fOqSsrVn3+/ucZ19e1YqurTeZ2duyaysqPRYKCH53JyYlAfX36h/r67xVZWbLrR0eOyfDw+wutrUHs1NSzZ6KiX/2vr0XqnJwjv6SkU/dycuSWwMCbW7e3dcL9/eEck5M9riYmTGo2NmxaPz9+Qff39QLMzINPNDRoXKWlUfTl5dE08fH5CHFx4pPY2KtzMTFiUxUVKj8EBAgMx8eVUiMjRmXDw51eGBgwKJaWN6EFBQoPmpovtQcHDgkSEiQ2gIAbm+Li3z3r680mJydOabKyf811deqfCQkSG4ODHZ4sLFh0Gho0LhsbNi1ubtyyWlq07qCgW/tSUqT2Ozt2TdbWt2Gzs33OKSlSe+Pj3T4vL15xhIQTl1NTpvXR0bloAAAAAO3twSwgIEBg/PzjH7GxechbW7btamrUvsvLjUa+vmfZOTlyS0pKlN5MTJjUWFiw6M/PhUrQ0Ltr7+/FKqqqT+X7++0WQ0OGxU1NmtczM2ZVhYURlEVFis/5+ekQAgIEBn9//oFQUKDwPDx4RJ+fJbqoqEvjUVGi86OjXf5AQIDAj48FipKSP62dnSG8ODhwSPX18QS8vGPftrZ3wdrar3UhIUJjEBAgMP//5Rrz8/0O0tK/bc3NgUwMDBgUExMmNezswy9fX77hl5c1okREiMwXFy45xMSTV6enVfJ+fvyCPT16R2RkyKxdXbrnGRkyK3Nz5pVgYMCggYEZmE9PntHc3KN/IiJEZioqVH6QkDuriIgLg0ZGjMru7scpuLhr0xQUKDze3qd5Xl684gsLFh3b26124ODbOzIyZFY6OnROCgoUHklJktsGBgwKJCRIbFxcuOTCwp9d09O9bqysQ+9iYsSmkZE5qJWVMaTk5NM3eXnyi+fn1TLIyItDNzduWW1t2reNjQGM1dWxZE5OnNKpqUngbGzYtFZWrPr09PMH6urPJWVlyq96evSOrq5H6QgIEBi6um/VeHjwiCUlSm8uLlxyHBw4JKamV/G0tHPHxsaXUejoyyPd3aF8dHTonB8fPiFLS5bdvb1h3IuLDYaKig+FcHDgkD4+fEK1tXHEZmbMqkhIkNgDAwYF9vb3AQ4OHBJhYcKjNTVqX1dXrvm5uWnQhoYXkcHBmVgdHTonnp4nueHh2Tj4+OsTmJgrsxERIjNpadK72dmpcI6OB4mUlDOnm5stth4ePCKHhxWS6enJIM7Oh0lVVar/KChQeN/fpXqMjAOPoaFZ+ImJCYANDRoXv79l2ubm1zFCQoTGaGjQuEFBgsOZmSmwLS1adw8PHhGwsHvLVFSo/Lu7bdYWFiw6Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6FsalY2P4hHx87pl3d/aNe3v/DfLy1r1ra96xb2+RVMXFYFAwMAIDAQHOqWdnVn0rK+cZ/v61YtfXTearq+yadnaPRcrKH52CgolAycn6h3197xX6+rLrWVmOyUdH+wvw8EHsra2zZ9TUX/2iokXqr68jv5ycU/ekpOSWcnKbW8DAdcK3t+Ec/f09rpOTTGomJmxaNjZ+QT8/9QL394NPzMxoXDQ0UfSlpdE05eX5CPHx4pNxcatz2NhiUzExKj8VFQgMBASVUsfHRmUjI51ew8MwKBgYN6GWlgoPBQUvtZqaDgkHByQ2EhIbm4CA3z3i4s0m6+tOaScnf82ysuqfdXUSGwkJHZ6Dg1h0LCw0LhoaNi0bG9yybm607lpaW/ugoKT2UlJ2TTs7t2HW1n3Os7NSeykp3T7j415xLy8Tl4SEpvVTU7lo0dEAAAAAwSzt7UBgICDjH/z8ecixsbbtW1vUvmpqjUbLy2fZvr5ySzk5lN5KSpjUTEyw6FhYhUrPz7tr0NDFKu/vT+Wqqu0W+/uGxUNDmtdNTWZVMzMRlIWFis9FRekQ+fkEBgIC/oF/f6DwUFB4RDw8Jbqfn0vjqKii81FRXf6jo4DAQEAFio+PP62SkiG8nZ1wSDg48QT19WPfvLx3wba2r3Xa2kJjISEgMBAQ5Rr///0O8/O/bdLSgUzNzRgUDAwmNRMTwy/s7L7hX181opeXiMxERC45FxeTV8TEVfKnp/yCfn56Rz09yKxkZLrnXV0yKxkZ5pVzc8CgYGAZmIGBntFPT6N/3NxEZiIiVH4qKjurkJALg4iIjMpGRscp7u5r07i4KDwUFKd53t684l5eFh0LC61229vbO+DgZFYyMnROOjoUHgoKkttJSQwKBgZIbCQkuORcXJ9dwsK9btPTQ++srMSmYmI5qJGRMaSVldM35OTyi3l51TLn54tDyMhuWTc32rdtbQGMjY2xZNXVnNJOTkngqanYtGxsrPpWVvMH9PTPJerqyq9lZfSOenpH6a6uEBgICG/VurrwiHh4Sm8lJVxyLi44JBwcV/GmpnPHtLSXUcbGyyPo6KF83d3onHR0PiEfH5bdS0th3L29DYaLiw+FiorgkHBwfEI+PnHEtbXMqmZmkNhISAYFAwP3Afb2HBIODsKjYWFqXzU1rvlXV2nQubkXkYaGmVjBwTonHR0nuZ6e2Tjh4esT+Pgrs5iYIjMREdK7aWmpcNnZB4mOjjOnlJQttpubPCIeHhWSh4fJIOnph0nOzqr/VVVQeCgopXrf3wOPjIxZ+KGhCYCJiRoXDQ1l2r+/1zHm5oTGQkLQuGhogsNBQSmwmZlady0tHhEPD3vLsLCo/FRUbda7uyw6FhZSUlJSCQkJCWpqamrV1dXVMDAwMDY2NjalpaWlODg4OL+/v79AQEBAo6Ojo56enp6BgYGB8/Pz89fX19f7+/v7fHx8fOPj4+M5OTk5goKCgpubm5svLy8v/////4eHh4c0NDQ0jo6OjkNDQ0NERERExMTExN7e3t7p6enpy8vLy1RUVFR7e3t7lJSUlDIyMjKmpqamwsLCwiMjIyM9PT097u7u7kxMTEyVlZWVCwsLC0JCQkL6+vr6w8PDw05OTk4ICAgILi4uLqGhoaFmZmZmKCgoKNnZ2dkkJCQksrKysnZ2dnZbW1tboqKioklJSUltbW1ti4uLi9HR0dElJSUlcnJycvj4+Pj29vb2ZGRkZIaGhoZoaGhomJiYmBYWFhbU1NTUpKSkpFxcXFzMzMzMXV1dXWVlZWW2tra2kpKSkmxsbGxwcHBwSEhISFBQUFD9/f397e3t7bm5ubna2traXl5eXhUVFRVGRkZGV1dXV6enp6eNjY2NnZ2dnYSEhISQkJCQ2NjY2Kurq6sAAAAAjIyMjLy8vLzT09PTCgoKCvf39/fk5OTkWFhYWAUFBQW4uLi4s7Ozs0VFRUUGBgYG0NDQ0CwsLCweHh4ej4+Pj8rKyso/Pz8/Dw8PDwICAgLBwcHBr6+vr729vb0DAwMDAQEBARMTExOKioqKa2trazo6OjqRkZGREREREUFBQUFPT09PZ2dnZ9zc3Nzq6urql5eXl/Ly8vLPz8/Pzs7OzvDw8PC0tLS05ubm5nNzc3OWlpaWrKysrHR0dHQiIiIi5+fn562tra01NTU1hYWFheLi4uL5+fn5Nzc3N+jo6OgcHBwcdXV1dd/f399ubm5uR0dHR/Hx8fEaGhoacXFxcR0dHR0pKSkpxcXFxYmJiYlvb29vt7e3t2JiYmIODg4OqqqqqhgYGBi+vr6+GxsbG/z8/PxWVlZWPj4+PktLS0vGxsbG0tLS0nl5eXkgICAgmpqamtvb29vAwMDA/v7+/nh4eHjNzc3NWlpaWvT09PQfHx8f3d3d3aioqKgzMzMziIiIiAcHBwfHx8fHMTExMbGxsbESEhISEBAQEFlZWVknJycngICAgOzs7OxfX19fYGBgYFFRUVF/f39/qampqRkZGRm1tbW1SkpKSg0NDQ0tLS0t5eXl5Xp6enqfn5+fk5OTk8nJycmcnJyc7+/v76CgoKDg4ODgOzs7O01NTU2urq6uKioqKvX19fWwsLCwyMjIyOvr6+u7u7u7PDw8PIODg4NTU1NTmZmZmWFhYWEXFxcXKysrKwQEBAR+fn5+urq6und3d3fW1tbWJiYmJuHh4eFpaWlpFBQUFGNjY2NVVVVVISEhIQwMDAx9fX19EQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AAAAAAAAAAAASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAAAAAAD/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAOg9AADSPQAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAFAAAAAQAAAPJDAAACAAAABgAAAAMAAAABAAAABAAAAAcAAAABAAAAAgAAAPgyAAAFAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAD1vAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDMAAAUAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAAAmE4AAAAEAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAr/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAtPmZzX2NvdW50ID09IDEAanNlbXUuYwBpbml0X3ZtX2ZzAHAtPmRyaXZlX2NvdW50ID09IDEAaW5pdF92bV9kcml2ZQBwLT5ldGhfY291bnQgPT0gMQBpbml0X3ZtAHNoaWZ0ID49IDAALi9zb2Z0ZnBfdGVtcGxhdGUuaABub3JtYWxpemVfc2YzMgBub3JtYWxpemUyX3NmMzIAbm9ybWFsaXplX3NmNjQAbm9ybWFsaXplMl9zZjY0AGExIDwgYgBkaXZyZW1fdTY0AHZpcnRpb18lMDR4AHdyaXRlX3NpemUgPj0gMQB2aXJ0aW8uYwB2aXJ0aW9fYmxvY2tfcmVjdl9yZXF1ZXN0AHZpcnRpb190YWJsZXQAdmlydGlvX21vdXNlAHZpcnRpb19rZXlib2FyZAB3d2RkZGRkZHcAd3cAd3N3d3cAUXcAd3NzdwBRAHdzd3d3dwB3AHMAd2QAZFF3d3dkZGRkZGRkZGRkZGRkZGQAd3d3d3dkZGRkZAB3ZHcAd2J3ZGR3cwBiAHdiZGR3cwBiZGR3cwB3d3MAd3N3dwB3c3dzAHdzdwB3cwA5UDIwMDAuTAB3d3NzdwBoAHd3aAA5cDogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlkPSVkCgBidWYgKyAxIDw9IGJ1Zl9lbmQAbWFyc2hhbGwAYnVmICsgMiA8PSBidWZfZW5kAGJ1ZiArIDQgPD0gYnVmX2VuZABidWYgKyA4IDw9IGJ1Zl9lbmQAbGVuIDw9IDY1NTM1AGJ1ZiArIDIgKyBsZW4gPD0gYnVmX2VuZABidWYgKyAxMyA8PSBidWZfZW5kAG4tPnR5cGUgPT0gRlRfRElSAGZzX25ldC5jAGlub2RlX2Rpcl9hZGQALi4Abi0+cmVmY291bnQgPj0gMQBpbm9kZV9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA9PSAwAGZsdXNoX2RpcgBuLT5yZWZjb3VudCA9PSAwAGlub2RlX2ZyZWUAbi0+b3Blbl9jb3VudCA9PSAwAGZzLT5mc19ibG9ja3MgPj0gMABmcy0+aW5vZGVfY2FjaGVfc2l6ZSA+PSAwAG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0FESU5HAGZzX3dnZXRfc2V0X2Vycm9yAGxpc3RfZW1wdHkoJm4tPnUuZGlyLmRlX2xpc3QpAGZzLT5pbm9kZV9jb3VudCA+PSAwAGJ1LT5yZWZfY291bnQgPj0gMQBmc19iYXNlX3VybF9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA+PSAwAGlub2RlX2RpcmVudF9kZWxldGVfbm9fZGVjcmVmAHhocgAhZnMtPmZzX2F0dGFjaChmcywgJnJvb3RfZmQsICZxaWQsIHVpZCwgIiIsICIiKQBmc19jbWRfeGhyAG4tPnR5cGUgPT0gRlRfUkVHICYmIG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0NBTABzZXRfYmFzZV91cmwAcmVzZXRfYmFzZV91cmwAZnNfaXNfbmV0KGZzMSkAZnNfbmV0X3Jlc2V0X2Jhc2VfdXJsAHNldF91cmwAZXhwb3J0X2ZpbGUAcGJrZGYyAHNldF9pbXBvcnRfZGlyAHVua25vd24gY29tbWFuZDogJyVzJwoAZnNfd3JpdGUAZnNfdHJ1bmNhdGUAZnNfbmV0X3NldF91cmwAZnNfbmV0X3NldF9iYXNlX3VybABuLT5vcGVuX2NvdW50ID49IDEAaW5vZGVfZGVjX29wZW4Abi0+dS5yZWcuc3RhdGUgPT0gUkVHX1NUQVRFX1VOTE9BREVEAGZzX29wZW5fd2dldABuLT51LnJlZy5zdGF0ZSA9PSBSRUdfU1RBVEVfTE9BREVEAGZzX3RyaW1fY2FjaGUAZnNfd2dldF9zZXRfbG9hZGVkAGxpc3RfZW1wdHkoJmZzLT5pbm9kZV9jYWNoZV9saXN0KQBmc19tZW1fZW5kAC90bXAAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAwLCAiIiwgIiIpAGZzX2NyZWF0ZV9jbWQALmZzY21kACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCByb290X2ZkLCBGU0NNRF9OQU1FLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjY2LCAwKQAhZnMtPmZzX2F0dGFjaChmcywgJnMtPnJvb3RfZmQsICZxaWQsIDAsICIiLCAiIikAZnNfaW5pdGlhbF9zeW5jAGhlYWQ/bm9jYWNoZT0lbGxkAC5oZWFkACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBoZWFkX2ZkLCAiLmhlYWQiLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjQ0LCAwKQBjb3VsZCBub3QgbG9hZCAnaGVhZCcgZmlsZSAoSFRUUCBlcnJvcj0lZCkAaW52YWxpZCBoZWFkIHZlcnNpb24AUm9vdElEAGV4cGVjdGVkIFJvb3RJRCB0YWcARlNNYXhTaXplAGZzX25ldF9zZXRfZnNfbWF4X3NpemUAZmlsZXMALwAuZmlsZWxpc3QudHh0ACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBuZXdfZmlsZWxpc3RfZmQsICIuZmlsZWxpc3QudHh0IiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDY0NCwgMCkAaGVhZF9sb2FkZWQAY291bGQgbm90IGxvYWQgZmlsZSBsaXN0IChIVFRQIGVycm9yPSVkKQBlcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgbGlzdAAucHJlbG9hZDIvcHJlbG9hZC50eHQALnByZWxvYWQAaW52YWxpZCBmaWxlbmFtZQoAaW52YWxpZCBwcmVsb2FkIGZpbGU6ICclcycKAGZpbGVuYW1lIHdpdGhvdXQgdGFyZ2V0OiAlcwoAaW52YWxpZCBzaXplCgBpbnZhbGlkIGZpbGUgaWQKAGludmFsaWQgbW9kZQoAaW52YWxpZCB1aWQKAGludmFsaWQgZ2lkCgBpbnZhbGlkIG1ham9yCgBpbnZhbGlkIG1pbm9yCgBpbnZhbGlkIG10aW1lCgBpbnZhbGlkIHN5bWxpbmsgbmFtZQoARXJyb3I6IABmc19pc19uZXQoZnMpAGZzX25ldF9zZXRfcHdkAC5mc2NtZF9wd2QAIWZzLT5mc19jcmVhdGUoZnMsICZxaWQsIHJvb3RfZmQsICIuZnNjbWRfcHdkIiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDYwMCwgMCkAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAxMDAwLCAiIiwgIiIpAGZzX2ltcG9ydF9maWxlAFBPU1QAR0VUAHNhbHRfbGVuIDw9IFNBTFRfTEVOX01BWABmc193Z2V0LmMAcGJrZGYyX2htYWNfc2hhMjU2APui6QElMDE2bGx4AAoKAFZlcnNpb24AaHR0cDoAaHR0cHM6AGZpbGU6AGlycV9udW0gPCA0AHBjaS5jAHBjaV9kZXZpY2VfZ2V0X2lycQBiYXJfbnVtIDwgUENJX05VTV9SRUdJT05TAHBjaV9yZWdpc3Rlcl9iYXIAKHNpemUgJiAoc2l6ZSAtIDEpKSA9PSAwAHNpemUgPj0gNAByLT5zaXplID09IDAAdW5leHBlY3RlZCBlbmQgb2YgZmlsZQBJbnZhbGlkIHByb3BlcnR5IG5hbWUAJzonIGV4cGVjdGVkAGV4cGVjdGluZyAnLCcgb3IgJ30nAGV4cGVjdGluZyAnLCcgb3IgJ10nAG51bGwAdHJ1ZQBmYWxzZQB1bmtub3duIGlkZW50aWZpZXI6ICclcycAdW5leHBlY3RlZCBjaGFyYWN0ZXIAdW50ZXJtaW5hdGVkIHN0cmluZwBpbnZhbGlnIGhleCBkaWdpdAB1bmtub3duIGVzY2FwZSBjb2RlAHN0cmluZyB0b28gbG9uZwB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgYXQgdGhlIGVuZABDb3VsZCBub3QgbG9hZCBibG9jayBkZXZpY2UgZmlsZSAoZXJyPSVkKQoAYmxvY2tfc2l6ZQBpbnZhbGlkIGJsb2NrX3NpemUKAG5fYmxvY2sAaW52YWxpZCBuX2Jsb2NrCgBwcmVmZXRjaF9ncm91cF9sZW4AcHJlZmV0Y2hfZ3JvdXBfbGVuIGlzIHRvbyBsYXJnZQBwcmVmZXRjaABleHBlY3RpbmcgYW4gYXJyYXkKAGV4cGVjdGluZyBhbiBpbnRlZ2VyCgAlc2JsayUwOXUuYmluACVzZ3JwJTA5dS5iaW4AQ291bGQgbm90IGxvYWQgZ3JvdXAgJXUKAHNpemUgPT0gYmxvY2tfYnl0ZXMgKiByZXEtPm5fYmxvY2tfbnVtAGJsb2NrX25ldC5jAGJmX3ByZWZldGNoX2dyb3VwX29ubG9hZABiLT5zdGF0ZSA9PSBDQkxPQ0tfTE9BRElORwBiZl91cGRhdGVfYmxvY2sAQ291bGQgbm90IGxvYWQgYmxvY2sgJXUKAHNpemUgPT0gYmYtPmJsb2NrX3NpemUgKiA1MTIAYmZfcmVhZF9vbmxvYWQAcy0+bl9waHlzX21lbV9yYW5nZSA8IFBIWVNfTUVNX1JBTkdFX01BWABpb21lbS5jAHJlZ2lzdGVyX3JhbV9lbnRyeQAoc2l6ZSAmIChERVZSQU1fUEFHRV9TSVpFIC0gMSkpID09IDAgJiYgc2l6ZSAhPSAwAENvdWxkIG5vdCBhbGxvY2F0ZSBWTSBtZW1vcnkKAGNwdV9yZWdpc3Rlcl9kZXZpY2UAc2l6ZSA8PSAweGZmZmZmZmZmAHJpc2N2MzIscmlzY3Y2NCxyaXNjdjEyOAByaXNjdjMyAHJpc2N2NjQAcmlzY3YxMjgAdW5zdXBwb3J0ZWQgbWFjaGluZTogJXMKAHVuc3VwcG9ydGVkIG1heF94bGVuPSVkCgBzaW1wbGVmYgB1bnN1cHBvcnRlZCBkaXNwbGF5IGRldmljZTogJXMKAHZpcnRpbwB1bnN1cHBvcnRlZCBpbnB1dCBkZXZpY2U6ICVzCgBObyBiaW9zIGZvdW5kAEJJT1MgdG9vIGJpZwoAa2VybmVsIHRvbyBiaWcAaW5pdHJkIHRvbyBiaWcAI2FkZHJlc3MtY2VsbHMAI3NpemUtY2VsbHMAY29tcGF0aWJsZQB1Y2JiYXIscmlzY3ZlbXUtYmFyX2RldgBtb2RlbAB1Y2JiYXIscmlzY3ZlbXUtYmFyZQBjcHVzAHRpbWViYXNlLWZyZXF1ZW5jeQBjcHUAZGV2aWNlX3R5cGUAcmVnAHN0YXR1cwBva2F5AHJpc2N2AHJ2JWQAcmlzY3YsaXNhAHJpc2N2LHN2MzIAcmlzY3Ysc3Y0OABtbXUtdHlwZQBjbG9jay1mcmVxdWVuY3kAaW50ZXJydXB0LWNvbnRyb2xsZXIAI2ludGVycnVwdC1jZWxscwByaXNjdixjcHUtaW50YwBwaGFuZGxlAG1lbW9yeQBodGlmAHVjYixodGlmMAB1Y2JiYXIscmlzY3ZlbXUtYmFyLXNvYwBzaW1wbGUtYnVzAHJhbmdlcwBjbGludAByaXNjdixjbGludDAAaW50ZXJydXB0cy1leHRlbmRlZABwbGljAHJpc2N2LHBsaWMwAHJpc2N2LG5kZXYAdmlydGlvLG1taW8AZnJhbWVidWZmZXIAc2ltcGxlLWZyYW1lYnVmZmVyAHN0cmlkZQBmb3JtYXQAYThyOGc4YjgAY2hvc2VuAGJvb3RhcmdzAHJpc2N2LGtlcm5lbC1zdGFydAByaXNjdixrZXJuZWwtZW5kAGxpbnV4LGluaXRyZC1zdGFydABsaW51eCxpbml0cmQtZW5kAHMtPm9wZW5fbm9kZV9jb3VudCA9PSAwAHJpc2N2X21hY2hpbmUuYwBmZHRfb3V0cHV0ACVzQCVsbHgAc2l6ZV9sb2cyID09IDIAaHRpZl93cml0ZQAKUG93ZXIgb2ZmLgBIVElGOiB1bnN1cHBvcnRlZCB0b2hvc3Q9MHglMDE2bGx4CgBodGlmX3JlYWQAcGxpY193cml0ZQBwbGljX3JlYWQAY2xpbnRfd3JpdGUAY2xpbnRfcmVhZABleHBlY3RpbmcgJyVzJyBwcm9wZXJ0eQoAJXM6IGludGVnZXIgZXhwZWN0ZWQKAEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlsZQoAZXJyb3I6ICVzCgB2ZXJzaW9uAFRoZSBlbXVsYXRvciBpcyB0b28gb2xkIHRvIHJ1biB0aGlzIFZNOiBwbGVhc2UgdXBncmFkZQoAVGhlIFZNIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gb2xkIGZvciB0aGlzIGVtdWxhdG9yIHZlcnNpb246IHBsZWFzZSB1cGdyYWRlIHRoZSBWTSBjb25maWd1cmF0aW9uIGZpbGUKAG1hY2hpbmUAJXM6IHN0cmluZyBleHBlY3RlZAoAVW5rbm93biBtYWNoaW5lIG5hbWU6ICVzCgBtZW1vcnlfc2l6ZQBiaW9zAGtlcm5lbABpbml0cmQAY21kbGluZQBUWgBVVEMlYyUwMmQ6JTAyZABkcml2ZSVkAFRvbyBtYW55IGRyaXZlcwoAZmlsZQBkZXZpY2UAZnMlZABUb28gbWFueSBmaWxlc3lzdGVtcwoAdGFnAC9kZXYvcm9vdAAvZGV2L3Jvb3QlZABldGglZABUb28gbWFueSBldGhlcm5ldCBpbnRlcmZhY2VzCgBkcml2ZXIAdGFwAGlmbmFtZQBkaXNwbGF5MAB3aWR0aABoZWlnaHQAdmdhX2Jpb3MAaW5wdXRfZGV2aWNlAGFjY2VsAG5vbmUAYXV0bwB1bnN1cHBvcnRlZCAnYWNjZWwnIGNvbmZpZzogJXMKAHJ0Y19sb2NhbF90aW1lACVzOiBib29sZWFuIGV4cGVjdGVkCgAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgAAAQIEBwMGBQ==";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}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!")}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 SYSCALLS={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}),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 ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{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 _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}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};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,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/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){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)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}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{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("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=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;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,1e3/fps);else _emscripten_set_main_loop_timing(1,1);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++}),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);_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}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("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"]=[];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}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){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){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);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;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);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);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&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});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&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){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{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}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)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);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){err("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){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){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(){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()}}),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){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;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}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);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(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);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_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_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()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}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}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("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)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16){var sp=stackSave();try{return Module["dynCall_iiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["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_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_iiiiiiiiiiiiiiiii":invoke_iiiiiiiiiiiiiiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"__exit":__exit,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_emscripten_set_main_loop":_emscripten_set_main_loop,"_emscripten_set_main_loop_timing":_emscripten_set_main_loop_timing,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_get_new_handle":_file_buffer_get_new_handle,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"_tzset":_tzset,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM +var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) { +"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iii;var Y=env.invoke_iiii;var Z=env.invoke_iiiii;var _=env.invoke_iiiiii;var $=env.invoke_iiiiiii;var aa=env.invoke_iiiiiiii;var ba=env.invoke_iiiiiiiii;var ca=env.invoke_iiiiiiiiiiiiiiiii;var da=env.invoke_vi;var ea=env.invoke_vii;var fa=env.invoke_viii;var ga=env.invoke_viiii;var ha=env.invoke_viiiii;var ia=env.invoke_viiiiii;var ja=env.___assert_fail;var ka=env.___buildEnvironment;var la=env.___setErrNo;var ma=env.___syscall140;var na=env.___syscall146;var oa=env.___syscall54;var pa=env.___syscall6;var qa=env.__exit;var ra=env._abort;var sa=env._clock_gettime;var ta=env._console_get_size;var ua=env._console_write;var va=env._emscripten_async_call;var wa=env._emscripten_async_wget3_data;var xa=env._emscripten_get_now;var ya=env._emscripten_get_now_is_monotonic;var za=env._emscripten_memcpy_big;var Aa=env._emscripten_random;var Ba=env._emscripten_set_main_loop;var Ca=env._emscripten_set_main_loop_timing;var Da=env._exit;var Ea=env._fb_refresh;var Fa=env._file_buffer_get_new_handle;var Ga=env._file_buffer_init;var Ha=env._file_buffer_read;var Ia=env._file_buffer_reset;var Ja=env._file_buffer_resize;var Ka=env._file_buffer_set;var La=env._file_buffer_write;var Ma=env._fs_export_file;var Na=env._fs_wget_update_downloading;var Oa=env._gettimeofday;var Pa=env._localtime_r;var Qa=env._net_recv_packet;var Ra=env._time;var Sa=env._tzset;var Ta=env.flush_NO_FILESYSTEM;var Ua=0.0; +// EMSCRIPTEN_START_FUNCS +function ib(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function jb(){return l|0}function kb(a){a=a|0;l=a}function lb(a,b){a=a|0;b=b|0;l=a;m=b}function mb(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function nb(a){a=a|0;y=a}function ob(){return y|0}function pb(b){b=b|0;var d=0,e=0;d=c[6958]|0;if(d>>>0>=1024)return;e=c[6959]|0;a[19088+e>>0]=b;b=e+1|0;c[6959]=(b|0)==1024?0:b;c[6958]=d+1;return}function qb(a,b){a=a|0;b=b|0;var d=0;d=c[6960]|0;if(!d)return;eb[c[(c[d>>2]|0)+32>>2]&15](d,a,b&65535);return}function rb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[6960]|0;if(!e)return;Va[c[(c[e>>2]|0)+24>>2]&15](e)|0;g=c[6961]|0;h=g+-1|0;e=c[6962]|0;f=e+-1|0;a=(((h|0)>(a|0)?a:h)<<15|0)/(g|0)|0;e=(((f|0)>(b|0)?b:f)<<15|0)/(e|0)|0;c[6963]=a;c[6964]=e;c[6965]=d;b=c[6960]|0;gb[c[(c[b>>2]|0)+28>>2]&7](b,a,e,0,d);return}function sb(a){a=a|0;var b=0;b=c[6960]|0;if(!b)return;gb[c[(c[b>>2]|0)+28>>2]&7](b,c[6963]|0,c[6964]|0,a,c[6965]|0);return}function tb(a,b){a=a|0;b=b|0;var d=0;d=c[(c[6960]|0)+4>>2]|0;if(!d)return;eb[c[d+24>>2]&15](d,a,b);return}function ub(a){a=a|0;var b=0;c[6966]=a;b=c[6960]|0;if(!b)return;b=c[b+4>>2]|0;if(!b)return;db[c[b+28>>2]&15](b,a);return}function vb(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=lf(20)|0;c[i+4>>2]=b;c[i+8>>2]=Ah(d)|0;if(e|0)c[i+16>>2]=Ah(e)|0;c[6961]=f;c[6962]=g;c[i+12>>2]=h;h=lf(248)|0;c[i>>2]=h;zg(h);qg(c[i>>2]|0,a,4,i);return}function wb(a){a=a|0;var b=0,d=0,e=0;e=c[a>>2]|0;b=c[e+164>>2]|0;if((b|0)>0){if((b|0)!=1)ja(13668,13685,207,13693);d=Ld(c[e+108>>2]|0,5,a)|0;c[e+112>>2]=d;b=c[a+16>>2]|0;if(!b)return;Sd(d,b);return}b=c[e+96>>2]|0;if((b|0)<=0){Ab(a);return}if((b|0)!=1)ja(13704,13685,224,13724);c[e+56>>2]=Se(c[e+52>>2]|0,131072,6,a)|0;return}function xb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+144|0;d=h;e=h+132|0;f=h+128|0;g=a+8|0;b=c[g>>2]|0;if(b|0?Jc(b)|0:0){b=Kc(c[g>>2]|0)|0;i=c[a+12>>2]|0;b=Xa[c[i+8>>2]&31](c[i>>2]|0,d,(b|0)<128?b:128)|0;if((b|0)>0)Lc(c[g>>2]|0,d,b)|0;if(c[6967]|0){ta(e|0,f|0);Mc(c[g>>2]|0,c[e>>2]|0,c[f>>2]|0);c[6967]=0}}b=c[a+16>>2]|0;if(b|0)eb[c[b+24>>2]&15](b,1,0);if(!(Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0)){b=0;while(1){db[c[(c[a>>2]|0)+20>>2]&15](a,2e5);d=Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0;if(b>>>0>13|(d|0)!=0)break;else b=b+1|0}if(!d){va(7,a|0,0);l=h;return}}va(7,a|0,10);l=h;return}function yb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[a+8>>2]|0;Ea(b|0,(c[a+12>>2]|0)+(N(h,e)|0)+(d<<2)|0,d|0,e|0,f|0,g|0,h|0);return}function zb(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;d=c[b+96>>2]|0;if((d|0)<=0){Ab(a);return}if((d|0)!=1)ja(13704,13685,224,13724);c[b+56>>2]=Se(c[b+52>>2]|0,131072,6,a)|0;return}function Ab(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b>>2]|0;c[g+24>>2]=1;d=c[b+4>>2]<<20;h=g+16|0;c[h>>2]=d;c[h+4>>2]=((d|0)<0)<<31>>31;h=b+8|0;d=c[h>>2]|0;if(d|0?a[d>>0]|0:0)wg(c[b>>2]|0,d);e=c[6961]|0;d=c[6962]|0;if((e|0)>0&(d|0)>0){f=g+32|0;if(!(c[f>>2]|0)){c[f>>2]=Ah(17494)|0;e=c[6961]|0;d=c[6962]|0}c[g+36>>2]=e;c[g+40>>2]=d}else{c[6967]=1;f=lf(12)|0;c[f+4>>2]=3;c[f+8>>2]=5;c[g+44>>2]=f}e=g+180|0;d=c[e>>2]|0;do if((d|0)>0)if(c[b+12>>2]|0)if((d|0)==1){f=lf(32)|0;a[f>>0]=2;a[f+1>>0]=~~(+Aa()*256.0);a[f+2>>0]=~~(+Aa()*256.0);a[f+3>>0]=~~(+Aa()*256.0);a[f+4>>0]=~~(+Aa()*256.0);a[f+5>>0]=~~(+Aa()*256.0);c[f+8>>2]=4;c[f+12>>2]=0;c[g+176>>2]=f;break}else ja(13738,13685,269,13756);else{d=0;do{Bg(c[g+168+(d*12|0)+4>>2]|0);Bg(c[g+168+(d*12|0)>>2]|0);d=d+1|0}while((d|0)<(c[e>>2]|0));c[e>>2]=0;break}while(0);f=yg(g)|0;c[6960]=f;xg(c[b>>2]|0);d=c[f+4>>2]|0;if(d|0)db[c[d+28>>2]&15](d,c[6966]|0);Bg(c[b>>2]|0);Bg(c[h>>2]|0);d=b+16|0;e=c[d>>2]|0;if(!e){Bg(b);va(7,f|0,0);return}si(e|0,0,Pg(e)|0)|0;Bg(c[d>>2]|0);Bg(b);va(7,f|0,0);return}function Bb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[6958]|0;a=(e|0)>(d|0)?d:e;c[6958]=e-a;if(!a){b=0;return b|0}e=0;d=c[6968]|0;do{f=1024-d|0;f=(a|0)<(f|0)?a:f;ri(b+e|0,19088+d|0,f|0)|0;a=a-f|0;e=f+e|0;f=f+d|0;d=(f|0)==1024?0:f}while((a|0)!=0);c[6968]=d;f=e;return f|0}function Cb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=(a&2147483647)>>>0<(b&2147483647)>>>0;i=f?a:b;b=f?b:a;f=b>>>31;k=i>>>31;g=b>>>23;j=i>>>23&255;a=b<<3&67108856;h=i<<3&67108856;switch((g&255)<<24>>24){case -1:{if(!a){if((f|0)==(k|0)|(j|0)!=255){e=b;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(b&4194304|0?(i&8388607|0)==0|(i&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{i=a;g=1;break}default:{i=a|67108864;g=g&255}}b=(j|0)==0;a=b?h:h|67108864;b=g-(b?1:j)|0;do if(b)if((b|0)>31){a=(a|0)!=0&1;break}else{a=a>>>b|((1<<b)+134217727&a|0)!=0;break}while(0);if((f|0)==(k|0))a=a+i|0;else{a=i-a|0;f=(a|0)==0?(d|0)==2&1:f}b=Q(a|0)|0;if(!b)ja(13764,13775,183,13795);e=Db(f,g+4+(1-b)|0,a<<b+-1,d,e)|0;return e|0}function Db(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;switch(e|0){case 4:case 0:{j=64;break}case 1:{j=0;break}default:j=(e&1|0)==(a|0)?0:127}if((b|0)<1){h=(b|0)!=0|(j+d|0)>-1;b=1-b|0;do if(b)if((b|0)>31){d=(d|0)!=0&1;break}else{d=d>>>b|((1<<b)+-1&d|0)!=0;break}while(0);g=d&127;if(h&(g|0)!=0){i=c[f>>2]|2;c[f>>2]=i;h=d;b=1;d=i;i=14}else{b=1;i=12}}else{g=d&127;i=12}if((i|0)==12)if(!g)g=0;else{h=d;d=c[f>>2]|0;i=14}if((i|0)==14){c[f>>2]=d|1;d=h}d=(d+j|0)>>>7;d=(e|0)==0&(g|0)==64?d&33554430:d;g=(d>>>24)+b|0;if(d>>>0<8388608){f=0;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}b=(j|0)==0;if((g|0)<=254){f=g;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}c[f>>2]=c[f>>2]|5;f=b?254:255;j=b?8388607:0;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}function Eb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Cb(a,b^-2147483648,c,d)|0}function Fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=b^a;n=m>>>31;h=a>>>23&255;g=b>>>23&255;i=a&8388607;l=b&8388607;j=(h|0)==255;k=(g|0)==255;if(j|k){f=(i|0)!=0;if(!((a&2139095040|0)==2139095040&f)?(l|0)==0|(b&2139095040|0)!=2139095040:0){if(!(j&(g|l|0)==0)?!((h|i|0)==0&k):0){e=m&-2147483648|2139095040;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(!((a&2143289344|0)==2139095040&f)?(l|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}do if(!h){if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break}e=m&-2147483648;return e|0}else a=i|8388608;while(0);do if(!g){if(l|0){g=Q(l|0)|0;f=l<<g+-8;g=9-g|0;break}e=m&-2147483648;return e|0}else f=l|8388608;while(0);f=ki(f<<8|0,0,a<<7|0,0)|0;f=(f|0)!=0|y;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);e=Db(n,h+-126+g+(1-a)|0,f<<a+-1,d,e)|0;return e|0}function Gb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=d>>>31;o=b^a;j=o>>>31;i=a>>>23&255;h=b>>>23&255;g=d>>>23&255;k=a&8388607;q=b&8388607;r=d&8388607;l=(i|0)==255;m=(h|0)==255;p=l|m;n=(g|0)==255;if(p|n){g=(k|0)!=0;if((!((a&2139095040|0)==2139095040&g)?(q|0)==0|(b&2139095040|0)!=2139095040:0)?(r|0)==0|(d&2139095040|0)!=2139095040:0){if((!(l&(h|q|0)==0)?!((i|k|0)==0&m):0)?(j|0)==(s|0)|p&n^1:0)if(n){f=d&-2147483648|2139095040;return f|0}else{f=o&-2147483648|2139095040;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}if((!((a&2143289344|0)==2139095040&g)?(q|0)==0|(b&2143289344|0)!=2139095040:0)?(r|0)==0|(d&2143289344|0)!=2139095040:0){f=2143289344;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}do if(!i)if(!k){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{i=Q(k|0)|0;b=k<<i+-8;i=9-i|0;break}else b=k|8388608;while(0);do if(!h)if(!q){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{h=Q(q|0)|0;a=q<<h+-8;h=9-h|0;break}else a=q|8388608;while(0);q=ki(a<<7|0,0,b<<7|0,0)|0;m=y;n=m>>>0<536870912;d=oi(m|0,0,1)|0;b=q<<(n&1);m=n?q>>>31|d:m;n=h+i+(n?-126:-125)|0;do if(!g){if(r|0){g=Q(r|0)|0;h=r<<g+-8;g=9-g|0;break}g=m|(b|0)!=0;t=Q(g|0)|0;a=t+-1|0;if(!t)ja(13764,13775,183,13795);f=Db(j,n-a|0,g<<a,e,f)|0;return f|0}else h=r|8388608;while(0);a=g+1|0;h=h<<6;if((n|0)>(a|0)){l=s;k=0;g=h;o=n;i=m}else{r=(n|0)!=(a|0)|m>>>0<h>>>0;l=r?j:s;k=r?b:0;g=r?m:h;j=r?s:j;o=r?a:n;i=r?h:m;b=r?0:b;a=r?n:a}h=o-a|0;a:do if((h|0)>63){a=(k|g|0)!=0&1;g=0}else{if((h|0)>32){a=h+-32|0;a=g>>>a|((1<<a)+-1&g|0)!=0;g=0;break}switch(h|0){case 0:{a=k;break a}case 32:{a=g|(k|0)!=0;g=0;break a}default:{a=g<<32-h|k>>>h|((1<<h)+-1&k|0)!=0;g=g>>>h;break a}}}while(0);if((j|0)==(l|0)){s=a+b|0;b=g+i+(s>>>0<a>>>0&1)|0;i=s}else{s=b-a|0;r=i-g+((s>>>0>b>>>0)<<31>>31)|0;b=r;i=s;j=(r|s|0)==0?(e|0)==2&1:j}if(!b){a=Q(i|0)|0;h=a+31|0;g=o-h|0;if((a+32|0)>>>0<33){a=32;t=50}else a=i<<a+-1}else{a=Q(b|0)|0;h=a+-1|0;if(!a)ja(13764,13775,201,13810);g=o-h|0;if(!h)a=b|(i|0)!=0;else t=50}if((t|0)==50)a=i>>>(33-a|0)|b<<h|(i<<h|0)!=0;f=Db(j,g,a,e,f)|0;return f|0}function Hb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=b^a;m=l>>>31;g=a>>>23&255;f=b>>>23;h=f&255;k=a&8388607;i=b&8388607;if((g|0)==255){f=(k|0)==0;if(f)if((i|0)==0|(b&2139095040|0)!=2139095040)if((h|0)==255){c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}else{e=l&-2147483648|2139095040;return e|0}else j=5;else if(f|(a&2143289344|0)!=2139095040)j=5;if((j|0)==5?(i|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}a:do switch((f&255)<<24>>24){case -1:{if(!i){e=l&-2147483648;return e|0}if(!((a&2143289344|0)==2139095040&(k|0)!=0|(b&2143289344|0)==2139095040)){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break a}f=c[e>>2]|0;if(!(g|k)){c[e>>2]=f|16;e=2143289344;return e|0}else{c[e>>2]=f|8;e=l&-2147483648|2139095040;return e|0}}default:a=i|8388608}while(0);do if(!g){if(k|0){f=Q(k|0)|0;g=9-f|0;f=k<<f+-8;break}e=l&-2147483648;return e|0}else f=k|8388608;while(0);l=a<<2;a=li(0,f|0,l|0,0)|0;l=ki(a|0,y|0,l|0,0)|0;f=fi(0,f|0,l|0,y|0)|0;a=((f|0)!=0|(y|0)!=0)&1|a;f=Q(a|0)|0;if(!f)ja(13764,13775,183,13795);e=Db(m,127-h+g+(1-f)|0,a<<f+-1,d,e)|0;return e|0}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=a>>>31;f=a>>>23&255;g=a&8388607;do if((f|0)==255){if(!g){if(e)break;return a|0}if((a&2143289344|0)!=2139095040){d=2143289344;return d|0}c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}else{if(e|0){if(f|g)break;return a|0}do if(!f)if(!g){d=0;return d|0}else{e=Q(g|0)|0;a=9-e|0;e=g<<e+-8;break}else{a=f;e=g|8388608}while(0);i=a+-127|0;h=(i&1|0)==0;i=((h?i:a+-128|0)>>1)+127|0;a=e<<((h^1)&1)<<5;if(!a)a=0;else{e=oi(1,0,(65-(Q(a+-1|0)|0)|0)>>>1|0)|0;f=y;while(1){g=li(0,a|0,e|0,f|0)|0;g=ei(g|0,y|0,e|0,f|0)|0;g=ni(g|0,y|0,1)|0;h=y;if(h>>>0<f>>>0|(h|0)==(f|0)&g>>>0<e>>>0){e=g;f=h}else break}h=ki(e|0,f|0,e|0,f|0)|0;a=(0!=(h|0)|(a|0)!=(y|0))&1|e}e=Q(a|0)|0;if(!e)ja(13764,13775,183,13795);d=Db(0,i+(1-e)|0,a<<e+-1,b,d)|0;return d|0}while(0);c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?b:a;return b|0}else{b=(f|0)==0?b:a;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?a:b;return b|0}else{b=(f|0)==0?a:b;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(a&8388607|0)!=0;if(!((a&2139095040|0)==2139095040&e)?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0)return ((a|0)==(b|0)|((b|a)&2147483647|0)==0)&1|0;if(!((a&2143289344|0)==2139095040&e)?(b&8388607|0)==0|(b&2143289344|0)!=2139095040:0)return 0;c[d>>2]=c[d>>2]|16;return 0}function Mb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d|((b|a)&2147483647|0)==0;break}if(d){d=a>>>0>=b>>>0;break}else{d=a>>>0<=b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Nb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d&((b|a)&2147483647|0)!=0;break}if(d){d=a>>>0>b>>>0;break}else{d=a>>>0<b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Ob(a){a=a|0;var b=0,c=0;b=a>>>31;c=a&8388607;a:do switch((a>>>23&255)<<24>>24){case -1:if(!c){a=(b|0)==0?128:1;break a}else{a=(a>>>14&256)+256|0;break a}case 0:{a=(b|0)!=0;if(!c){a=a?8:16;break a}else{a=a?4:32;break a}}default:a=(b|0)==0?64:2}while(0);return a|0}function Pb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,0)|0}function Qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=a>>>23&255;h=a&8388607;j=(h|0)!=0&(g|0)==255?0:a>>>31;a=(g|0)==0;g=a?-149:g+-150|0;a=a?h:h|8388608;h=a<<7;i=(e|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)>-1)if((g|0)<9?(f=a<<g,f>>>0<=i>>>0):0)a=14;else a=4;else{f=0-g|0;if((g|0)<-31)f=(a|0)!=0&1;else f=h>>>f|((1<<f)+2147483647&h|0)!=0;switch(b|0){case 4:case 0:{a=64;break}case 1:{a=0;break}default:a=(j|0)==(b&1|0)?0:127}e=f&127;f=(a+f|0)>>>7;f=(b|0)==0&(e|0)==64?f&33554430:f;if(f>>>0<=i>>>0)if(!e)a=14;else{c[d>>2]=c[d>>2]|1;a=14}else a=4}if((a|0)==4){c[d>>2]=c[d>>2]|16;j=i;return j|0}else if((a|0)==14){j=(j|0)==0?f:0-f|0;return j|0}return 0}function Rb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,1)|0}function Sb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-31|0;f=(e|0)>31;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=Q(g|0)|0;d=h+-1|0;if(!h)ja(13764,13775,183,13795);else return Db(a>>>31,(f?e+126|0:157)-d|0,g<<d,b,c)|0;return 0}function Tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-31|0;f=(e|0)>31;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=Q(d|0)|0;a=g+-1|0;if(!g)ja(13764,13775,183,13795);else return Db(0,(f?e+126|0:157)-a|0,d<<a,b,c)|0;return 0}function Ub(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=b&2147483647;o=e&2147483647;o=k>>>0<o>>>0|(k|0)==(o|0)&a>>>0<d>>>0;k=o?a:d;l=o?b:e;i=o?d:a;d=o?e:b;a=ni(i|0,d|0,63)|0;o=ni(k|0,l|0,63)|0;b=ni(i|0,d|0,52)|0;n=ni(k|0,l|0,52)|0;n=n&2047;e=oi(i|0,d|0,3)|0;e=e&-8;h=y&8388607;j=oi(k|0,l|0,3)|0;j=j&-8;m=y&8388607;switch(b&2047){case 2047:{if((e|0)==0&(h|0)==0){if((a|0)==(o|0)|(n|0)!=2047){f=d;g=i;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}if(!(0==0&(d&524288|0)==0)?(k|0)==0&(l&1048575|0)==0|(0!=0|(l&2146959360|0)!=2146435072):0){f=2146959360;g=0;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}case 0:{k=1;i=e;break}default:{k=b&2047;i=e;h=h|8388608}}b=(n|0)==0;e=b?j:j;d=b?m:m|8388608;b=k-(b?1:n)|0;do if(b)if((b|0)>63){b=((e|0)!=0|(d|0)!=0)&1;d=0;break}else{m=oi(1,0,b|0)|0;m=ei(m|0,y|0,-1,16777215)|0;n=y;b=ni(e|0,d|0,b|0)|0;b=b|((m&e|0)!=0|(n&d|0)!=0)&1;d=y;break}else b=e;while(0);if((a|0)==(o|0)){d=ei(b|0,d|0,i|0,h|0)|0;b=y}else{d=fi(i|0,h|0,b|0,d|0)|0;b=y;a=(d|0)==0&(b|0)==0?(f|0)==2&1:a}e=qi(d|0,b|0,0)|0;if((e|0)<=0)ja(13764,13775,183,13826);o=oi(d|0,b|0,e+-1|0)|0;g=Vb(a,k+7+(1-e)|0,o,y,f,g)|0;f=y;y=f;return g|0}function Vb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;switch(f|0){case 4:case 0:{l=512;break}case 1:{l=0;break}default:l=(f&1|0)==(a|0)?0:1023}if((b|0)<1){i=ei(l|0,0,d|0,e|0)|0;h=y;i=(b|0)!=0|((h|0)>-1|(h|0)==-1&i>>>0>4294967295);h=1-b|0;do if(h)if((h|0)>63){d=((d|0)!=0|(e|0)!=0)&1;e=0;break}else{j=oi(1,0,h|0)|0;j=ei(j|0,y|0,-1,-1)|0;k=y;b=ni(d|0,e|0,h|0)|0;d=b|((j&d|0)!=0|(k&e|0)!=0)&1;e=y;break}while(0);h=d&1023;if(i&(h|0)!=0){j=c[g>>2]|2;c[g>>2]=j;i=1;b=0;k=14}else{i=1;b=0;k=12}}else{h=d&1023;i=b;b=((b|0)<0)<<31>>31;k=12}if((k|0)==12)if(!h)h=0;else{j=c[g>>2]|0;k=14}if((k|0)==14)c[g>>2]=j|1;k=ei(d|0,e|0,l|0,0)|0;k=ni(k|0,y|0,10)|0;d=y;f=(f|0)==0&(h|0)==512;h=f?k&-2:k;d=f?d&4194303:d;f=ni(h|0,d|0,53)|0;b=ei(f|0,y|0,i|0,b|0)|0;if(!(d>>>0<1048576|(d|0)==1048576&h>>>0<0)){e=(l|0)==0;if((b|0)>2046){c[g>>2]=c[g>>2]|5;b=e?2046:2047;d=e?1048575:0;h=e?-1:0}}else b=0;g=oi(a|0,0,63)|0;l=y;a=oi(b|0,0,52)|0;y=d&1048575|l|y;return h|g|a|0}function Wb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;f=Ub(a,b,c,d^-2147483648,e,f)|0;return f|0}function Xb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=e^b;q=ni(d^a|0,o|0,63)|0;j=ni(a|0,b|0,52)|0;j=j&2047;i=ni(d|0,e|0,52)|0;i=i&2047;n=b&1048575;p=e&1048575;k=(j|0)==2047;l=(i|0)==2047;if(k|l){h=(a|0)!=0|(n|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&h)?(m=(d|0)==0&(p|0)==0,m|(0!=0|(e&2146435072|0)!=2146435072)):0){if(!(m&(k&(i|0)==0))?!((a|0)==0&(n|0)==0&((j|0)==0&l)):0){q=o&-2147483648|2146435072;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&h)?(d|0)==0&(p|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){q=2146959360;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}do if(!j){if(!((a|0)==0&(n|0)==0)){j=qi(a|0,n|0,0)|0;a=oi(a|0,n|0,j+-11|0)|0;j=12-j|0;b=y;break}q=o&-2147483648;g=0;y=q;return g|0}else b=n|1048576;while(0);do if(!i){if(!((d|0)==0&(p|0)==0)){i=qi(d|0,p|0,0)|0;d=oi(d|0,p|0,i+-11|0)|0;i=12-i|0;h=y;break}q=o&-2147483648;g=0;y=q;return g|0}else h=p|1048576;while(0);p=oi(a|0,b|0,10)|0;e=oi(d|0,h|0,11)|0;o=ni(a|0,b|0,22)|0;h=ni(d|0,h|0,21)|0;p=p&-1024;d=e&-2048;b=ki(d|0,0,p|0,0)|0;e=y;p=ki(h|0,0,p|0,0)|0;n=y;d=ki(d|0,0,o|0,0)|0;m=y;o=ki(h|0,0,o|0,0)|0;h=y;p=ei(e|0,0,p&-1024|0,0)|0;d=ei(p|0,y|0,d&-2048|0,0)|0;p=y;n=ei(m|0,0,n|0,0)|0;n=ei(n|0,y|0,o|0,0)|0;p=ei(n|0,y|0,p|0,0)|0;ei(0,y&7|0,o|0,h|0)|0;h=y;d=p|((b&-2097152|0)!=0|(d|0)!=0)&1;b=qi(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);p=oi(d|0,h|0,b+-1|0)|0;g=Vb(q,j+-1022+i+(1-b)|0,p,y,f,g)|0;q=y;y=q;return g|0}function Yb(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=ni(f|0,g|0,63)|0;m=e^b;n=ni(d^a|0,m|0,63)|0;o=ni(a|0,b|0,52)|0;o=o&2047;l=ni(d|0,e|0,52)|0;l=l&2047;k=ni(f|0,g|0,52)|0;k=k&2047;u=b&1048575;v=e&1048575;w=g&1048575;p=(o|0)==2047;q=(l|0)==2047;t=p|q;r=(k|0)==2047;if(t|r){j=(a|0)!=0|(u|0)!=0;if((!(0==0&(b&2146435072|0)==2146435072&j)?(s=(d|0)==0&(v|0)==0,s|(0!=0|(e&2146435072|0)!=2146435072)):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146435072|0)!=2146435072):0){if((!(s&(p&(l|0)==0))?!((a|0)==0&(u|0)==0&((o|0)==0&q)):0)?(n|0)==(x|0)|t&r^1:0)if(r){h=g&-2147483648|2146435072;i=0;y=h;return i|0}else{h=m&-2147483648|2146435072;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}if((!(0==0&(b&2146959360|0)==2146435072&j)?(d|0)==0&(v|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146959360|0)!=2146435072):0){h=2146959360;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}do if(!o)if((a|0)==0&(u|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=oi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{o=qi(a|0,u|0,0)|0;a=oi(a|0,u|0,o+-11|0)|0;o=12-o|0;b=y;break}else b=u|1048576;while(0);do if(!l)if((d|0)==0&(v|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=oi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{l=qi(d|0,v|0,0)|0;d=oi(d|0,v|0,l+-11|0)|0;l=12-l|0;j=y;break}else j=v|1048576;while(0);g=oi(a|0,b|0,10)|0;q=oi(d|0,j|0,10)|0;b=ni(a|0,b|0,22)|0;e=ni(d|0,j|0,22)|0;g=g&-1024;q=q&-1024;p=ki(q|0,0,g|0,0)|0;v=y;g=ki(e|0,0,g|0,0)|0;m=y;q=ki(q|0,0,b|0,0)|0;u=y;b=ki(e|0,0,b|0,0)|0;e=y;g=ei(v|0,0,g&-1024|0,0)|0;q=ei(g|0,y|0,q&-1024|0,0)|0;g=y;m=ei(u|0,0,m|0,0)|0;m=ei(m|0,y|0,b|0,0)|0;m=ei(m|0,y|0,g|0,0)|0;ei(0,y&7|0,b|0,e|0)|0;e=y;b=e>>>0<536870912|(e|0)==536870912&m>>>0<0;u=oi(m|0,e|0,1)|0;v=y;g=ni(q|0,g|0,31)|0;q=oi(p&-1048576|0,q|0,b&1|0)|0;p=y;m=b?u|g&1:m;e=b?v:e;b=l+o+(b?-1022:-1021)|0;do if(!k){if(!((f|0)==0&(w|0)==0)){k=qi(f|0,w|0,0)|0;d=oi(f|0,w|0,k+-11|0)|0;k=12-k|0;j=y;break}j=m|((q|0)!=0|(p|0)!=0)&1;z=qi(j|0,e|0,0)|0;k=z+-1|0;if((z|0)<=0)ja(13764,13775,183,13826);z=oi(j|0,e|0,k|0)|0;i=Vb(n,b-k|0,z,y,h,i)|0;h=y;y=h;return i|0}else{d=f;j=w|1048576}while(0);k=k+1|0;l=oi(d|0,j|0,9)|0;o=y;if((b|0)>(k|0)){r=x;s=b;d=k;k=l;a=0;j=o;b=0;l=e}else{w=(b|0)!=(k|0)|(e>>>0<o>>>0|(e|0)==(o|0)&m>>>0<l>>>0);r=w?n:x;n=w?x:n;s=w?k:b;d=w?b:k;k=w?m:l;a=w?q:0;j=w?e:o;b=w?p:0;q=w?0:q;p=w?0:p;m=w?l:m;l=w?o:e}d=s-d|0;a:do if((d|0)>127){a=((a|k|0)!=0|(b|j|0)!=0)&1;b=0;k=0;j=0}else{if((d|0)>64){x=d+-64|0;b=oi(1,0,x|0)|0;b=ei(b|0,y|0,-1,-1)|0;a=y;x=ni(k|0,j|0,x|0)|0;a=x|((b&k|0)!=0|(a&j|0)!=0)&1;b=y;k=0;j=0;break}switch(d|0){case 0:break a;case 64:{a=k|((a|0)!=0|(b|0)!=0)&1;b=j;k=0;j=0;break a}default:{f=ei(oi(1,0,d|0)|0,y|0,-1,-1)|0;w=y;g=oi(k|0,j|0,64-d|0)|0;x=y;v=ni(a|0,b|0,d|0)|0;x=x|y;a=g|v|((f&a|0)!=0|(w&b|0)!=0)&1;b=x;k=ni(k|0,j|0,d|0)|0;j=y;break a}}}while(0);if((n|0)==(r|0)){w=ei(a|0,b|0,q|0,p|0)|0;x=y;j=ei(k|0,j|0,m|0,l|0)|0;a=ei(j|0,y|0,(x>>>0<b>>>0|(x|0)==(b|0)&w>>>0<a>>>0)&1|0,0)|0;j=y;l=w;m=x}else{w=fi(q|0,p|0,a|0,b|0)|0;x=y;j=fi(m|0,l|0,k|0,j|0)|0;a=(x>>>0>p>>>0|(x|0)==(p|0)&w>>>0>q>>>0)<<31>>31;a=ei(j|0,y|0,a|0,((a|0)<0)<<31>>31|0)|0;j=y;n=(a|w|0)==0&(j|x|0)==0?(h|0)==2&1:n;l=w;m=x}if((a|0)==0&(j|0)==0){k=qi(l|0,m|0,0)|0;b=k+63|0;d=s-b|0;if((k+64|0)>>>0<65){k=64;z=50}else{k=oi(l|0,m|0,k+-1|0)|0;j=y}}else{k=qi(a|0,j|0,0)|0;b=k+-1|0;if((k|0)<=0)ja(13764,13775,201,13841);d=s-b|0;if(!b)k=a|((l|0)!=0|(m|0)!=0)&1;else z=50}if((z|0)==50){z=oi(a|0,j|0,b|0)|0;j=y;x=ni(l|0,m|0,65-k|0)|0;j=y|j;k=oi(l|0,m|0,b|0)|0;k=x|z|((k|0)!=0|(y|0)!=0)&1}i=Vb(n,d,k,j,h,i)|0;h=y;y=h;return i|0}function Zb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;n=e^b;p=ni(d^a|0,n|0,63)|0;l=ni(a|0,b|0,52)|0;l=l&2047;h=ni(d|0,e|0,52)|0;i=h&2047;m=b&1048575;k=e&1048575;if((l|0)==2047){h=(a|0)==0&(m|0)==0;if(h)if((d|0)==0&(k|0)==0|(0!=0|(e&2146435072|0)!=2146435072))if((i|0)==2047){c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}else{p=n&-2147483648|2146435072;g=0;y=p;return g|0}else j=5;else if(h|(0!=0|(b&2146959360|0)!=2146435072))j=5;if((j|0)==5?(d|0)==0&(k|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}a:do switch(h&2047){case 2047:{if((d|0)==0&(k|0)==0){p=n&-2147483648;g=0;y=p;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&((a|0)!=0|(m|0)!=0)|0==0&(e&2146959360|0)==2146435072)){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}case 0:{if(!((d|0)==0&(k|0)==0)){o=qi(d|0,k|0,0)|0;d=oi(d|0,k|0,o+-11|0)|0;o=12-o|0;i=y;break a}h=c[g>>2]|0;if((a|0)==0&(m|0)==0&(l|0)==0){c[g>>2]=h|16;p=2146959360;g=0;y=p;return g|0}else{c[g>>2]=h|8;p=n&-2147483648|2146435072;g=0;y=p;return g|0}}default:{o=i;i=k|1048576}}while(0);do if(!l){if(!((a|0)==0&(m|0)==0)){n=qi(a|0,m|0,0)|0;h=oi(a|0,m|0,n+-11|0)|0;n=12-n|0;b=y;break}p=n&-2147483648;g=0;y=p;return g|0}else{n=l;b=m|1048576;h=a}while(0);k=oi(d|0,i|0,2)|0;l=y;if(!(b>>>0<l>>>0|(b|0)==(l|0)&h>>>0<k>>>0))ja(13857,13775,571,13864);j=0;d=0;e=0;do{r=oi(h|0,b|0,1)|0;q=y;m=ni(d|0,e|0,63)|0;r=m|r;q=y|q;m=(b|0)>-1|(b|0)==-1&h>>>0>4294967295;a=q>>>0<l>>>0|(q|0)==(l|0)&r>>>0<k>>>0;i=m&a;h=fi(r|0,q|0,(i?0:k)|0,(i?0:l)|0)|0;b=y;i=oi(d|0,e|0,1)|0;e=y;d=i|(m&a^1)&1;j=j+1|0}while((j|0)!=64);h=(h|0)==0&(b|0)==0;d=h?d:i|1;h=h?e:e;b=qi(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);r=oi(d|0,h|0,b+-1|0)|0;r=Vb(p,1023-o+n+(1-b)|0,r,y,f,g)|0;q=y;y=q;return r|0}function _b(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=ni(a|0,b|0,63)|0;f=ni(a|0,b|0,52)|0;f=f&2047;i=b&1048575;do if((f|0)==2047){if((a|0)==0&(i|0)==0){if(h)break;y=b;return a|0}if(!(0==0&(b&2146959360|0)==2146435072)){d=2146959360;e=0;y=d;return e|0}c[e>>2]=c[e>>2]|16;d=2146959360;e=0;y=d;return e|0}else{g=(f|0)==0;if(h|0){if(!((a|0)==0&(i|0)==0&g))break;y=b;return a|0}do if(g)if((a|0)==0&(i|0)==0){d=0;e=0;y=d;return e|0}else{f=qi(a|0,i|0,0)|0;a=oi(a|0,i|0,f+-11|0)|0;f=12-f|0;b=y;break}else b=i|1048576;while(0);m=f+-1023|0;l=(m&1|0)==0;k=oi(a|0,b|0,(l^1)&1|0)|0;m=((l?m:f+-1024|0)>>1)+1023|0;k=oi(k|0,y|0,8)|0;l=y;do if(!((k|0)==0&(l|0)==0)){b=ei(k|0,l|0,-1,-1)|0;b=qi(b|0,y|0,1)|0;b=oi(1,0,(129-b|0)>>>1|0)|0;a=y;if(!(a>>>0>l>>>0|(a|0)==(l|0)&b>>>0>k>>>0))ja(13857,13775,571,13864);while(1){f=0;g=k;h=l;i=0;j=0;do{t=oi(g|0,h|0,1)|0;s=y;q=ni(i|0,j|0,63)|0;t=q|t;s=y|s;q=(h|0)>-1|(h|0)==-1&g>>>0>4294967295;p=s>>>0<a>>>0|(s|0)==(a|0)&t>>>0<b>>>0;r=q&p;g=fi(t|0,s|0,(r?0:b)|0,(r?0:a)|0)|0;h=y;r=oi(i|0,j|0,1)|0;j=y;i=r|(q&p^1)&1;f=f+1|0}while((f|0)!=64);g=ei(i|0,j|0,b|0,a|0)|0;g=ni(g|0,y|0,1)|0;f=y;if(!(f>>>0<a>>>0|(f|0)==(a|0)&g>>>0<b>>>0)){f=21;break}if(f>>>0>l>>>0|(f|0)==(l|0)&g>>>0>k>>>0){a=f;b=g}else{f=17;break}}if((f|0)==17)ja(13857,13775,571,13864);else if((f|0)==21){t=ki(b|0,0,b|0,0)|0;o=y;n=ki(a|0,0,b|0,0)|0;q=y;r=ki(a|0,0,a|0,0)|0;s=y;n=oi(n|0,q|0,1)|0;o=ei(n&-2|0,y&1|0,o|0,0)|0;n=y;q=oi(q|0,0,1)|0;q=ei(q|0,y|0,r|0,0)|0;n=ei(q|0,y|0,n|0,0)|0;ei(0,y&7|0,r|0,s|0)|0;n=b|((t|0)!=0|(o|0)!=0|((n|0)!=(k|0)|(y|0)!=(l|0)))&1;o=a;break}}else{n=0;o=0}while(0);a=qi(n|0,o|0,0)|0;if((a|0)<=0)ja(13764,13775,183,13826);t=oi(n|0,o|0,a+-1|0)|0;t=Vb(0,m+(1-a)|0,t,y,d,e)|0;s=y;y=s;return t|0}while(0);c[e>>2]=c[e>>2]|16;s=2146959360;t=0;y=s;return t|0}function $b(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?e:b;e=g?d:a;y=b;return e|0}else{g=(h|0)==0;b=g?e:b;e=g?d:a;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function ac(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?b:e;e=g?a:d;y=b;return e|0}else{g=(h|0)==0;b=g?b:e;e=g?a:d;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function bc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=(a|0)!=0|(b&1048575|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0)return ((a|0)==(d|0)&(b|0)==(e|0)|(d|a|0)==0&((e|b)&2147483647|0)==0)&1|0;if(!(0==0&(b&2146959360|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)return 0;c[f>>2]=c[f>>2]|16;return 0}function cc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f|(d|a|0)==0&((e|b)&2147483647|0)==0;h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>=d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<=d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function dc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=ni(a|0,b|0,63)|0;g=ni(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f&((d|a|0)!=0|((e|b)&2147483647|0)!=0);h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function ec(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=ni(a|0,b|0,63)|0;e=ni(a|0,b|0,52)|0;d=b&1048575;switch(e&2047){case 2047:if((a|0)==0&(d|0)==0){e=(c|0)==0?128:1;return e|0}else{e=ni(a|0,b|0,43)|0;e=(e&256)+256|0;return e|0}case 0:{b=(c|0)!=0;if((a|0)==0&(d|0)==0){e=b?8:16;return e|0}else{e=b?4:32;return e|0}}default:{e=(c|0)==0?64:2;return e|0}}return 0}function fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=a>>>31;e=a>>>23;d=a&8388607;a:do switch((e&255)<<24>>24){case -1:{if(!d){f=oi(f|0,0,63)|0;e=y|2146435072;y=e;return f|0}if((a&2143289344|0)!=2139095040){e=2146959360;f=0;y=e;return f|0}c[b>>2]=c[b>>2]|16;e=2146959360;f=0;y=e;return f|0}case 0:{if(d|0){a=Q(d|0)|0;d=d<<a+-8;a=9-a|0;break a}f=oi(f|0,0,63)|0;e=y;y=e;return f|0}default:a=e&255}while(0);b=oi(d|0,0,29)|0;e=y;f=oi(f|0,0,63)|0;g=y;d=oi(a+896|0,0,52)|0;e=y|g|e&1048575;f=d|f|b&-536870912;y=e;return f|0}function gc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=ni(a|0,b|0,63)|0;g=y;h=ni(a|0,b|0,52)|0;f=b&1048575;a:do switch(h&2047){case 2047:{if((a|0)==0&(f|0)==0){i=oi(i|0,g|0,31)|0;i=i|2139095040;return i|0}if(!(0==0&(b&2146959360|0)==2146435072)){i=2143289344;return i|0}c[e>>2]=c[e>>2]|16;i=2143289344;return i|0}case 0:{if(!((a|0)==0&(f|0)==0)){b=qi(a|0,f|0,0)|0;b=12-b|0;break a}i=oi(i|0,g|0,31)|0;return i|0}default:{b=h&2047;f=f|1048576}}while(0);f=ni(a|0,f|0,22)|0;f=f|((a&4194303|0)!=0|0!=0)&1;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);i=Db(i,b+-896+(1-a)|0,f<<a+-1,d,e)|0;return i|0}function hc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ic(a,b,c,d,0)|0}function ic(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=ni(a|0,b|0,63)|0;g=ni(a|0,b|0,52)|0;g=g&2047;b=b&1048575;j=((a|0)!=0|(b|0)!=0)&(g|0)==2047?0:j;i=(g|0)==0;g=i?-1074:g+-1075|0;b=oi(a|0,b|0,10)|0;a=y;b=i?b:b;a=i?a:a|1073741824;i=(f|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)<=-1){if((g|0)<-63){b=((b|0)!=0|(a|0)!=0)&1;f=0}else{g=0-g|0;h=oi(1,0,g|0)|0;h=ei(h|0,y|0,-1,2147483647)|0;f=y;g=ni(b|0,a|0,g|0)|0;b=g|((h&b|0)!=0|(f&a|0)!=0)&1;f=y}switch(d|0){case 4:case 0:{a=512;g=0;break}case 1:{a=0;g=0;break}default:{g=(j|0)==(d&1|0);a=g?0:1023;g=g?0:0}}h=b&1023;b=ei(a|0,g|0,b|0,f|0)|0;b=ni(b|0,y|0,10)|0;f=y;d=(d|0)==0&(h|0)==512;b=d?b&-2:b;d=d?f&4194303:f;if(!(d>>>0>0|(d|0)==0&b>>>0>i>>>0)){if(h|0)c[e>>2]=c[e>>2]|1;e=(j|0)==0?b:0-b|0;return e|0}}c[e>>2]=c[e>>2]|16;e=i;return e|0}function jc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ic(a,b,c,d,1)|0}function kc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-63|0;f=(e|0)>63;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=qi(g|0,0,0)|0;d=h+-1|0;if((h|0)>0){h=oi(g|0,0,d|0)|0;h=Vb(a>>>31,(f?e+1022|0:1085)-d|0,h,y,b,c)|0;return h|0}else ja(13764,13775,183,13826);return 0}function lc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-63|0;f=(e|0)>63;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=qi(d|0,0,0)|0;a=g+-1|0;if((g|0)>0){g=oi(d|0,0,a|0)|0;g=Vb(0,(f?e+1022|0:1085)-a|0,g,y,b,c)|0;return g|0}else ja(13764,13775,183,13826);return 0}function mc(b,d){b=b|0;d=d|0;var e=0,f=0;e=lf(572)|0;oc(e,b,2,8,1);c[e+544>>2]=d;b=Va[c[d>>2]&15](d)|0;d=y;a[e+288>>0]=b;a[e+289>>0]=b>>>8;a[e+290>>0]=b>>>16;a[e+291>>0]=b>>>24;a[e+292>>0]=d;f=ni(b|0,d|0,40)|0;a[e+293>>0]=f;f=ni(b|0,d|0,48)|0;a[e+294>>0]=f;d=ni(b|0,d|0,56)|0;a[e+295>>0]=d;return e|0}function nc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;h=k;i=c[a+544>>2]|0;j=a+548|0;if(c[j>>2]|0){j=-1;l=k;return j|0}if((Ac(a,h,b,d,0,16,0)|0)<0){j=0;l=k;return j|0}m=c[h>>2]|0;g=a+552|0;c[g>>2]=m;c[g+12>>2]=b;c[g+16>>2]=d;switch(m|0){case 0:{b=Ag(f)|0;c[g+4>>2]=b;c[g+8>>2]=f;m=h+8|0;b=$a[c[i+4>>2]&3](i,c[m>>2]|0,c[m+4>>2]|0,b,(f+-1|0)/512|0,5,a)|0;if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Cc(a,b);m=0;l=k;return m|0}}case 1:{if((f|0)<=0)ja(13887,13903,1097,13912);f=e+-16|0;m=Ag(f)|0;Ac(a,m,b,d,16,f,0)|0;b=h+8|0;b=$a[c[i+8>>2]&3](i,c[b>>2]|0,c[b+4>>2]|0,m,(f|0)/512|0,5,a)|0;Bg(m);if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Cc(a,b);m=0;l=k;return m|0}}default:{m=0;l=k;return m|0}}return 0}function oc(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+64|0;m=n+32|0;k=n;si(d|0,0,544)|0;if(!(c[e>>2]|0)){k=c[e+4>>2]|0;c[d>>2]=k;c[d+12>>2]=c[e+16>>2];m=e+8|0;c[d+4>>2]=gf(k,c[m>>2]|0,c[m+4>>2]|0,4096,0,d,8,3,7)|0;c[d+16>>2]=9}else{switch(f|0){case 1:{i=4096;j=512;break}case 2:{i=4097;j=256;break}case 3:{i=4099;j=1920;break}case 9:{i=4169;j=2;break}case 18:{i=4178;j=2432;break}default:ra()}c[m>>2]=i&65535;Wg(k,32,13875,m)|0;v=ze(c[e>>2]|0,k,-1,6900,i,0,j)|0;k=d+8|0;c[k>>2]=v;Ge(v,44,6900);Ge(c[k>>2]|0,46,f&65535);Fe(c[k>>2]|0,61,1);c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;v=m+2|0;a[v>>0]=16;u=m+3|0;a[u>>0]=1;t=m+4|0;a[t>>0]=4;s=m+8|0;r=m+9|0;q=m+10|0;p=m+11|0;o=m+12|0;i=m+13|0;c[s>>2]=0;a[s+4>>0]=0;a[i>>0]=16;j=m+14|0;a[j>>0]=0;e=m+15|0;a[e>>0]=0;He(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=3;a[t>>0]=4;a[s>>0]=0;a[r>>0]=16;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;He(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=4;a[t>>0]=4;a[s>>0]=0;a[r>>0]=32;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;He(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;a[m>>0]=9;a[v>>0]=20;a[u>>0]=2;a[t>>0]=4;a[s>>0]=0;a[r>>0]=48;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;c[m+16>>2]=0;He(c[k>>2]|0,m,20)|0;c[d+16>>2]=6;c[d+12>>2]=Be(c[k>>2]|0,0)|0;m=Ce(c[k>>2]|0)|0;c[d>>2]=m;c[d+4>>2]=gf(m,0,0,16384,0,d,7,1,23)|0;De(c[k>>2]|0,4,16384,0,d,2)}c[d+264>>2]=f;c[d+268>>2]=65535;c[d+284>>2]=g;c[d+276>>2]=h;v=d+24|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[d+44>>2]=16;c[d+52>>2]=0;c[d+56>>2]=0;c[d+60>>2]=0;b[d+48>>1]=0;c[d+68>>2]=0;c[d+72>>2]=16;c[d+80>>2]=0;c[d+84>>2]=0;c[d+88>>2]=0;b[d+76>>1]=0;c[d+96>>2]=0;c[d+100>>2]=16;c[d+108>>2]=0;c[d+112>>2]=0;c[d+116>>2]=0;b[d+104>>1]=0;c[d+124>>2]=0;c[d+128>>2]=16;c[d+136>>2]=0;c[d+140>>2]=0;c[d+144>>2]=0;b[d+132>>1]=0;c[d+152>>2]=0;c[d+156>>2]=16;c[d+164>>2]=0;c[d+168>>2]=0;c[d+172>>2]=0;b[d+160>>1]=0;c[d+180>>2]=0;c[d+184>>2]=16;c[d+192>>2]=0;c[d+196>>2]=0;c[d+200>>2]=0;b[d+188>>1]=0;c[d+208>>2]=0;c[d+212>>2]=16;c[d+220>>2]=0;c[d+224>>2]=0;c[d+228>>2]=0;b[d+216>>1]=0;c[d+236>>2]=0;c[d+240>>2]=16;c[d+248>>2]=0;c[d+252>>2]=0;c[d+256>>2]=0;b[d+244>>1]=0;l=n;return}function pc(a,b,d){a=a|0;b=b|0;d=d|0;return Ee(c[a+8>>2]|0,b,0,d)|0}function qc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=b&4095;switch(b>>>12&1048575|0){case 0:switch(e|0){case 2:switch(b&4095){case 4:{b=c[a+32>>2]|0;switch(b|0){case 0:{a=c[a+272>>2]|0;return a|0}case 1:{a=b;return a|0}default:{a=0;return a|0}}}case 0:{a=c[a+32>>2]|0;return a|0}case 32:{a=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;return a|0}case 40:{a=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;return a|0}case 48:{a=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;return a|0}default:{a=0;return a|0}}case 1:{f=f+-18|0;switch(f>>>1|f<<31|0){case 0:{a=16;return a|0}case 2:{a=c[a+36>>2]|0;return a|0}case 3:{a=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;return a|0}case 5:{a=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;return a|0}default:{a=0;return a|0}}}default:{if(!((e|0)==0&(f|0)==20)){a=0;return a|0}a=c[a+28>>2]|0;return a|0}}case 1:{if(f|e|0){a=0;return a|0}e=a+24|0;f=c[e>>2]|0;c[e>>2]=0;a=c[a+12>>2]|0;eb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);a=f;return a|0}case 2:{switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=f>>>0){a=0;return a|0}a=d[a+288+f>>0]|0;return a|0}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0);return a|0}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0)|(d[a+2>>0]|0)<<16|(d[a+3>>0]|0)<<24;return a|0}default:ra()}break}default:{a=0;return a|0}}return 0}function rc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0;g=d&4095;switch(d>>>12&1048575|0){case 0:switch(f|0){case 2:switch(g>>>3|d<<29|0){case 0:{c[a+32>>2]=e;return}case 4:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 5:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 6:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}default:return}case 1:switch(d&4095){case 22:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 24:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 28:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}default:return}default:{if(!((g|0)==20&(f|0)==0))return;c[a+28>>2]=e;if(e|0)return;g=c[a+12>>2]|0;eb[c[g>>2]&15](c[g+4>>2]|0,c[g+8>>2]|0,0);g=a+24|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}}case 2:{wc(a,g,e,f);return}case 3:{if(e>>>0>=8)return;xc(a,e);return}default:return}}function sc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;hf(c[a+4>>2]|0,d,0,e);return}function tc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;a:do if(b>>>0<=255)if((e|0)==2)do switch(b|0){case 0:{f=1953655158;break a}case 4:{f=2;break a}case 8:{f=c[a+264>>2]|0;break a}case 12:{f=c[a+268>>2]|0;break a}case 16:{f=c[a+32>>2]|0;switch(f|0){case 1:break a;case 0:{f=c[a+272>>2]|0;break a}default:{f=0;break a}}}case 20:{f=c[a+32>>2]|0;break a}case 48:{f=c[a+36>>2]|0;break a}case 52:{f=16;break a}case 56:{f=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;break a}case 128:{f=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;break a}case 144:{f=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;break a}case 160:{f=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;break a}case 68:{f=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;break a}case 96:{f=c[a+24>>2]|0;break a}case 112:{f=c[a+28>>2]|0;break a}case 252:{f=0;break a}default:{f=0;break a}}while(0);else f=0;else{b=b+-256|0;switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=b>>>0){f=0;break a}f=d[a+288+b>>0]|0;break a}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0);break a}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;break a}default:ra()}}while(0);return f|0}function uc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;if(d>>>0>255){wc(a,d+-256|0,e,f);return}if((f|0)!=2)return;do switch(d|0){case 20:{c[a+32>>2]=e;return}case 48:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 56:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 128:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 144:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 160:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}case 112:{c[a+28>>2]=e;if(e|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);f=a+24|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}case 68:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}case 80:{if(e>>>0>=8)return;xc(a,e);return}case 100:{d=a+24|0;f=c[d>>2]&~e;c[d>>2]=f;if(f|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);return}default:return}while(0)}function vc(a,b,d){a=a|0;b=b|0;d=d|0;return jf(c[a>>2]|0,b,0,d)|0}function wc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;switch(f|0){case 0:{if((c[b+284>>2]|0)>>>0<=d>>>0)return;a[b+288+d>>0]=e;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 1:{if(((c[b+284>>2]|0)+-1|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=(e&65535)>>>8;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 2:{if(((c[b+284>>2]|0)+-3|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=e>>>8;a[d+2>>0]=e>>>16;a[d+3>>0]=e>>>24;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}default:return}}function xc(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;k=p+4|0;m=p;if(c[a+40+(d*28|0)+24>>2]|0){l=p;return}o=a+40+(d*28|0)+16|0;f=(c[o>>2]|0)+2|0;if((f&1|0)==0?(e=Xa[c[a+16>>2]&31](a,f,0)|0,(e|0)!=0):0)f=b[e>>1]|0;else f=0;g=a+276|0;h=a+40+(d*28|0)+8|0;e=b[h>>1]|0;if(e<<16>>16==f<<16>>16){l=p;return}i=a+40+(d*28|0)+4|0;j=a+16|0;while(1){e=(c[o>>2]|0)+4+(((c[i>>2]|0)+65535&(e&65535))<<1)|0;if((e&1|0)==0?(n=Xa[c[j>>2]&31](a,e,0)|0,(n|0)!=0):0)e=b[n>>1]|0;else e=0;e=e&65535;if((yc(a,k,m,d,e)|0)==0?(Za[c[g>>2]&7](a,d,e,c[k>>2]|0,c[m>>2]|0)|0)<0:0){e=13;break}e=(b[h>>1]|0)+1<<16>>16;b[h>>1]=e;if(e<<16>>16==f<<16>>16){e=13;break}}if((e|0)==13){l=p;return}}function yc(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;zc(a,p,g,h);o=p+12|0;j=e[o>>1]|0;a:do if(!(j&2)){i=p+8|0;k=p+14|0;h=0;do{h=(c[i>>2]|0)+h|0;if(!(j&1)){i=0;break a}zc(a,p,g,e[k>>1]|0);m=b[o>>1]|0;j=m&65535}while(!(j&2|0));j=m&65535;n=6}else{h=0;n=6}while(0);b:do if((n|0)==6){k=p+8|0;m=p+14|0;i=0;while(1){i=(c[k>>2]|0)+i|0;if(!(j&1))break b;zc(a,p,g,e[m>>1]|0);j=e[o>>1]|0;if(!(j&2)){h=-1;break}}l=q;return h|0}while(0);c[d>>2]=h;c[f>>2]=i;f=0;l=q;return f|0}function zc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a+16|0;g=16;e=(c[a+40+(d*28|0)+12>>2]|0)+(e<<4)|0;while(1){d=4096-(e&4095)|0;d=(g|0)<(d|0)?g:d;f=Xa[c[h>>2]&31](a,e,0)|0;if(!f){b=4;break}ri(b|0,f|0,d|0)|0;g=g-d|0;if((g|0)<=0){b=4;break}else{b=b+d|0;e=d+e|0}}if((b|0)==4)return}function Ac(a,d,f,g,h,i,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;y=z;if(!i){y=0;l=z;return y|0}x=a+40+(f*28|0)+12|0;w=a+16|0;m=y;n=16;g=(c[x>>2]|0)+(g<<4)|0;while(1){f=4096-(g&4095)|0;f=(n|0)<(f|0)?n:f;k=Xa[c[w>>2]&31](a,g,0)|0;if(!k)break;ri(m|0,k|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{m=m+f|0;g=f+g|0}}u=(j|0)!=0;v=y+12|0;k=b[v>>1]|0;f=k&65535;g=f&2;a:do if(u)if(!g){j=y+14|0;while(1){if(!(f&1)){q=-1;break}g=y;k=16;m=((e[j>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;ri(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}k=b[v>>1]|0;f=k&65535;g=f&2;if(g){t=2;break a}}l=z;return q|0}else t=2;else t=0;while(0);if((g|0)!=(t|0)){y=-1;l=z;return y|0}r=y+8|0;s=y+14|0;m=h;while(1){p=c[r>>2]|0;if(m>>>0<p>>>0){f=21;break}if(!(f&1)){q=-1;f=40;break}o=m-p|0;g=y;n=16;j=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(j&4095)|0;f=(n|0)<(f|0)?n:f;h=Xa[c[w>>2]&31](a,j,0)|0;if(!h)break;ri(g|0,h|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{g=g+f|0;j=f+j|0}}g=b[v>>1]|0;f=g&65535;if((f&2|0)!=(t|0)){q=-1;f=40;break}else{m=o;k=g}}if((f|0)==21){n=d;g=i;f=k;b:while(1){q=n;d=g;do{o=p-m|0;o=(d|0)<(o|0)?d:o;k=m+(c[y>>2]|0)|0;g=(o|0)>0;c:do if(u){if(g){n=o;j=q;while(1){g=4096-(k&4095)|0;g=(n|0)<(g|0)?n:g;h=Xa[c[w>>2]&31](a,k,1)|0;if(!h)break c;ri(h|0,j|0,g|0)|0;n=n-g|0;if((n|0)<=0)break;else{k=g+k|0;j=j+g|0}}}}else if(g){j=q;h=o;while(1){g=4096-(k&4095)|0;g=(h|0)<(g|0)?h:g;n=Xa[c[w>>2]&31](a,k,0)|0;if(!n)break c;ri(j|0,n|0,g|0)|0;h=h-g|0;if((h|0)<=0)break;else{j=j+g|0;k=g+k|0}}}while(0);d=d-o|0;if(!d){q=0;f=40;break b}m=o+m|0;q=q+o|0}while((m|0)!=(p|0));if(!(f&1)){q=-1;f=40;break}g=y;k=16;m=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;ri(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}f=b[v>>1]|0;if((t|0)!=(f&2|0)){q=-1;f=40;break}n=q;g=d;m=0;p=c[r>>2]|0}if((f|0)==40){l=z;return q|0}}else if((f|0)==40){l=z;return q|0}return 0}function Bc(a,b){a=a|0;b=b|0;Cc(a,b);c[a+548>>2]=0;xc(a,c[a+564>>2]|0);return}function Cc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;e=i;f=b+552|0;g=c[f+12>>2]|0;h=c[f+16>>2]|0;switch(c[f>>2]|0){case 0:{e=c[f+8>>2]|0;f=c[f+4>>2]|0;a[f+(e+-1)>>0]=d>>>31;Ac(b,f,g,h,0,e,1)|0;Bg(f);Dc(b,g,h,e);l=i;return}case 1:{a[e>>0]=d>>>31;Ac(b,e,g,h,0,1,1)|0;Dc(b,g,h,1);l=i;return}default:ra()}}function Dc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=a+40+(d*28|0)+20|0;h=(c[j>>2]|0)+2|0;if(!(h&1)){i=a+16|0;g=Xa[c[i>>2]&31](a,h,0)|0;if(!g)g=0;else g=b[g>>1]|0;g=g&65535;h=Xa[c[i>>2]&31](a,h,1)|0;if(h)b[h>>1]=g+1}else g=0;g=(c[j>>2]|0)+4+(((c[a+40+(d*28|0)+4>>2]|0)+65535&g)<<3)|0;if((g&3|0)==0?(k=Xa[c[a+16>>2]&31](a,g,1)|0,k|0):0)c[k>>2]=e;g=g+4|0;if((g&3|0)==0?(l=Xa[c[a+16>>2]&31](a,g,1)|0,l|0):0)c[l>>2]=f;l=a+24|0;c[l>>2]=c[l>>2]|1;l=c[a+12>>2]|0;eb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}function Ec(d,e){d=d|0;e=e|0;var f=0;f=lf(552)|0;oc(f,d,1,8,2);c[f+272>>2]=32;c[f+64>>2]=1;c[f+544>>2]=e;d=f+288|0;c[d>>2]=c[e>>2];b[d+4>>1]=b[e+4>>1]|0;a[f+294>>0]=0;a[f+295>>0]=0;c[f+548>>2]=12;c[e+16>>2]=f;c[e+20>>2]=9;c[e+24>>2]=5;c[e+28>>2]=6;return f|0}function Fc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=c[a+544>>2]|0;if((b|0)!=1){l=h;return 0}f=a+548|0;if((Ac(a,h,1,d,0,c[f>>2]|0,0)|0)<0){l=h;return 0}f=c[f>>2]|0;b=e-f|0;e=Ag(b)|0;Ac(a,e,1,d,f,b,0)|0;eb[c[g+8>>2]&15](g,e,b);Bg(e);Dc(a,1,d,0);l=h;return 0}function Gc(a){a=a|0;var d=0,e=0;e=c[a+16>>2]|0;if(!(c[e+40>>2]|0)){e=0;return e|0}a=(c[e+56>>2]|0)+2|0;if((a&1|0)==0?(d=Xa[c[e+16>>2]&31](e,a,0)|0,(d|0)!=0):0)a=b[d>>1]|0;else a=0;e=(b[e+48>>1]|0)!=a<<16>>16&1;return e|0}function Hc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;m=o+8|0;j=o+4|0;n=o;k=c[a+16>>2]|0;if(!(c[k+40>>2]|0)){l=o;return}g=k+56|0;a=(c[g>>2]|0)+2|0;if((a&1|0)==0?(f=Xa[c[k+16>>2]&31](k,a,0)|0,(f|0)!=0):0)a=b[f>>1]|0;else a=0;i=k+48|0;f=b[i>>1]|0;if(f<<16>>16==a<<16>>16){l=o;return}a=(c[g>>2]|0)+4+(((c[k+44>>2]|0)+65535&(f&65535))<<1)|0;if((a&1|0)==0?(h=Xa[c[k+16>>2]&31](k,a,0)|0,(h|0)!=0):0)a=b[h>>1]|0;else a=0;h=a&65535;if(yc(k,j,n,0,h)|0){l=o;return}a=k+548|0;f=c[a>>2]|0;g=f+e|0;if((g|0)>(c[n>>2]|0)){l=o;return}si(m|0,0,f|0)|0;Ac(k,m,0,h,0,f,1)|0;Ac(k,d,0,h,c[a>>2]|0,e,1)|0;Dc(k,0,h,g);b[i>>1]=(b[i>>1]|0)+1<<16>>16;l=o;return}function Ic(a,b){a=a|0;b=b|0;return}function Jc(a){a=a|0;var d=0,e=0;if(!(c[a+40>>2]|0)){a=0;return a|0}e=(c[a+56>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;a=(b[a+48>>1]|0)!=d<<16>>16&1;return a|0}function Kc(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j+4|0;i=j;if(!(c[a+40>>2]|0)){i=0;l=j;return i|0}f=a+56|0;e=(c[f>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;e=b[a+48>>1]|0;if(e<<16>>16==d<<16>>16){i=0;l=j;return i|0}d=(c[f>>2]|0)+4+(((c[a+44>>2]|0)+65535&(e&65535))<<1)|0;if((d&1|0)==0?(g=Xa[c[a+16>>2]&31](a,d,0)|0,(g|0)!=0):0)d=b[g>>1]|0;else d=0;h=(yc(a,h,i,0,d&65535)|0)==0;i=h?c[i>>2]|0:0;l=j;return i|0}function Lc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(c[a+40>>2]|0)){e=0;return e|0}i=a+56|0;g=(c[i>>2]|0)+2|0;if((g&1|0)==0?(f=Xa[c[a+16>>2]&31](a,g,0)|0,(f|0)!=0):0)f=b[f>>1]|0;else f=0;h=a+48|0;g=b[h>>1]|0;if(g<<16>>16==f<<16>>16){e=0;return e|0}f=(c[i>>2]|0)+4+(((c[a+44>>2]|0)+65535&(g&65535))<<1)|0;if((f&1|0)==0?(j=Xa[c[a+16>>2]&31](a,f,0)|0,(j|0)!=0):0)f=b[j>>1]|0;else f=0;j=f&65535;Ac(a,d,0,j,0,e,1)|0;Dc(a,0,j,e);b[h>>1]=(b[h>>1]|0)+1<<16>>16;return e|0}function Mc(b,d,e){b=b|0;d=d|0;e=e|0;a[b+288>>0]=d;a[b+289>>0]=(d&65535)>>>8;a[b+290>>0]=e;a[b+291>>0]=(e&65535)>>>8;e=b+24|0;c[e>>2]=c[e>>2]|2;e=c[b+12>>2]|0;eb[c[e>>2]&15](c[e+4>>2]|0,c[e+8>>2]|0,1);return}function Nc(a,b){a=a|0;b=b|0;var d=0;d=lf(548)|0;oc(d,a,3,4,3);c[d+272>>2]=1;c[d+64>>2]=1;c[d+544>>2]=b;return d|0}function Oc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[a+544>>2]|0;if((b|0)!=1)return 0;b=Ag(e)|0;Ac(a,b,1,d,0,e,0)|0;eb[c[f+4>>2]&15](c[f>>2]|0,b,e);Bg(b);Dc(a,1,d,0);return 0}function Pc(a,b,d){a=a|0;b=b|0;d=d|0;if(c[a+544>>2]|0){a=-1;return a|0}b=Qc(a,1,d,b)|0;if(b|0){a=b;return a|0}a=Qc(a,0,0,0)|0;return a|0}function Qc(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;if(!(c[d+40>>2]|0)){j=-1;l=k;return j|0}a[j>>0]=e;a[j+1>>0]=(e&65535)>>>8;a[j+2>>0]=f;a[j+3>>0]=(f&65535)>>>8;a[j+4>>0]=g;a[j+5>>0]=g>>>8;a[j+6>>0]=g>>>16;a[j+7>>0]=g>>>24;g=d+56|0;e=(c[g>>2]|0)+2|0;if((e&1|0)==0?(h=Xa[c[d+16>>2]&31](d,e,0)|0,(h|0)!=0):0)e=b[h>>1]|0;else e=0;h=d+48|0;f=b[h>>1]|0;if(f<<16>>16==e<<16>>16){j=-1;l=k;return j|0}e=(c[g>>2]|0)+4+(((c[d+44>>2]|0)+65535&(f&65535))<<1)|0;if((e&1|0)==0?(i=Xa[c[d+16>>2]&31](d,e,0)|0,(i|0)!=0):0)e=b[i>>1]|0;else e=0;i=e&65535;Ac(d,j,0,i,0,8,1)|0;Dc(d,0,i,8);b[h>>1]=(b[h>>1]|0)+1<<16>>16;j=0;l=k;return j|0}function Rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[a+544>>2]|0;if((g+-1|0)>>>0>=2){i=-1;return i|0}if((g|0)==1){b=Qc(a,2,0,b)|0;if(b|0){i=b;return i|0}b=Qc(a,2,1,d)|0;if(b|0){i=b;return i|0}}else{b=Qc(a,3,0,b)|0;if(b|0){i=b;return i|0}b=Qc(a,3,1,d)|0;if(b|0){i=b;return i|0}}if(e|0?(h=Qc(a,2,8,e)|0,h|0):0){i=h;return i|0}d=a+548|0;b=c[d>>2]|0;if((b|0)!=(f|0)){g=f&1;do if((g|0)!=(b&1|0)){b=Qc(a,1,272,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>1&1;do if((g|0)!=(b>>>1&1|0)){b=Qc(a,1,273,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>2&1;if((g|0)!=(b>>>2&1|0)?(i=Qc(a,1,274,g)|0,i|0):0)return i|0;c[d>>2]=f}i=Qc(a,0,0,0)|0;return i|0}function Sc(a,b){a=a|0;b=b|0;var d=0;d=lf(552)|0;oc(d,a,18,256,4);c[d+64>>2]=1;c[d+272>>2]=0;c[d+280>>2]=8;c[d+544>>2]=b;return d|0}function Tc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if((b|0)!=1)return 0;Dc(a,1,c,0);return 0}function Uc(b){b=b|0;var e=0,f=0;switch(a[b+288>>0]|0){case 1:{switch(c[b+544>>2]|0){case 0:{e=13965;break}case 1:{e=13952;break}case 2:{e=13938;break}default:ra()}f=Pg(e)|0;a[b+290>>0]=f;ri(b+296|0,e|0,f|0)|0;return}case 18:{if((c[b+544>>2]|0)!=2)return;if((d[b+289>>0]|0)>=2)return;a[b+290>>0]=20;e=b+296|0;a[e>>0]=0;a[e+1>>0]=0;a[e+2>>0]=0;a[e+3>>0]=0;a[b+300>>0]=-1;a[b+301>>0]=127;e=b+302|0;f=e+14|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));return}case 17:{e=b+290|0;a[e>>0]=0;switch(c[b+544>>2]|0){case 0:switch(a[b+289>>0]|0){case 1:{a[e>>0]=16;e=b+296|0;f=e+16|0;do{a[e>>0]=255;e=e+1|0}while((e|0)<(f|0));return}case 20:{a[e>>0]=1;return}default:return}case 1:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=3;a[b+297>>0]=1;return}default:return}case 2:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=0;a[b+297>>0]=1;return}case 3:{a[e>>0]=1;a[b+296>>0]=3;return}default:return}default:ra()}break}case 0:return;default:{a[b+290>>0]=0;return}}}function Vc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=Pg(e)|0;f=lf(564)|0;oc(f,b,9,g+2|0,5);c[f+272>>2]=1;a[f+288>>0]=g;a[f+289>>0]=g>>>8;ri(f+290|0,e|0,g|0)|0;c[f+544>>2]=d;c[f+548>>2]=8192;e=f+552|0;c[e>>2]=e;c[f+556>>2]=e;return f|0}function Wc(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;Va=l;l=l+3008|0;Ta=Va+2984|0;A=Va+2976|0;z=Va+2968|0;fa=Va+2960|0;y=Va+2944|0;x=Va+2928|0;Ia=Va+2920|0;Ga=Va+2912|0;Ea=Va+2904|0;w=Va+2888|0;v=Va+2880|0;za=Va+2872|0;u=Va+2848|0;t=Va+2840|0;s=Va+2832|0;r=Va+2816|0;q=Va+2800|0;Q=Va+2792|0;o=Va+2776|0;n=Va+2760|0;Aa=Va+2736|0;ea=Va+2712|0;xa=Va+2704|0;J=Va+2672|0;I=Va+2664|0;G=Va+2648|0;F=Va+2608|0;R=Va+2464|0;E=Va+2456|0;qa=Va+2448|0;D=Va+2440|0;pa=Va+2432|0;C=Va+2408|0;oa=Va+2400|0;B=Va+2384|0;na=Va+2376|0;p=Va+2352|0;H=Va+2344|0;m=Va+2288|0;Sa=Va+2240|0;Ha=Va+2992|0;Oa=Va+1024|0;Pa=Va;Na=Va+2120|0;Ma=Va+2988|0;Ka=Va+2104|0;Ja=Va+2088|0;Fa=Va+2072|0;ja=Va+2064|0;ka=Va+2056|0;la=Va+2048|0;La=f+544|0;Qa=c[La>>2]|0;if(g|0){h=0;l=Va;return h|0}P=f+560|0;if(c[P>>2]|0){h=-1;l=Va;return h|0}c[Ha>>2]=0;a:do if(!(Ac(f,Oa,0,h,0,7,0)|0)){Ra=a[Oa+4>>0]|0;i=a[Oa+5>>0]|0;g=(d[Oa+6>>0]<<8|i&255)&65535;c[Ha>>2]=(c[Ha>>2]|0)+7;Ra=Ra&255;Wa=Ra+-8|0;j=(g&65535)>>>8&255;do switch(Wa>>>1|Wa<<31|0){case 11:{k=-524;break a}case 0:{db[c[Qa+8>>2]&15](Qa,Sa);Ta=c[Sa>>2]|0;Ja=Sa+8|0;Ia=c[Ja>>2]|0;Ja=c[Ja+4>>2]|0;La=Sa+16|0;Ka=c[La>>2]|0;La=c[La+4>>2]|0;Na=Sa+24|0;Ma=c[Na>>2]|0;Na=c[Na+4>>2]|0;Qa=Sa+32|0;Pa=c[Qa>>2]|0;Qa=c[Qa+4>>2]|0;Ua=Sa+40|0;Wa=c[Ua>>2]|0;Ua=c[Ua+4>>2]|0;c[m>>2]=0;c[m+4>>2]=Ta;Ta=m+8|0;c[Ta>>2]=Ia;c[Ta+4>>2]=Ja;Ta=m+16|0;c[Ta>>2]=Ka;c[Ta+4>>2]=La;Ta=m+24|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Na;Ta=m+32|0;c[Ta>>2]=Pa;c[Ta+4>>2]=Qa;Ta=m+40|0;c[Ta>>2]=Wa;c[Ta+4>>2]=Ua;c[m+48>>2]=0;c[m+52>>2]=256;Ta=Xc(0,Oa,1024,13981,m)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}case 2:{c[H>>2]=Sa;c[H+4>>2]=Pa;b:do if((Yc(f,0,h,Ha,13991,H)|0)==0?(W=c[Sa>>2]|0,X=f+552|0,k=c[f+556>>2]|0,(k|0)!=(X|0)):0){while(1){if((c[k+8>>2]|0)==(W|0))break;k=c[k+4>>2]|0;if((k|0)==(X|0))break b}if(k|0?(ia=c[k+12>>2]|0,ia|0):0){j=Ag(16)|0;c[j>>2]=f;c[j+4>>2]=0;c[j+8>>2]=h;b[j+12>>1]=g;i=_a[c[Qa+24>>2]&15](Qa,Na,ia,c[Pa>>2]|0,4,j)|0;if((i|0)<1)_c(Na,i,j);else c[P>>2]=1;Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 3:{c[p>>2]=Sa;c[p+4>>2]=Ka;c[p+8>>2]=Pa;c[p+12>>2]=Na;c[p+16>>2]=Ma;if(Yc(f,0,h,Ha,13994,p)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;c:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=25;break c}}if((k|0)!=0?(ra=c[k+12>>2]|0,(ra|0)!=0):0){k=$a[c[Qa+28>>2]&3](Qa,Ja,ra,c[Ka>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0)|0;Bg(c[Ka>>2]|0);if(!k){Ta=(c[f+548>>2]|0)+-24|0;c[na>>2]=Ja;c[na+4>>2]=Ta;Ta=Xc(0,Oa,1024,14e3,na)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=25}else Ua=25;while(0);if((Ua|0)==25){Bg(c[Ka>>2]|0);k=-71}break a}case 4:{c[B>>2]=Sa;c[B+4>>2]=Na;c[B+8>>2]=Ma;c[B+12>>2]=Pa;if(Yc(f,0,h,Ha,14003,B)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;d:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break d}}if((k|0)!=0?(sa=c[k+12>>2]|0,(sa|0)!=0):0)k=_a[c[Qa+60>>2]&15](Qa,Ka,sa,c[Na>>2]|0,c[Ma>>2]|0,c[Pa>>2]|0)|0;else k=-71}else k=-71;while(0);Bg(c[Na>>2]|0);Bg(c[Ma>>2]|0);if(k|0)break a;c[oa>>2]=Ka;Ta=Xc(0,Oa,1024,14008,oa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}case 5:{c[C>>2]=Sa;c[C+4>>2]=Ja;c[C+8>>2]=Pa;c[C+12>>2]=Na;c[C+16>>2]=Ma;c[C+20>>2]=Ka;e:do if(!(Yc(f,0,h,Ha,14010,C)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;f:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break f}if(k|0?(ta=c[k+12>>2]|0,ta|0):0){k=ab[c[Qa+64>>2]&1](Qa,Fa,ta,c[Ja>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;Bg(c[Ja>>2]|0);if(k|0){g=5;break e}c[pa>>2]=Fa;Wa=Xc(0,Oa,1024,14008,pa)|0;k=Wa+7|0;g=Ag(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;ri(g+7|0,Oa|0,Wa|0)|0;Ac(f,g,0,h,0,k,1)|0;Dc(f,0,h,k);Bg(g);g=0;k=0;break e}}while(0);Bg(c[Ja>>2]|0);g=5;k=-71}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 7:{c[D>>2]=Sa;if(Yc(f,0,h,Ha,14017,D)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;g:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break g}}if((k|0)!=0?(ua=c[k+12>>2]|0,(ua|0)!=0):0){k=Ya[c[Qa+68>>2]&3](Qa,Pa,1024,ua)|0;if(!k){c[qa>>2]=Pa;Ta=Xc(0,Oa,1024,14019,qa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);break a}case 8:{c[E>>2]=Sa;c[E+4>>2]=Pa;h:do if((Yc(f,0,h,Ha,14021,E)|0)==0?(Y=c[Sa>>2]|0,Z=f+552|0,K=c[f+556>>2]|0,(K|0)!=(Z|0)):0){k=K;while(1){if((c[k+8>>2]|0)==(Y|0))break;k=c[k+4>>2]|0;if((k|0)==(Z|0))break h}if(k|0?(_=c[k+12>>2]|0,_|0):0){k=Xa[c[Qa+32>>2]&31](Qa,_,Na)|0;if(k|0)break a;ua=Pa;va=c[ua+4>>2]|0;xa=c[Na+16>>2]|0;ya=c[Na+20>>2]|0;Ta=c[Na+24>>2]|0;Aa=Na+32|0;za=c[Aa>>2]|0;Aa=c[Aa+4>>2]|0;Ca=Na+40|0;Ba=c[Ca>>2]|0;Ca=c[Ca+4>>2]|0;Ea=Na+48|0;Da=c[Ea>>2]|0;Ea=c[Ea+4>>2]|0;Ga=Na+56|0;Fa=c[Ga>>2]|0;Ga=c[Ga+4>>2]|0;Ia=Na+64|0;Ha=c[Ia>>2]|0;Ia=c[Ia+4>>2]|0;Ka=Na+72|0;Ja=c[Ka>>2]|0;Ka=c[Ka+4>>2]|0;La=c[Na+80>>2]|0;Pa=Na+88|0;Ma=c[Pa>>2]|0;Pa=c[Pa+4>>2]|0;Qa=c[Na+96>>2]|0;Wa=Na+104|0;Sa=c[Wa>>2]|0;Wa=c[Wa+4>>2]|0;Ua=c[Na+112>>2]|0;wa=R;c[wa>>2]=c[ua>>2];c[wa+4>>2]=va;c[R+8>>2]=Na;c[R+12>>2]=xa;c[R+16>>2]=ya;c[R+20>>2]=Ta;Ta=R+24|0;c[Ta>>2]=za;c[Ta+4>>2]=Aa;Ta=R+32|0;c[Ta>>2]=Ba;c[Ta+4>>2]=Ca;Ta=R+40|0;c[Ta>>2]=Da;c[Ta+4>>2]=Ea;Ta=R+48|0;c[Ta>>2]=Fa;c[Ta+4>>2]=Ga;Ta=R+56|0;c[Ta>>2]=Ha;c[Ta+4>>2]=Ia;Ta=R+64|0;c[Ta>>2]=Ja;c[Ta+4>>2]=Ka;Ta=R+72|0;c[Ta>>2]=La;c[Ta+4>>2]=0;Ta=R+80|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Pa;Ta=R+88|0;c[Ta>>2]=Qa;c[Ta+4>>2]=0;Ta=R+96|0;c[Ta>>2]=Sa;c[Ta+4>>2]=Wa;Ta=R+104|0;c[Ta>>2]=Ua;c[Ta+4>>2]=0;Ta=R+112|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+120|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+128|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+136|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=Xc(0,Oa,1024,14024,R)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 9:{c[F>>2]=Sa;c[F+4>>2]=Pa;c[F+8>>2]=Na;c[F+12>>2]=Ma;c[F+16>>2]=Ka;c[F+20>>2]=Ja;c[F+24>>2]=Fa;c[F+28>>2]=ja;c[F+32>>2]=ka;c[F+36>>2]=la;i:do if(!(Yc(f,0,h,Ha,14045,F)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){g=4;k=0;break i}}if((k|0)!=0?(va=c[k+12>>2]|0,(va|0)!=0):0){La=Fa;Oa=ja;Wa=ka;k=la;k=bb[c[Qa+36>>2]&1](Qa,va,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0,c[Ja>>2]|0,c[Ja+4>>2]|0,c[La>>2]|0,c[La+4>>2]|0,c[Oa>>2]|0,c[Oa+4>>2]|0,c[Wa>>2]|0,c[Wa+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;if(!k){g=Ag(7)|0;a[g>>0]=7;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ac(f,g,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(g);g=0;k=0}else g=5}else{g=4;k=0}}else{g=4;k=0}}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:case 4:{Ua=262;break a}default:i=0}l=Va;return i|0}case 16:{c[G>>2]=Sa;c[G+4>>2]=Na;c[G+8>>2]=Pa;j:do if((Yc(f,0,h,Ha,14056,G)|0)==0?($=c[Sa>>2]|0,aa=f+552|0,L=c[f+556>>2]|0,(L|0)!=(aa|0)):0){k=L;while(1){if((c[k+8>>2]|0)==($|0))break;k=c[k+4>>2]|0;if((k|0)==(aa|0))break j}if(k|0?(ma=c[k+12>>2]|0,ma|0):0){k=c[Pa>>2]|0;g=Ag(k+4|0)|0;Wa=Na;k=_a[c[Qa+44>>2]&15](Qa,ma,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0)break a;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,g|0,k+4|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Bg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 21:{c[I>>2]=Sa;if(Yc(f,0,h,Ha,14017,I)|0){Ua=262;break a}Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}case 22:{n=Pa+28|0;c[J>>2]=Sa;c[J+4>>2]=Pa;c[J+8>>2]=Pa+4;c[J+12>>2]=Pa+8;c[J+16>>2]=Pa+16;c[J+20>>2]=Pa+24;c[J+24>>2]=n;if(Yc(f,0,h,Ha,14060,J)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;k:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=106;break k}}if((k|0)!=0?(ya=c[k+12>>2]|0,(ya|0)!=0):0){k=Xa[c[Qa+80>>2]&31](Qa,ya,Pa)|0;Bg(c[n>>2]|0);if((k|0)>=0){c[xa>>2]=k;Ta=Xc(0,Oa,1024,14068,xa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=106}else Ua=106;while(0);if((Ua|0)==106){Bg(c[n>>2]|0);k=-71}break a}case 23:{n=Pa+8|0;o=Pa+16|0;p=Pa+24|0;q=Pa+28|0;c[ea>>2]=Sa;c[ea+4>>2]=Pa;c[ea+8>>2]=n;c[ea+12>>2]=o;c[ea+16>>2]=p;c[ea+20>>2]=q;if(Yc(f,0,h,Ha,14070,ea)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;l:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break l}}if((k|0)!=0?(Ba=c[k+12>>2]|0,(Ba|0)!=0):0){k=Xa[c[Qa+84>>2]&31](Qa,Ba,Pa)|0;if((k|0)>=0){c[Aa>>2]=Pa;c[Aa+4>>2]=n;c[Aa+8>>2]=o;c[Aa+12>>2]=p;c[Aa+16>>2]=q;Ta=Xc(0,Oa,1024,14077,Aa)|0;Bg(c[q>>2]|0);Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);Bg(c[q>>2]|0);break a}case 31:{c[n>>2]=Sa;c[n+4>>2]=Pa;c[n+8>>2]=Na;if(Yc(f,0,h,Ha,14083,n)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;m:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=127;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==127)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=134;break m}}if((k|0)!=0?(Ca=c[k+12>>2]|0,(m|0)!=0&(Ca|0)!=0):0){k=Ya[c[Qa+56>>2]&3](Qa,m,Ca,c[Na>>2]|0)|0;Bg(c[Na>>2]|0);if(!k){Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=134}else Ua=134;while(0);if((Ua|0)==134){Bg(c[Na>>2]|0);k=-71}break a}case 32:{c[o>>2]=Sa;c[o+4>>2]=Ma;c[o+8>>2]=Pa;c[o+12>>2]=Na;n:do if((Yc(f,0,h,Ha,14087,o)|0)==0?(ba=c[Sa>>2]|0,ca=f+552|0,M=c[f+556>>2]|0,(M|0)!=(ca|0)):0){k=M;while(1){if((c[k+8>>2]|0)==(ba|0))break;k=c[k+4>>2]|0;if((k|0)==(ca|0))break n}if(k|0?(da=c[k+12>>2]|0,da|0):0){k=_a[c[Qa+20>>2]&15](Qa,Ka,da,c[Ma>>2]|0,c[Pa>>2]|0,c[Na>>2]|0)|0;if(k|0)break a;c[Q>>2]=Ka;Ta=Xc(0,Oa,1024,14008,Q)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 33:{c[q>>2]=Sa;c[q+4>>2]=Na;c[q+8>>2]=Pa;c[q+12>>2]=Ma;if(Yc(f,0,h,Ha,14092,q)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;o:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=156;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==156)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){k=-71;break o}}if((k|0)!=0?(Da=c[k+12>>2]|0,(m|0)!=0&(Da|0)!=0):0)k=Za[c[Qa+72>>2]&7](Qa,m,c[Na>>2]|0,Da,c[Ma>>2]|0)|0;else k=-71}else k=-71;while(0);Bg(c[Na>>2]|0);Bg(c[Ma>>2]|0);if(k|0)break a;Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}case 34:{c[r>>2]=Sa;c[r+4>>2]=Na;c[r+8>>2]=Pa;if(Yc(f,0,h,Ha,14097,r)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;p:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=174;break p}}if((k|0)!=0?(wa=c[k+12>>2]|0,(wa|0)!=0):0){k=Xa[c[Qa+76>>2]&31](Qa,wa,c[Na>>2]|0)|0;Bg(c[Na>>2]|0);if(!k){Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=174}else Ua=174;while(0);if((Ua|0)==174){Bg(c[Na>>2]|0);k=-71}break a}case 46:{c[s>>2]=Sa;c[s+4>>2]=Pa;if(Yc(f,0,h,Ha,14101,s)|0){Ua=262;break a}Ta=f+548|0;c[Ta>>2]=c[Sa>>2];Bg(c[Pa>>2]|0);c[t>>2]=c[Ta>>2];c[t+4>>2]=14104;Ta=Xc(0,Oa,1024,14101,t)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}case 48:{c[u>>2]=Sa;c[u+4>>2]=Pa;c[u+8>>2]=Ma;c[u+12>>2]=Ka;c[u+16>>2]=Na;if(!(Yc(f,0,h,Ha,14113,u)|0)){k=_a[c[Qa+12>>2]&15](Qa,Fa,Ja,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;if(!k){p=c[Sa>>2]|0;m=c[Fa>>2]|0;n=f+552|0;o=f+556|0;g=c[o>>2]|0;q:do if((g|0)!=(n|0)){k=g;while(1){if((c[k+8>>2]|0)==(p|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=190;break q}}if(k){Qa=c[La>>2]|0;Wa=k+12|0;db[c[Qa+4>>2]&15](Qa,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=190}else Ua=190;while(0);if((Ua|0)==190){Wa=Ag(16)|0;c[Wa+8>>2]=p;c[Wa+12>>2]=m;c[o>>2]=Wa;c[Wa>>2]=n;c[Wa+4>>2]=g;c[g>>2]=Wa}Bg(c[Ma>>2]|0);Bg(c[Ka>>2]|0);c[za>>2]=Ja;Wa=Xc(0,Oa,1024,14008,za)|0;k=Wa+7|0;g=Ag(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;ri(g+7|0,Oa|0,Wa|0)|0;Ac(f,g,0,h,0,k,1)|0;Dc(f,0,h,k);Bg(g);g=0;k=0}else g=5}else{g=2;k=0}switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 50:{c[v>>2]=Sa;if(Yc(f,0,h,Ha,14119,v)|0){Ua=262;break a}Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}case 51:{c[w>>2]=Sa;c[w+4>>2]=Pa;c[w+8>>2]=Na;r:do if(!(Yc(f,0,h,Ha,14121,w)|0)){g=c[Sa>>2]|0;p=f+552|0;q=f+556|0;k=c[q>>2]|0;s:do if((k|0)!=(p|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0))break s}if(k|0){k=c[k+12>>2]|0;c[Ma>>2]=k;if(!k)break r;m=lf(e[Na>>1]<<2)|0;Wa=b[Na>>1]|0;n=Ag((Wa&65535)<<4)|0;t:do if(!(Wa<<16>>16)){g=0;Ua=209}else{k=0;do{c[Ea>>2]=m+(k<<2);k=k+1|0;if(Yc(f,0,h,Ha,14019,Ea)|0){k=-71;break t}g=b[Na>>1]|0}while(k>>>0<(g&65535)>>>0);g=g&65535;k=c[Ma>>2]|0;Ua=209}while(0);if((Ua|0)==209)k=_a[c[Qa+16>>2]&15](Qa,Ma,n,k,g,m)|0;if(b[Na>>1]|0){g=0;do{Bg(c[m+(g<<2)>>2]|0);g=g+1|0}while(g>>>0<(e[Na>>1]|0)>>>0)}Bg(m);if((k|0)<0){Bg(n);break a}c[Ga>>2]=k;g=Xc(0,Oa,1024,14119,Ga)|0;if(!k)o=g;else{m=0;do{c[Ia>>2]=n+(m<<4);g=(Xc(0,Oa+g|0,1024-g|0,14008,Ia)|0)+g|0;m=m+1|0}while((m|0)<(k|0));o=g}Bg(n);n=c[Pa>>2]|0;m=c[Ma>>2]|0;g=c[q>>2]|0;u:do if((g|0)!=(p|0)){k=g;while(1){if((c[k+8>>2]|0)==(n|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0)){Ua=223;break u}}if(k){Ta=c[La>>2]|0;Wa=k+12|0;db[c[Ta+4>>2]&15](Ta,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=223}else Ua=223;while(0);if((Ua|0)==223){Wa=Ag(16)|0;c[Wa+8>>2]=n;c[Wa+12>>2]=m;c[q>>2]=Wa;c[Wa>>2]=p;c[Wa+4>>2]=g;c[g>>2]=Wa}Ua=o+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,o|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);c[Ma>>2]=0}while(0);Ua=262;break a}case 54:{c[x>>2]=Sa;c[x+4>>2]=Na;c[x+8>>2]=Pa;v:do if((Yc(f,0,h,Ha,14056,x)|0)==0?(S=c[Sa>>2]|0,T=f+552|0,N=c[f+556>>2]|0,(N|0)!=(T|0)):0){k=N;while(1){if((c[k+8>>2]|0)==(S|0))break;k=c[k+4>>2]|0;if((k|0)==(T|0))break v}if(k|0?(ga=c[k+12>>2]|0,ga|0):0){k=c[Pa>>2]|0;g=Ag(k+4|0)|0;Wa=Na;k=_a[c[Qa+48>>2]&15](Qa,ga,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0){Bg(g);break a}a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,g|0,k+4|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Bg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 55:{c[y>>2]=Sa;c[y+4>>2]=Na;c[y+8>>2]=Pa;w:do if((Yc(f,0,h,Ha,14056,y)|0)==0?(U=c[Sa>>2]|0,V=f+552|0,O=c[f+556>>2]|0,(O|0)!=(V|0)):0){k=O;while(1){if((c[k+8>>2]|0)==(U|0))break;k=c[k+4>>2]|0;if((k|0)==(V|0))break w}if(k|0?(ha=c[k+12>>2]|0,ha|0):0){Wa=c[Pa>>2]|0;g=Ag(Wa)|0;if(Ac(f,g,0,h,c[Ha>>2]|0,Wa,0)|0){Bg(g);break}k=Na;k=_a[c[Qa+52>>2]&15](Qa,ha,c[k>>2]|0,c[k+4>>2]|0,g,c[Pa>>2]|0)|0;Bg(g);if((k|0)<0)break a;c[fa>>2]=k;Ta=Xc(0,Oa,1024,14017,fa)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Oa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 56:{c[z>>2]=Sa;if(Yc(f,0,h,Ha,14017,z)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;x:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break x}if(k|0){Ua=c[La>>2]|0;db[c[Ua+4>>2]&15](Ua,c[k+12>>2]|0);Ua=c[k>>2]|0;Wa=c[k+4>>2]|0;c[Ua+4>>2]=Wa;c[Wa>>2]=Ua;Bg(k)}}while(0);Wa=Ag(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ac(f,Wa,0,h,0,7,1)|0;Dc(f,0,h,7);Bg(Wa);Wa=0;l=Va;return Wa|0}default:{c[A>>2]=Ra;Yh(14125,A)|0;Ua=262;break a}}while(0)}else{i=0;j=0;Ua=262}while(0);if((Ua|0)==262)k=-71;c[Ta>>2]=0-k;Ta=Xc(0,Sa,4,14017,Ta)|0;Ua=Ta+7|0;Wa=Ag(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=7;a[Wa+5>>0]=i;a[Wa+6>>0]=j;ri(Wa+7|0,Sa|0,Ta|0)|0;Ac(f,Wa,0,h,0,Ua,1)|0;Dc(f,0,h,Ua);Bg(Wa);Wa=0;l=Va;return Wa|0}function Xc(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;c[k>>2]=g;j=d+e|0;e=a[f>>0]|0;if(!(e<<24>>24)){k=d;d=k-d|0;l=m;return d|0}b=d;a:while(1){f=f+1|0;switch(e<<24>>24|0){case 98:{e=b+1|0;if(e>>>0>j>>>0){e=5;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;b=e;break}case 104:{e=b+2|0;if(e>>>0>j>>>0){e=8;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;b=e;break}case 119:{e=b+4|0;if(e>>>0>j>>>0){e=11;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=i>>>8;a[b+2>>0]=i>>>16;a[b+3>>0]=i>>>24;b=e;break}case 100:{e=b+8|0;if(e>>>0>j>>>0){e=14;break a}g=(c[k>>2]|0)+(8-1)&~(8-1);i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;c[k>>2]=g+8;a[b>>0]=h;a[b+1>>0]=h>>>8;a[b+2>>0]=h>>>16;a[b+3>>0]=h>>>24;a[b+4>>0]=i;a[b+5>>0]=ni(h|0,i|0,40)|0;a[b+6>>0]=ni(h|0,i|0,48)|0;a[b+7>>0]=ni(h|0,i|0,56)|0;b=e;break}case 115:{i=(c[k>>2]|0)+(4-1)&~(4-1);h=c[i>>2]|0;c[k>>2]=i+4;i=Pg(h)|0;if((i|0)>=65536){e=17;break a}e=b+2|0;g=e+i|0;if(g>>>0>j>>>0){e=19;break a}a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;ri(e|0,h|0,i|0)|0;b=g;break}case 81:{e=b+13|0;if(e>>>0>j>>>0){e=22;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=a[i>>0]|0;h=c[i+4>>2]|0;a[b+1>>0]=h;a[b+2>>0]=h>>>8;a[b+3>>0]=h>>>16;a[b+4>>0]=h>>>24;i=i+8|0;h=c[i>>2]|0;i=c[i+4>>2]|0;a[b+5>>0]=h;a[b+6>>0]=h>>>8;a[b+7>>0]=h>>>16;a[b+8>>0]=h>>>24;a[b+9>>0]=i;a[b+10>>0]=ni(h|0,i|0,40)|0;a[b+11>>0]=ni(h|0,i|0,48)|0;a[b+12>>0]=ni(h|0,i|0,56)|0;b=e;break}default:{e=24;break a}}e=a[f>>0]|0;if(!(e<<24>>24)){e=26;break}}if((e|0)==5)ja(14158,13903,1783,14177);else if((e|0)==8)ja(14186,13903,1793,14177);else if((e|0)==11)ja(14205,13903,1803,14177);else if((e|0)==14)ja(14224,13903,1813,14177);else if((e|0)==17)ja(14243,13903,1832,14177);else if((e|0)==19)ja(14256,13903,1833,14177);else if((e|0)==22)ja(14281,13903,1843,14177);else if((e|0)==24)ra();else if((e|0)==26){k=b;d=k-d|0;l=m;return d|0}return 0}function Yc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;x=l;l=l+32|0;u=x+16|0;v=x;m=c[h>>2]|0;c[u>>2]=j;k=a[i>>0]|0;a:do if(k<<24>>24){n=v+1|0;o=v+2|0;p=v+3|0;q=v+4|0;r=v+5|0;s=v+6|0;t=v+7|0;j=m;b:while(1){i=i+1|0;switch(k<<24>>24|0){case 98:{if(Ac(e,v,f,g,j,1,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;a[m>>0]=a[v>>0]|0;j=j+1|0;break}case 104:{if(Ac(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;b[m>>1]=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;break}case 119:{if(Ac(e,v,f,g,j,4,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;j=j+4|0;break}case 100:{if(Ac(e,v,f,g,j,8,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;k=(d[r>>0]|0)<<8|(d[q>>0]|0)|(d[s>>0]|0)<<16|(d[t>>0]|0)<<24;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;c[m+4>>2]=k;j=j+8|0;break}case 115:{if(Ac(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}m=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;k=Ag(m+1|0)|0;if(Ac(e,k,f,g,j,m,0)|0){j=-1;k=18;break b}a[k+m>>0]=0;z=(c[u>>2]|0)+(4-1)&~(4-1);y=c[z>>2]|0;c[u>>2]=z+4;c[y>>2]=k;j=m+j|0;break}default:{k=15;break b}}k=a[i>>0]|0;if(!(k<<24>>24)){w=j;break a}}if((k|0)==15)ra();else if((k|0)==18){l=x;return j|0}}else w=m;while(0);c[h>>2]=w;z=0;l=x;return z|0}function Zc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[e>>2]|0;a=c[e+4>>2]|0;_c(b,d,e);c[f+560>>2]=0;xc(f,a);return}function _c(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+64|0;k=m+40|0;j=m+32|0;g=m+48|0;h=m;i=c[f>>2]|0;if((e|0)<0){d=c[f+4>>2]|0;h=c[f+8>>2]|0;n=b[f+12>>1]|0;c[j>>2]=0-e;e=Xc(0,g,4,14017,j)|0;j=e+7|0;k=Ag(j)|0;a[k>>0]=j;a[k+1>>0]=j>>>8;a[k+2>>0]=j>>>16;a[k+3>>0]=j>>>24;a[k+4>>0]=7;a[k+5>>0]=n;a[k+6>>0]=(n&65535)>>>8;ri(k+7|0,g|0,e|0)|0;Ac(i,k,d,h,0,j,1)|0;Dc(i,d,h,j);Bg(k);Bg(f);l=m;return}else{e=(c[i+548>>2]|0)+-24|0;c[k>>2]=d;c[k+4>>2]=e;e=Xc(0,h,32,14e3,k)|0;g=c[f+4>>2]|0;j=c[f+8>>2]|0;d=b[f+12>>1]|0;k=e+7|0;n=Ag(k)|0;a[n>>0]=k;a[n+1>>0]=k>>>8;a[n+2>>0]=k>>>16;a[n+3>>0]=k>>>24;a[n+4>>0]=13;a[n+5>>0]=d;a[n+6>>0]=(d&65535)>>>8;ri(n+7|0,h|0,e|0)|0;Ac(i,n,g,j,0,k,1)|0;Dc(i,g,j,k);Bg(n);Bg(f);l=m;return}}function $c(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+32|0;d=e+16|0;c[d>>2]=b;_a[c[a+16>>2]&15](a,d,e,b,0,0)|0;l=e;return c[d>>2]|0}function ad(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;p=r+20|0;j=r+24|0;k=r+16|0;q=r;c[p>>2]=d;i=(f|0)==0;n=b+16|0;o=b+4|0;m=1;g=(a[e>>0]|0)==47?e+1|0:e;while(1){h=Tg(g,47)|0;if(!h){c[j>>2]=g;if(!i){e=5;break}g=1;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0}else{e=h-g|0;s=Ag(e+1|0)|0;c[j>>2]=s;ri(s|0,g|0,e|0)|0;a[s+e>>0]=0;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0;Bg(c[j>>2]|0);g=0}if(!m)db[c[o>>2]&15](b,c[p>>2]|0);d=c[k>>2]|0;c[p>>2]=d;if((e|0)<1){e=13;break}if(g){e=15;break}else{m=0;g=h+1|0}}if((e|0)==5){c[f>>2]=g;if(!m){s=d;l=r;return s|0}if((_a[c[n>>2]&15](b,p,q,d,0,0)|0)<0){c[p>>2]=0;s=0;l=r;return s|0}else{s=c[p>>2]|0;l=r;return s|0}}else if((e|0)==13){db[c[o>>2]&15](b,d);c[p>>2]=0;s=0;l=r;return s|0}else if((e|0)==15){l=r;return d|0}return 0}function bd(a,b,c){a=a|0;b=b|0;c=c|0;return ad(a,b,c,0)|0}function cd(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=l;l=l+16|0;e=m;b=lf(208)|0;c[b>>2]=9;c[b+4>>2]=7;c[b+8>>2]=8;c[b+12>>2]=1;c[b+16>>2]=2;c[b+20>>2]=3;c[b+24>>2]=4;c[b+28>>2]=1;c[b+32>>2]=10;c[b+36>>2]=1;c[b+40>>2]=9;c[b+44>>2]=5;c[b+48>>2]=6;c[b+52>>2]=7;c[b+56>>2]=1;c[b+60>>2]=8;c[b+64>>2]=1;c[b+68>>2]=2;c[b+72>>2]=6;c[b+76>>2]=11;c[b+80>>2]=12;c[b+84>>2]=13;n=b+88|0;c[n>>2]=n;o=b+92|0;c[o>>2]=n;j=b+128|0;f=j;c[f>>2]=1;c[f+4>>2]=0;f=b+136|0;c[f>>2]=12;g=b+140|0;c[g>>2]=4096;h=b+104|0;c[h>>2]=1048576;c[h+4>>2]=0;h=b+120|0;c[h>>2]=262144;c[h+4>>2]=0;h=b+148|0;c[h>>2]=h;c[b+152>>2]=h;h=b+168|0;c[h>>2]=67108864;c[h+4>>2]=0;h=b+176|0;c[h>>2]=h;c[b+180>>2]=h;h=b+184|0;c[h>>2]=h;c[b+188>>2]=h;h=b+192|0;c[h>>2]=h;c[b+196>>2]=h;h=lf(104)|0;i=h+16|0;c[i>>2]=1;c[h+20>>2]=0;p=j;d=c[p+4>>2]|0;k=h+8|0;c[k>>2]=c[p>>2];c[k+4>>2]=d;k=j;k=ei(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[j>>2]=k;c[j+4>>2]=y;j=h+24|0;c[j>>2]=4;c[h+28>>2]=511;c[h+32>>2]=0;c[h+36>>2]=0;k=h+56|0;c[k>>2]=k;c[h+60>>2]=k;d=c[o>>2]|0;c[o>>2]=h;c[h>>2]=n;c[h+4>>2]=d;c[d>>2]=h;d=b+96|0;n=d;n=ei(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;c[d>>2]=n;c[d+4>>2]=y;Oa(e|0,0)|0;d=c[e>>2]|0;c[h+40>>2]=d;e=(c[e+4>>2]|0)*1e3|0;c[h+48>>2]=e;c[h+44>>2]=d;c[h+52>>2]=e;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)!=4)ja(14301,14319,456,14328);p=lf(18)|0;c[p+8>>2]=h;d=p+13|0;a[d>>0]=46;a[d+1>>0]=0;d=h+64|0;e=c[d>>2]|0;o=e+18|0;t=ei(c[g>>2]|0,0,-1,-1)|0;s=y;n=ei(t|0,s|0,o|0,((o|0)<0)<<31>>31|0)|0;r=c[f>>2]|0;n=ni(n|0,y|0,r|0)|0;q=y;e=ei(t|0,s|0,e|0,((e|0)<0)<<31>>31|0)|0;r=ni(e|0,y|0,r|0)|0;e=b+112|0;s=e;r=fi(c[s>>2]|0,c[s+4>>2]|0,r|0,y|0)|0;q=ei(r|0,y|0,n|0,q|0)|0;n=e;c[n>>2]=q;c[n+4>>2]=y;c[d>>2]=o;o=c[k>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[p+4>>2]=k;c[k>>2]=p;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)==4){t=lf(19)|0;c[t+8>>2]=h;o=t+13|0;a[o>>0]=a[14342]|0;a[o+1>>0]=a[14343]|0;a[o+2>>0]=a[14344]|0;o=c[d>>2]|0;s=o+19|0;j=ei(c[g>>2]|0,0,-1,-1)|0;n=y;r=ei(j|0,n|0,s|0,((s|0)<0)<<31>>31|0)|0;p=c[f>>2]|0;r=ni(r|0,y|0,p|0)|0;q=y;o=ei(j|0,n|0,o|0,((o|0)<0)<<31>>31|0)|0;p=ni(o|0,y|0,p|0)|0;o=e;p=fi(c[o>>2]|0,c[o+4>>2]|0,p|0,y|0)|0;q=ei(p|0,y|0,r|0,q|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;c[d>>2]=s;s=c[k>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[t+4>>2]=k;c[k>>2]=t;c[b+144>>2]=h;l=m;return b|0}else ja(14301,14319,456,14328);return 0}function dd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+88|0;b=c[a+92>>2]|0;if((b|0)!=(h|0))do{e=b;b=c[b+4>>2]|0;c[e+16>>2]=0;if((c[e+24>>2]|0)==4){g=e+56|0;f=e+60|0;d=c[f>>2]|0;if((d|0)!=(g|0))do{j=d+4|0;i=d;d=c[j>>2]|0;k=c[i>>2]|0;c[k+4>>2]=d;c[d>>2]=k;c[i>>2]=0;c[j>>2]=0;Bg(i)}while((d|0)!=(g|0));c[g>>2]=g;c[f>>2]=g}Ad(a,e)}while((b|0)!=(h|0));k=a+148|0;if((c[k+4>>2]|0)==(k|0)){Bg(c[a+200>>2]|0);return}else ja(15144,14319,1527,15178)}function ed(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+8|0;if(c[d>>2]|0)c[d>>2]=0;d=b+16|0;e=c[d>>2]|0;if(e|0){f=c[e+4>>2]|0;if(f|0)c[f>>2]=0;Bg(e);c[d>>2]=0}d=c[b+4>>2]|0;e=d+20|0;f=c[e>>2]|0;if((f|0)<=0)ja(14992,14319,397,15011);c[e>>2]=f+-1;if((f|0)!=1){Bg(b);return}if((c[d+16>>2]|0)>=1){Bg(b);return}Ad(a,d);Bg(b);return}function fd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=1024;d=a+120|0;e=d;f=a+136|0;e=oi(c[e>>2]|0,c[e+4>>2]|0,(c[f>>2]|0)+-10|0)|0;g=b+8|0;c[g>>2]=e;c[g+4>>2]=y;g=a+112|0;g=fi(c[d>>2]|0,c[d+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0)|0;f=oi(g|0,y|0,(c[f>>2]|0)+-10|0)|0;g=y;d=b+16|0;c[d>>2]=f;c[d+4>>2]=g;d=b+24|0;c[d>>2]=f;c[d+4>>2]=g;d=a+104|0;g=d;f=c[g+4>>2]|0;e=b+32|0;c[e>>2]=c[g>>2];c[e+4>>2]=f;a=a+96|0;a=fi(c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;b=b+40|0;c[b>>2]=a;c[b+4>>2]=y;return}function gd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=b+144|0;g=c[b>>2]|0;h=lf(20)|0;i=g+20|0;c[i>>2]=(c[i>>2]|0)+1;c[h+4>>2]=g;c[h>>2]=f;c[d>>2]=h;b=c[b>>2]|0;d=c[b+24>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;g=b+8|0;h=c[g+4>>2]|0;i=e+8|0;c[i>>2]=c[g>>2];c[i+4>>2]=h;return 0}function hd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=c[f+4>>2]|0;a:do if((g|0)>0){b=0;do{k=c[h+(b<<2)>>2]|0;if((c[i+24>>2]|0)!=4)break a;l=i+56|0;j=c[i+60>>2]|0;if((j|0)==(l|0))break a;while(1){if(!(Og(j+13|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(l|0))break a}if(!j)break a;i=c[j+8>>2]|0;j=e+(b<<4)|0;k=c[i+24>>2]|0;do if((k|0)!=4)if((k|0)==10){a[j>>0]=2;break}else{a[j>>0]=0;break}else a[j>>0]=-128;while(0);c[e+(b<<4)+4>>2]=0;j=i+8|0;k=c[j+4>>2]|0;l=e+(b<<4)+8|0;c[l>>2]=c[j>>2];c[l+4>>2]=k;b=b+1|0}while((b|0)<(g|0))}else b=0;while(0);h=c[f>>2]|0;f=lf(20)|0;g=i+20|0;c[g>>2]=(c[g>>2]|0)+1;c[f+4>>2]=i;c[f>>2]=h;c[d>>2]=f;return b|0}function id(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;s=l;l=l+16|0;n=s;q=c[e+4>>2]|0;r=q+24|0;if((c[r>>2]|0)!=4){d=-20;l=s;return d|0}p=q+56|0;i=c[q+60>>2]|0;a:do if((i|0)!=(p|0)){while(1){if(!(Og(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(p|0))break a}if(i|0){d=-17;l=s;return d|0}}while(0);j=c[e>>2]|0;k=lf(104)|0;e=k+16|0;c[e>>2]=1;c[k+20>>2]=0;m=b+128|0;u=m;t=c[u+4>>2]|0;o=k+8|0;i=o;c[i>>2]=c[u>>2];c[i+4>>2]=t;i=m;i=ei(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[m>>2]=i;c[m+4>>2]=y;m=k+24|0;c[m>>2]=4;c[k+28>>2]=g&4095;c[k+32>>2]=j;c[k+36>>2]=h;j=k+56|0;c[j>>2]=j;c[k+60>>2]=j;g=b+92|0;h=c[g>>2]|0;c[g>>2]=k;c[k>>2]=b+88;c[k+4>>2]=h;c[h>>2]=k;h=b+96|0;g=h;g=ei(c[g>>2]|0,c[g+4>>2]|0,1,0)|0;c[h>>2]=g;c[h+4>>2]=y;Oa(n|0,0)|0;h=c[n>>2]|0;c[k+40>>2]=h;n=(c[n+4>>2]|0)*1e3|0;c[k+48>>2]=n;c[k+44>>2]=h;c[k+52>>2]=n;c[e>>2]=(c[e>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);u=lf(18)|0;c[u+8>>2]=k;e=u+13|0;a[e>>0]=46;a[e+1>>0]=0;e=k+64|0;i=c[e>>2]|0;t=i+18|0;g=b+140|0;z=ei(c[g>>2]|0,0,-1,-1)|0;x=y;v=ei(z|0,x|0,t|0,((t|0)<0)<<31>>31|0)|0;h=b+136|0;w=c[h>>2]|0;v=ni(v|0,y|0,w|0)|0;n=y;i=ei(z|0,x|0,i|0,((i|0)<0)<<31>>31|0)|0;w=ni(i|0,y|0,w|0)|0;i=b+112|0;b=i;b=fi(c[b>>2]|0,c[b+4>>2]|0,w|0,y|0)|0;n=ei(b|0,y|0,v|0,n|0)|0;b=i;c[b>>2]=n;c[b+4>>2]=y;c[e>>2]=t;t=c[j>>2]|0;c[t+4>>2]=u;c[u>>2]=t;c[u+4>>2]=j;c[j>>2]=u;u=q+16|0;c[u>>2]=(c[u>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);z=lf(19)|0;c[z+8>>2]=q;t=z+13|0;a[t>>0]=a[14342]|0;a[t+1>>0]=a[14343]|0;a[t+2>>0]=a[14344]|0;t=c[e>>2]|0;x=t+19|0;n=ei(c[g>>2]|0,0,-1,-1)|0;b=y;w=ei(n|0,b|0,x|0,((x|0)<0)<<31>>31|0)|0;u=c[h>>2]|0;w=ni(w|0,y|0,u|0)|0;v=y;t=ei(n|0,b|0,t|0,((t|0)<0)<<31>>31|0)|0;u=ni(t|0,y|0,u|0)|0;t=i;u=fi(c[t>>2]|0,c[t+4>>2]|0,u|0,y|0)|0;v=ei(u|0,y|0,w|0,v|0)|0;w=i;c[w>>2]=v;c[w+4>>2]=y;c[e>>2]=x;x=c[j>>2]|0;c[x+4>>2]=z;c[z>>2]=x;c[z+4>>2]=j;c[j>>2]=z;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);x=Pg(f)|0;w=x+17|0;z=lf(w)|0;c[z+8>>2]=k;ri(z+13|0,f|0,x+1|0)|0;x=q+64|0;r=c[x>>2]|0;w=r+w|0;f=ei(c[g>>2]|0,0,-1,-1)|0;q=y;u=ei(f|0,q|0,w|0,((w|0)<0)<<31>>31|0)|0;t=c[h>>2]|0;u=ni(u|0,y|0,t|0)|0;v=y;r=ei(f|0,q|0,r|0,((r|0)<0)<<31>>31|0)|0;t=ni(r|0,y|0,t|0)|0;r=i;t=fi(c[r>>2]|0,c[r+4>>2]|0,t|0,y|0)|0;v=ei(t|0,y|0,u|0,v|0)|0;c[i>>2]=v;c[i+4>>2]=y;c[x>>2]=w;i=c[p>>2]|0;c[i+4>>2]=z;c[z>>2]=i;c[z+4>>2]=p;c[p>>2]=z;i=c[m>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;w=o;x=c[w+4>>2]|0;z=d+8|0;c[z>>2]=c[w>>2];c[z+4>>2]=x;z=0;l=s;return z|0}function jd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=c[e+4>>2]|0;l=e+8|0;if(c[l>>2]|0)c[l>>2]=0;i=e+16|0;j=c[i>>2]|0;if(j|0){k=c[j+4>>2]|0;if(k|0)c[k>>2]=0;Bg(j);c[i>>2]=0}j=u+24|0;i=c[j>>2]|0;a:do if(f&65536){if((i|0)!=4){h=-20;return h|0}}else{switch(i|0){case 4:case 8:break a;default:i=-22}return i|0}while(0);c[e+12>>2]=f;b:do if((c[j>>2]|0)==8){if(!((f&512|0)==0|(f&3|0)==0))Gd(b,u,0,0)|0;t=u+56|0;c:do switch(c[t>>2]|0){case 0:break b;case 1:{k=u+80|0;j=c[k>>2]|0;k=c[k+4>>2]|0;f=b+176|0;i=c[b+180>>2]|0;d:do if((i|0)!=(f|0)){while(1){s=i+8|0;if((c[s>>2]|0)==(j|0)?(c[s+4>>2]|0)==(k|0):0)break;i=c[i+4>>2]|0;if((i|0)==(f|0))break d}s=i+16|0;i=c[i+20>>2]|0;if((i|0)!=(s|0)){q=b+184|0;r=b+188|0;do{k=c[i+12>>2]|0;e:do if(!(c[i+8>>2]|0)){j=Ed(b,k)|0;if((j|0?(c[j+24>>2]|0)==8:0)?(c[j+56>>2]|0)==1:0)Hd(b,j,0)|0}else{j=c[r>>2]|0;if((j|0)!=(q|0)){while(1){if(!(Og(c[j+8>>2]|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(q|0))break e}if(j|0){o=Ed(b,k)|0;do if((o|0?(c[o+24>>2]|0)==8:0)?(c[o+56>>2]|0)==1:0){p=j+12|0;n=j+16|0;k=c[n>>2]|0;if((k|0)==(p|0))break e;f=0;d=0;m=0;do{l=Ed(b,c[k+24>>2]|0)|0;do if(l){if((c[l+24>>2]|0)!=8)break;f=(c[l+56>>2]|0)==1?1:f}while(0);l=k+16|0;m=ei(c[l>>2]|0,c[l+4>>2]|0,m|0,d|0)|0;d=y;k=c[k+4>>2]|0}while((k|0)!=(p|0));if(!f)break e;if(!((d|0)==0?(m|0)==(c[o+60>>2]|0):0))break;Hd(b,o,1)|0;j=c[n>>2]|0;if((j|0)==(p|0))break e;m=o+96|0;l=0;d=0;while(1){k=j+24|0;f=Ed(b,c[k>>2]|0)|0;f:do if(f|0){if((c[f+24>>2]|0)!=8)break;if((c[f+56>>2]|0)!=1)break;o=j+16|0;do if((c[o+4>>2]|0)==0?(c[o>>2]|0)==(c[f+60>>2]|0):0){n=f+80|0;o=j+8|0;if(!((c[n>>2]|0)==(c[o>>2]|0)?(c[n+4>>2]|0)==(c[o+4>>2]|0):0))break;Hd(b,f,2)|0;o=f+96|0;k=c[o>>2]|0;f=k+24|0;n=(c[m>>2]|0)+40|0;v=c[n>>2]|0;c[v+4>>2]=f;c[f>>2]=v;c[k+28>>2]=n;c[n>>2]=f;o=(c[o>>2]|0)+32|0;c[o>>2]=l;c[o+4>>2]=d;break f}while(0);k=Ed(b,c[k>>2]|0)|0;if(!k)break;if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Hd(b,k,0)|0}while(0);v=j+16|0;l=ei(c[v>>2]|0,c[v+4>>2]|0,l|0,d|0)|0;j=c[j+4>>2]|0;if((j|0)==(p|0))break e;else d=y}}while(0);f=j+12|0;j=c[j+16>>2]|0;if((j|0)!=(f|0))do{k=Ed(b,c[j+24>>2]|0)|0;do if(k|0){if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Hd(b,k,0)|0}while(0);j=c[j+4>>2]|0}while((j|0)!=(f|0))}}}while(0);i=c[i+4>>2]|0}while((i|0)!=(s|0));if((c[t>>2]|0)==2)break c}}while(0);i=Hd(b,u,0)|0;if(i|0){v=i;return v|0}v=c[u+96>>2]|0;c[v+48>>2]=e;c[v+52>>2]=g;c[v+56>>2]=h;v=1;return v|0}case 2:break;case 3:{h=u+88|0;v=c[h>>2]|0;g=u+92|0;e=c[g>>2]|0;c[v+4>>2]=e;c[e>>2]=v;c[h>>2]=0;c[g>>2]=0;e=b+148|0;b=e+4|0;v=c[b>>2]|0;c[b>>2]=h;c[h>>2]=e;c[g>>2]=v;c[v>>2]=h;break b}default:ra()}while(0);i=c[u+96>>2]|0;j=i+52|0;if(c[j>>2]|0){v=-5;return v|0}c[i+48>>2]=e;c[j>>2]=g;c[i+56>>2]=h;v=1;return v|0}while(0);c[l>>2]=1;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=u+8|0;h=c[g+4>>2]|0;v=d+8|0;c[v>>2]=c[g>>2];c[v+4>>2]=h;v=0;return v|0}function kd(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+16|0;u=x;w=e+4|0;v=c[w>>2]|0;r=v+24|0;if((c[r>>2]|0)!=4){d=-20;l=x;return d|0}s=v+56|0;j=c[v+60>>2]|0;a:do if((j|0)!=(s|0)){while(1){if(!(Og(j+13|0,f)|0))break;j=c[j+4>>2]|0;if((j|0)==(s|0))break a}if(j|0){d=-17;l=x;return d|0}}while(0);t=e+8|0;if(c[t>>2]|0)c[t>>2]=0;j=e+16|0;k=c[j>>2]|0;if(k|0){m=c[k+4>>2]|0;if(m|0)c[m>>2]=0;Bg(k);c[j>>2]=0}m=c[e>>2]|0;n=lf(104)|0;c[n+16>>2]=1;o=n+20|0;c[o>>2]=0;p=b+128|0;z=p;j=c[z+4>>2]|0;q=n+8|0;k=q;c[k>>2]=c[z>>2];c[k+4>>2]=j;k=p;k=ei(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[p>>2]=k;c[p+4>>2]=y;p=n+24|0;c[p>>2]=8;c[n+28>>2]=h&4095;c[n+32>>2]=m;c[n+36>>2]=i;Ga(n+64|0);h=b+92|0;i=c[h>>2]|0;c[h>>2]=n;c[n>>2]=b+88;c[n+4>>2]=i;c[i>>2]=n;i=b+96|0;h=i;h=ei(c[h>>2]|0,c[h+4>>2]|0,1,0)|0;c[i>>2]=h;c[i+4>>2]=y;Oa(u|0,0)|0;i=c[u>>2]|0;c[n+40>>2]=i;u=(c[u+4>>2]|0)*1e3|0;c[n+48>>2]=u;c[n+44>>2]=i;c[n+52>>2]=u;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);k=Pg(f)|0;m=k+17|0;j=lf(m)|0;c[j+8>>2]=n;ri(j+13|0,f|0,k+1|0)|0;k=v+64|0;z=c[k>>2]|0;m=z+m|0;f=ei(c[b+140>>2]|0,0,-1,-1)|0;h=y;u=ei(f|0,h|0,m|0,((m|0)<0)<<31>>31|0)|0;i=c[b+136>>2]|0;u=ni(u|0,y|0,i|0)|0;v=y;z=ei(f|0,h|0,z|0,((z|0)<0)<<31>>31|0)|0;i=ni(z|0,y|0,i|0)|0;z=b+112|0;h=z;i=fi(c[h>>2]|0,c[h+4>>2]|0,i|0,y|0)|0;v=ei(i|0,y|0,u|0,v|0)|0;c[z>>2]=v;c[z+4>>2]=y;c[k>>2]=m;k=c[s>>2]|0;c[k+4>>2]=j;c[j>>2]=k;c[j+4>>2]=s;c[s>>2]=j;j=c[w>>2]|0;k=j+20|0;m=c[k>>2]|0;if((m|0)<=0)ja(14992,14319,397,15011);c[k>>2]=m+-1;if((m|0)==1?(c[j+16>>2]|0)<1:0)Ad(b,j);c[o>>2]=(c[o>>2]|0)+1;c[w>>2]=n;c[t>>2]=1;c[e+12>>2]=g;j=c[p>>2]|0;do if((j|0)!=4)if((j|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=q;w=c[g+4>>2]|0;z=d+8|0;c[z>>2]=c[g>>2];c[z+4>>2]=w;z=0;l=x;return z|0}function ld(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;h=i+24|0;d=c[h>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;d=i+8|0;g=c[d+4>>2]|0;f=e+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=g;c[e+16>>2]=c[h>>2]<<12|c[i+28>>2];c[e+20>>2]=c[i+32>>2];c[e+24>>2]=c[i+36>>2];f=c[i+16>>2]|0;g=e+32|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;switch(c[h>>2]|0){case 2:case 6:{d=c[i+56>>2]<<8|c[i+60>>2];f=0;break}default:{d=0;f=0}}g=e+40|0;c[g>>2]=d;c[g+4>>2]=f;g=b+140|0;f=e+56|0;c[f>>2]=c[g>>2];c[f+4>>2]=0;switch(c[h>>2]|0){case 8:{d=c[i+60>>2]|0;f=0;break}case 10:{d=Pg(c[i+56>>2]|0)|0;f=0;break}case 4:{f=c[i+64>>2]|0;d=f;f=((f|0)<0)<<31>>31;break}default:{d=0;f=0}}h=e+48|0;c[h>>2]=d;c[h+4>>2]=f;g=c[g>>2]|0;h=ei(d|0,f|0,-1,-1)|0;g=ei(h|0,y|0,g|0,0)|0;b=c[b+136>>2]|0;g=ni(g|0,y|0,b|0)|0;b=oi(g|0,y|0,b+-9|0)|0;g=e+64|0;c[g>>2]=b;c[g+4>>2]=y;g=i+40|0;b=e+72|0;c[b>>2]=c[g>>2];c[b+4>>2]=0;b=i+48|0;c[e+80>>2]=c[b>>2];h=e+88|0;c[h>>2]=c[g>>2];c[h+4>>2]=0;c[e+96>>2]=c[b>>2];b=e+104|0;c[b>>2]=c[i+44>>2];c[b+4>>2]=0;c[e+112>>2]=c[i+52>>2];return 0}function md(a,b,d,e,f,g,h,i,j,k,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0;p=l;l=l+16|0;n=p;m=c[b+4>>2]|0;if(d&1|0)c[m+28>>2]=e;if(d&2|0)c[m+32>>2]=f;if(d&4|0)c[m+36>>2]=g;if(d&8|0?(s=Gd(a,m,h,i)|0,s|0):0){i=s;l=p;return i|0}do if(d&32|0)if(!(d&256)){Oa(n|0,0)|0;c[m+40>>2]=c[n>>2];c[m+48>>2]=(c[n+4>>2]|0)*1e3;break}else{c[m+40>>2]=o;c[m+48>>2]=q;break}while(0);if(!(d&64)){i=0;l=p;return i|0}Oa(n|0,0)|0;c[m+44>>2]=c[n>>2];c[m+52>>2]=(c[n+4>>2]|0)*1e3;i=0;l=p;return i|0}function nd(a,b){a=a|0;b=b|0;var d=0;a=b+8|0;if(c[a>>2]|0)c[a>>2]=0;a=b+16|0;b=c[a>>2]|0;if(!b)return;d=c[b+4>>2]|0;if(d|0)c[d>>2]=0;Bg(b);c[a>>2]=0;return}function od(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;return h|0}if((c[b+24>>2]|0)!=4){h=-71;return h|0}m=b+56|0;b=c[b+60>>2]|0;a:do if((e|0)==0&(f|0)==0){e=b;i=0;d=0}else{i=0;d=0;while(1){if((b|0)==(m|0)){b=0;break}i=ei(i|0,d|0,1,0)|0;d=y;b=c[b+4>>2]|0;if(!(d>>>0<f>>>0|(d|0)==(f|0)&i>>>0<e>>>0)){e=b;break a}}return b|0}while(0);if((e|0)==(m|0)){h=0;return h|0}b=0;while(1){f=e+13|0;j=Pg(f)|0;k=b+24|0;l=k+j|0;if((l|0)>(h|0)){d=11;break}i=ei(i|0,d|0,1,0)|0;d=y;p=c[e+8>>2]|0;n=p+24|0;o=c[n>>2]|0;a[g+b>>0]=(o|0)==4?-128:(o|0)==10?2:0;o=g+(b+1)|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;a[o+3>>0]=0;o=g+(b+5)|0;p=p+8|0;q=c[p>>2]|0;p=c[p+4>>2]|0;a[o>>0]=q;a[o+1>>0]=q>>>8;a[o+2>>0]=q>>>16;a[o+3>>0]=q>>>24;a[o+4>>0]=p;r=ni(q|0,p|0,40)|0;a[o+5>>0]=r;r=ni(q|0,p|0,48)|0;a[o+6>>0]=r;p=ni(q|0,p|0,56)|0;a[o+7>>0]=p;o=g+(b+13)|0;a[o>>0]=i;a[o+1>>0]=i>>>8;a[o+2>>0]=i>>>16;a[o+3>>0]=i>>>24;a[o+4>>0]=d;p=ni(i|0,d|0,40)|0;a[o+5>>0]=p;p=ni(i|0,d|0,48)|0;a[o+6>>0]=p;p=ni(i|0,d|0,56)|0;a[o+7>>0]=p;a[g+(b+21)>>0]=c[n>>2];b=g+(b+22)|0;a[b>>0]=j;a[b+1>>0]=(j&65535)>>>8;ri(g+k|0,f|0,j|0)|0;e=c[e+4>>2]|0;if((e|0)==(m|0)){b=l;d=11;break}else b=l}if((d|0)==11)return b|0;return 0}function pd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=c[b+4>>2]|0;if(!(c[b+8>>2]|0)){g=-71;return g|0}if((c[h+24>>2]|0)!=8){g=-5;return g|0}if((c[b+12>>2]&3|0)==1){g=-5;return g|0}if(!(c[h+100>>2]|0)){i=c[h+60>>2]|0;a=fi(i|0,0,d|0,e|0)|0;b=y;if(!(0>e>>>0|0==(e|0)&i>>>0>d>>>0)){i=0;return i|0}i=((g|0)<0)<<31>>31;i=b>>>0<i>>>0|(b|0)==(i|0)&a>>>0<g>>>0?a:g;Ha(h+64|0,d|0,f|0,i|0);return i|0}else{a=c[b+16>>2]|0;if(!a){i=-5;return i|0}i=c[a+8>>2]|0;i=(i|0)<(g|0)?i:g;ri(f|0,a+12|0,i|0)|0;return i|0}return 0}function qd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=l;l=l+4480|0;k=L+4448|0;A=L+4472|0;F=L+3408|0;H=L+2384|0;B=L+1360|0;J=L+336|0;x=L+208|0;v=L+80|0;z=L+4432|0;I=L+4464|0;w=L+4460|0;G=L+64|0;q=L+4456|0;m=L+4452|0;j=L;s=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;l=L;return h|0}if((c[s+24>>2]|0)!=8){h=-5;l=L;return h|0}if(!(c[d+12>>2]&3)){h=-5;l=L;return h|0}if(!h){h=0;l=L;return h|0}if(!(c[s+100>>2]|0)){f=ei(h|0,((h|0)<0)<<31>>31|0,e|0,f|0)|0;i=y;j=s+60|0;if(i>>>0>0|((i|0)==0?f>>>0>(c[j>>2]|0)>>>0:0)?(p=Gd(b,s,f,i)|0,p|0):0){h=p;l=L;return h|0}Oa(A|0,0)|0;c[s+40>>2]=c[A>>2];c[s+48>>2]=(c[A+4>>2]|0)*1e3;f=s+56|0;do if((c[f>>2]|0)==3){K=s+88|0;H=c[K>>2]|0;J=s+92|0;I=c[J>>2]|0;c[H+4>>2]=I;c[I>>2]=H;c[K>>2]=0;c[J>>2]=0;J=b+160|0;K=J;K=fi(c[K>>2]|0,c[K+4>>2]|0,c[j>>2]|0,0)|0;b=y;c[J>>2]=K;c[J+4>>2]=b;if((b|0)>-1|(b|0)==-1&K>>>0>4294967295){c[f>>2]=0;break}else ja(14470,14319,1283,14936)}while(0);La(s+64|0,e|0,g|0,h|0);l=L;return h|0}e=Ag(h+1|0)|0;ri(e|0,g|0,h|0)|0;a[e+h>>0]=0;c[m>>2]=e;a:do if((ie(j,64,m)|0)<0)K=104;else{do if(!(Og(j,14688)|0)){f=c[d>>2]|0;c[A>>2]=c[m>>2];p=d+16|0;b:do if((((((c[p>>2]|0)==0?(ie(J,1024,A)|0)>=0:0)?(ie(x,128,A)|0)>=0:0)?(ie(v,128,A)|0)>=0:0)?(ie(H,1024,A)|0)>=0:0)?(ie(F,1024,A)|0)>=0:0){do if(((ie(B,1024,A)|0)>=0?(r=Pg(B)|0,(r&1|0)==0):0)?(t=r>>1,(r|0)<=33):0){if((pe(G,B,t)|0)<0)break;if((r|0)<0){f=-5;break b}if((le(q,A)|0)<0){f=-5;break b}o=(t|0)==0;if((t|16|0)!=16){f=-5;break b}m=(a[x>>0]|0)==0?0:x;k=(a[v>>0]|0)==0?0:v;if(_a[c[b+12>>2]&15](b,I,z,f,28468,28468)|0)ja(14692,14319,2526,14740);n=ad(b,c[I>>2]|0,F,w)|0;do if(!n){f=-2;i=b+4|0}else{Xa[c[b+76>>2]&31](b,n,c[w>>2]|0)|0;f=$a[c[b+28>>2]&3](b,z,n,c[w>>2]|0,514,384,0)|0;c:do if((f|0)<0)j=0;else{do if(a[H>>0]|0){j=bd(b,c[I>>2]|0,H)|0;if(!j){j=0;f=-2;break c}f=_a[c[b+24>>2]&15](b,z,j,0,0,0)|0;if((f|0)<0)break c;f=c[j+4>>2]|0;if((c[f+24>>2]|0)!=8)ja(14751,14319,2555,14740);if(!(c[f+56>>2]|0)){C=j;D=c[f+60>>2]|0;E=0;break}else ja(14751,14319,2555,14740)}else{C=0;D=0;E=0}while(0);i=lf(260)|0;c[i+4>>2]=c[I>>2];c[i+8>>2]=n;c[i+12>>2]=C;if(o)f=0;else{f=i+16|0;rf(G,128,f)|0}I=lf(76)|0;c[I>>2]=0;c[I+8>>2]=0;c[I+4>>2]=i;c[i>>2]=d;c[p>>2]=I;be(b,n,J,m,k,C,D,E,2,i,f);f=0;break b}while(0);i=b+4|0;db[c[i>>2]&15](b,n);if(!j)break;db[c[i>>2]&15](b,j)}while(0);db[c[i>>2]&15](b,c[I>>2]|0);break b}while(0);f=-5}else f=-5;while(0)}else{if(!(Og(j,14806)|0)){c[A>>2]=c[m>>2];d:do if((((ie(H,1024,A)|0)>=0?(ie(J,1024,A)|0)>=0:0)?(ie(x,128,A)|0)>=0:0)?(ie(v,128,A)|0)>=0:0){do if(((ie(B,1024,A)|0)>=0?(i=Pg(B)|0,(i&1|0)==0):0)?(o=i>>1,(i|0)<=33):0){if((pe(G,B,o)|0)<0)break;if((i|0)<0){f=-22;break d}j=(a[x>>0]|0)==0?0:x;i=(a[v>>0]|0)==0?0:v;switch(o|0){case 0:{f=0;break}case 16:{rf(G,128,F)|0;f=F;break}default:{f=-22;break d}}Dd(b,H,J,j,i,f);f=0;break d}while(0);f=-22}else f=-22;while(0);break}if(!(Og(j,14819)|0)){c[A>>2]=c[m>>2];e:do if((ie(B,1024,A)|0)>=0){if((c[b>>2]|0)!=9)ja(14834,14319,1665,14849);i=b+192|0;f=c[i+4>>2]|0;if((f|0)!=(i|0)){while(1){if(!(Og(c[f+12>>2]|0,B)|0))break;f=c[f+4>>2]|0;if((f|0)==(i|0)){f=0;break e}}if(f){Bd(f);f=0}else f=0}else f=0}else f=-22;while(0);break}if(!(Og(j,14871)|0)){c[A>>2]=c[m>>2];if((((ie(J,1024,A)|0)>=0?(ie(B,1024,A)|0)>=0:0)?(ne(F,A)|0)>=0:0)?(ke(H,A)|0)>=0:0){f=Ed(b,J)|0;if(!f)f=-2;else{I=F;J=H;f=Fd(b,f,B,c[I>>2]|0,c[I+4>>2]|0,c[J>>2]|0,c[J+4>>2]|0)|0}}else f=-22;break}if(!(Og(j,14879)|0)){c[A>>2]=c[m>>2];f:do if((ie(B,1024,A)|0)>=0){f=Ed(b,B)|0;if(f)if((c[f+24>>2]|0)==8){switch(c[f+56>>2]|0){case 3:case 0:break;default:{f=-5;break f}}I=yh(B,47)|0;J=f+60|0;b=Ag(c[J>>2]|0)|0;Ha(f+64|0,0,b|0,c[J>>2]|0);Ma(((I|0)==0?B:I+1|0)|0,b|0,c[J>>2]|0);Bg(b);f=0}else f=-5;else f=-2}else f=-5;while(0);break}if(Og(j,14891)|0){if(Og(j,14898)|0){c[k>>2]=j;Yh(14913,k)|0;K=104;break a}c[A>>2]=c[m>>2];if((ie(B,1024,A)|0)<0)f=-22;else{f=b+200|0;Bg(c[f>>2]|0);c[f>>2]=Ah(B)|0;f=0}break}c[A>>2]=c[m>>2];j=d+16|0;g:do if(!(c[j>>2]|0)){do if(((ie(B,1024,A)|0)>=0?(n=Pg(B)|0,(n&1|0)==0):0)?(u=n>>1,(n|0)<=2049):0){if((pe(J,B,u)|0)<0)break;if((n|0)<0){f=-22;break g}do if((ie(B,1024,A)|0)<0)f=-1;else{f=Pg(B)|0;if(f&1|0){f=-1;break}i=f>>1;if((f|0)>257){f=-1;break}f=(pe(x,B,i)|0)<0;f=f?-1:i}while(0);if((le(F,A)|0)<0){f=-22;break g}if((le(H,A)|0)<0){f=-22;break g}if(((c[H>>2]|0)+-1|0)>>>0>63){f=-22;break g}b=lf(76)|0;c[b>>2]=1;I=c[H>>2]|0;c[b+8>>2]=I;ee(J,u,x,f,c[F>>2]|0,I,b+12|0);c[j>>2]=b;f=0;break g}while(0);f=-22}else f=-5;while(0)}while(0);Bg(e);f=(f|0)==0?h:f}while(0);if((K|0)==104){Bg(e);f=-5}h=f;l=L;return h|0}function rd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[b+4>>2]|0;g=c[d+4>>2]|0;if((c[g+24>>2]|0)==4){e=-1;return e|0}d=h+24|0;a:do if((c[d>>2]|0)==4?(i=h+56|0,f=c[h+60>>2]|0,(f|0)!=(i|0)):0){b=f;while(1){if(!(Og(b+13|0,e)|0))break;b=c[b+4>>2]|0;if((b|0)==(i|0))break a}if(b|0){e=-17;return e|0}}while(0);i=g+16|0;c[i>>2]=(c[i>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);j=Pg(e)|0;l=j+17|0;i=lf(l)|0;c[i+8>>2]=g;ri(i+13|0,e|0,j+1|0)|0;e=h+56|0;h=h+64|0;j=c[h>>2]|0;g=j+l|0;l=ei(c[a+140>>2]|0,0,-1,-1)|0;k=y;d=ei(l|0,k|0,g|0,((g|0)<0)<<31>>31|0)|0;b=c[a+136>>2]|0;d=ni(d|0,y|0,b|0)|0;f=y;j=ei(l|0,k|0,j|0,((j|0)<0)<<31>>31|0)|0;b=ni(j|0,y|0,b|0)|0;a=a+112|0;j=a;b=fi(c[j>>2]|0,c[j+4>>2]|0,b|0,y|0)|0;f=ei(b|0,y|0,d|0,f|0)|0;c[a>>2]=f;c[a+4>>2]=y;c[h>>2]=g;a=c[e>>2]|0;c[a+4>>2]=i;c[i>>2]=a;c[i+4>>2]=e;c[e>>2]=i;e=0;return e|0}function sd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=l;l=l+16|0;k=o;m=c[e+4>>2]|0;n=m+24|0;a:do if((c[n>>2]|0)==4?(j=m+56|0,i=c[m+60>>2]|0,(i|0)!=(j|0)):0){while(1){if(!(Og(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(j|0))break a}if(i|0){d=-17;l=o;return d|0}}while(0);p=c[e>>2]|0;i=lf(104)|0;c[i+16>>2]=1;c[i+20>>2]=0;j=b+128|0;s=j;r=c[s+4>>2]|0;e=i+8|0;q=e;c[q>>2]=c[s>>2];c[q+4>>2]=r;q=j;q=ei(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[j>>2]=q;c[j+4>>2]=y;j=i+24|0;c[j>>2]=10;c[i+28>>2]=511;c[i+32>>2]=p;c[i+36>>2]=h;p=b+92|0;h=c[p>>2]|0;c[p>>2]=i;c[i>>2]=b+88;c[i+4>>2]=h;c[h>>2]=i;h=b+96|0;p=h;p=ei(c[p>>2]|0,c[p+4>>2]|0,1,0)|0;c[h>>2]=p;c[h+4>>2]=y;Oa(k|0,0)|0;h=c[k>>2]|0;c[i+40>>2]=h;k=(c[k+4>>2]|0)*1e3|0;c[i+48>>2]=k;c[i+44>>2]=h;c[i+52>>2]=k;c[i+56>>2]=Ah(g)|0;if((c[n>>2]|0)!=4)ja(14301,14319,456,14328);r=Pg(f)|0;q=r+17|0;s=lf(q)|0;c[s+8>>2]=i;ri(s+13|0,f|0,r+1|0)|0;i=m+56|0;r=m+64|0;p=c[r>>2]|0;q=p+q|0;g=ei(c[b+140>>2]|0,0,-1,-1)|0;h=y;m=ei(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;k=c[b+136>>2]|0;m=ni(m|0,y|0,k|0)|0;n=y;p=ei(g|0,h|0,p|0,((p|0)<0)<<31>>31|0)|0;k=ni(p|0,y|0,k|0)|0;p=b+112|0;h=p;k=fi(c[h>>2]|0,c[h+4>>2]|0,k|0,y|0)|0;n=ei(k|0,y|0,m|0,n|0)|0;c[p>>2]=n;c[p+4>>2]=y;c[r>>2]=q;r=c[i>>2]|0;c[r+4>>2]=s;c[s>>2]=r;c[s+4>>2]=i;c[i>>2]=s;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;q=e;r=c[q+4>>2]|0;s=d+8|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;s=0;l=o;return s|0}function td(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;s=l;l=l+16|0;q=s;n=c[e+4>>2]|0;r=g>>>12;o=r&15;r=r&255;switch(r&15){case 1:case 2:case 6:case 8:case 12:break;default:{d=-22;l=s;return d|0}}p=n+24|0;a:do if((c[p>>2]|0)==4?(m=n+56|0,k=c[n+60>>2]|0,(k|0)!=(m|0)):0){while(1){if(!(Og(k+13|0,f)|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break a}if(k|0){d=-17;l=s;return d|0}}while(0);t=c[e>>2]|0;k=lf(104)|0;c[k+16>>2]=1;c[k+20>>2]=0;m=b+128|0;w=m;v=c[w+4>>2]|0;e=k+8|0;u=e;c[u>>2]=c[w>>2];c[u+4>>2]=v;u=m;u=ei(c[u>>2]|0,c[u+4>>2]|0,1,0)|0;c[m>>2]=u;c[m+4>>2]=y;m=k+24|0;c[m>>2]=o;c[k+28>>2]=g&4095;c[k+32>>2]=t;c[k+36>>2]=j;switch(r&15){case 8:{Ga(k+64|0);break}case 4:{w=k+56|0;c[w>>2]=w;c[k+60>>2]=w;break}default:{}}w=b+92|0;v=c[w>>2]|0;c[w>>2]=k;c[k>>2]=b+88;c[k+4>>2]=v;c[v>>2]=k;v=b+96|0;w=v;w=ei(c[w>>2]|0,c[w+4>>2]|0,1,0)|0;c[v>>2]=w;c[v+4>>2]=y;Oa(q|0,0)|0;v=c[q>>2]|0;c[k+40>>2]=v;w=(c[q+4>>2]|0)*1e3|0;c[k+48>>2]=w;c[k+44>>2]=v;c[k+52>>2]=w;if((o|4|0)==6){c[k+56>>2]=h;c[k+60>>2]=i}if((c[p>>2]|0)!=4)ja(14301,14319,456,14328);v=Pg(f)|0;u=v+17|0;w=lf(u)|0;c[w+8>>2]=k;ri(w+13|0,f|0,v+1|0)|0;k=n+56|0;v=n+64|0;t=c[v>>2]|0;u=t+u|0;h=ei(c[b+140>>2]|0,0,-1,-1)|0;i=y;q=ei(h|0,i|0,u|0,((u|0)<0)<<31>>31|0)|0;j=c[b+136>>2]|0;q=ni(q|0,y|0,j|0)|0;r=y;t=ei(h|0,i|0,t|0,((t|0)<0)<<31>>31|0)|0;j=ni(t|0,y|0,j|0)|0;t=b+112|0;i=t;j=fi(c[i>>2]|0,c[i+4>>2]|0,j|0,y|0)|0;r=ei(j|0,y|0,q|0,r|0)|0;c[t>>2]=r;c[t+4>>2]=y;c[v>>2]=u;v=c[k>>2]|0;c[v+4>>2]=w;c[w>>2]=v;c[w+4>>2]=k;c[k>>2]=w;k=c[m>>2]|0;do if((k|0)!=4)if((k|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;u=e;v=c[u+4>>2]|0;w=d+8|0;c[w>>2]=c[u>>2];c[w+4>>2]=v;w=0;l=s;return w|0}function ud(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[f+4>>2]|0;if((c[b+24>>2]|0)!=10){e=-5;return e|0}f=c[b+56>>2]|0;b=Pg(f)|0;e=e+-1|0;e=(b|0)<(e|0)?b:e;ri(d|0,f|0,e|0)|0;a[d+e>>0]=0;e=0;return e|0}function vd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=b+4|0;b=c[l>>2]|0;if((c[b+24>>2]|0)!=4){a=-2;return a|0}h=b+56|0;b=c[b+60>>2]|0;if((b|0)==(h|0)){a=-2;return a|0}k=b;while(1){if(!(Og(k+13|0,d)|0))break;b=c[k+4>>2]|0;if((b|0)==(h|0)){b=-2;i=28;break}else k=b}if((i|0)==28)return b|0;if(!k){a=-2;return a|0}e=e+4|0;h=c[e>>2]|0;d=h+24|0;a:do if((c[d>>2]|0)==4?(j=h+56|0,g=c[h+60>>2]|0,(g|0)!=(j|0)):0){while(1){if(!(Og(g+13|0,f)|0))break;b=c[g+4>>2]|0;if((b|0)==(j|0)){e=0;break a}else g=b}if(g){b=c[g+8>>2]|0;if((c[b+24>>2]|0)==4){a=-17;return a|0}else{zd(a,h,g);h=c[e>>2]|0;e=b;d=h+24|0;break}}else e=0}else e=0;while(0);b=k+8|0;g=c[b>>2]|0;j=g+16|0;c[j>>2]=(c[j>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);i=Pg(f)|0;p=i+17|0;j=lf(p)|0;c[j+8>>2]=g;ri(j+13|0,f|0,i+1|0)|0;g=h+56|0;h=h+64|0;i=c[h>>2]|0;f=i+p|0;p=ei(c[a+140>>2]|0,0,-1,-1)|0;o=y;m=ei(p|0,o|0,f|0,((f|0)<0)<<31>>31|0)|0;n=c[a+136>>2]|0;m=ni(m|0,y|0,n|0)|0;d=y;i=ei(p|0,o|0,i|0,((i|0)<0)<<31>>31|0)|0;n=ni(i|0,y|0,n|0)|0;i=a+112|0;o=i;n=fi(c[o>>2]|0,c[o+4>>2]|0,n|0,y|0)|0;d=ei(n|0,y|0,m|0,d|0)|0;c[i>>2]=d;c[i+4>>2]=y;c[h>>2]=f;h=c[g>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[j+4>>2]=g;c[g>>2]=j;h=c[b>>2]|0;zd(a,c[l>>2]|0,k);b=h+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)==1?(c[h+20>>2]|0)<1:0)Ad(a,h);if(!e){p=0;return p|0}b=e+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)!=1){p=0;return p|0}if((c[e+20>>2]|0)>=1){p=0;return p|0}Ad(a,e);p=0;return p|0}function wd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!(Og(d,19070)|0)){o=-2;return o|0}if(!(Og(d,14342)|0)){o=-2;return o|0}m=b+4|0;g=c[m>>2]|0;if((c[g+24>>2]|0)!=4){o=-2;return o|0}f=g+56|0;b=c[g+60>>2]|0;if((b|0)==(f|0)){o=-2;return o|0}while(1){if(!(Og(b+13|0,d)|0))break;e=c[b+4>>2]|0;if((e|0)==(f|0)){k=-2;l=30;break}else b=e}if((l|0)==30)return k|0;if(!b){o=-2;return o|0}i=b+8|0;j=c[i>>2]|0;do if((c[j+24>>2]|0)==4){h=j+56|0;e=c[j+60>>2]|0;a:do if((e|0)!=(h|0)){f=e;do{d=f+13|0;if(Og(d,19070)|0?Og(d,14342)|0:0){k=-39;l=30;break}f=c[f+4>>2]|0}while((f|0)!=(h|0));if((l|0)==30)return k|0;while(1){d=e;e=c[e+4>>2]|0;f=c[d+8>>2]|0;zd(a,j,d);d=f+16|0;g=c[d>>2]|0;if((g|0)<=0)break;c[d>>2]=g+-1;if((g|0)==1?(c[f+20>>2]|0)<1:0)Ad(a,f);if((e|0)==(h|0))break a}ja(14345,14319,389,14362)}while(0);if(!(c[j+64>>2]|0)){n=c[m>>2]|0;o=c[i>>2]|0;break}else ja(14375,14319,576,14394)}else{n=g;o=j}while(0);zd(a,n,b);b=o+16|0;e=c[b>>2]|0;if((e|0)<=0)ja(14345,14319,389,14362);c[b>>2]=e+-1;if((e|0)!=1){o=0;return o|0}if((c[o+20>>2]|0)>=1){o=0;return o|0}Ad(a,o);o=0;return o|0}function xd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function yd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function zd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=Pg(d+13|0)|0;e=b+64|0;i=c[e>>2]|0;b=-17-k+i|0;k=ei(c[a+140>>2]|0,0,-1,-1)|0;j=y;f=ei(k|0,j|0,b|0,((b|0)<0)<<31>>31|0)|0;h=c[a+136>>2]|0;f=ni(f|0,y|0,h|0)|0;g=y;i=ei(k|0,j|0,i|0,((i|0)<0)<<31>>31|0)|0;h=ni(i|0,y|0,h|0)|0;a=a+112|0;i=a;h=fi(c[i>>2]|0,c[i+4>>2]|0,h|0,y|0)|0;g=ei(h|0,y|0,f|0,g|0)|0;f=a;c[f>>2]=g;c[f+4>>2]=y;c[e>>2]=b;if((b|0)<=-1)ja(14639,14319,554,14658);k=a;j=c[k+4>>2]|0;if((j|0)>-1|(j|0)==-1&(c[k>>2]|0)>>>0>4294967295){j=c[d>>2]|0;k=c[d+4>>2]|0;c[j+4>>2]=k;c[k>>2]=j;Bg(d);return}else ja(14451,14319,555,14658)}function Ad(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c[b+16>>2]|0)ja(14404,14319,334,14421);if(c[b+20>>2]|0)ja(14432,14319,335,14421);a:do switch(c[b+24>>2]|0){case 8:{d=b+60|0;k=c[a+140>>2]|0;k=ni(ei(ei(c[d>>2]|0,0,-1,-1)|0,y|0,k|0,0)|0,y|0,c[a+136>>2]|0)|0;h=a+112|0;i=h;k=fi(c[i>>2]|0,c[i+4>>2]|0,k|0,y|0)|0;i=y;c[h>>2]=k;c[h+4>>2]=i;if(!((i|0)>-1|(i|0)==-1&k>>>0>4294967295))ja(14451,14319,339,14421);Ia(b+64|0);switch(c[b+56>>2]|0){case 0:break a;case 3:{k=b+88|0;h=c[k>>2]|0;i=b+92|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[k>>2]=0;c[i>>2]=0;i=a+160|0;k=i;k=fi(c[k>>2]|0,c[k+4>>2]|0,c[d>>2]|0,0)|0;j=y;c[i>>2]=k;c[i+4>>2]=j;if((j|0)>-1|(j|0)==-1&k>>>0>4294967295){Bd(c[b+72>>2]|0);break a}else ja(14470,14319,348,14421);break}case 2:{k=c[b+96>>2]|0;d=c[k+8>>2]|0;if(d|0)Xd(d);i=k+4|0;d=c[i>>2]|0;do if((d|0)==1){h=k+40|0;d=c[k+44>>2]|0;if((d|0)!=(h|0)){while(1){e=d;d=c[d+4>>2]|0;e=c[e+-12>>2]|0;f=e+56|0;if((c[f>>2]|0)!=2){e=18;break}g=c[e+96>>2]|0;c[f>>2]=1;Ia(e+64|0);e=c[g+52>>2]|0;if(e|0)fb[e&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){e=g+24|0;m=c[e>>2]|0;f=g+28|0;l=c[f>>2]|0;c[m+4>>2]=l;c[l>>2]=m;c[e>>2]=0;c[f>>2]=0}e=c[g+16>>2]|0;if(e|0)ae(e);Bg(g);if((d|0)==(h|0)){e=26;break}}if((e|0)==18)ja(14496,14319,754,14532);else if((e|0)==26){j=c[i>>2]|0;e=27;break}}}else{j=d;e=27}while(0);if((e|0)==27?(j|0)==2:0){l=k+24|0;i=c[l>>2]|0;m=k+28|0;j=c[m>>2]|0;c[i+4>>2]=j;c[j>>2]=i;c[l>>2]=0;c[m>>2]=0}d=c[k+16>>2]|0;if(d|0)ae(d);Bg(k);Bd(c[b+72>>2]|0);break a}case 1:{Bd(c[b+72>>2]|0);break a}default:ra()}break}case 10:{Bg(c[b+56>>2]|0);break}case 4:{if((c[b+60>>2]|0)!=(b+56|0))ja(14550,14319,376,14421);break}default:{}}while(0);m=c[b>>2]|0;l=c[b+4>>2]|0;c[m+4>>2]=l;c[l>>2]=m;Bg(b);b=a+96|0;l=b;m=c[l>>2]|0;l=c[l+4>>2]|0;a=ei(m|0,l|0,-1,-1)|0;c[b>>2]=a;c[b+4>>2]=y;if((l|0)>0|(l|0)==0&m>>>0>0)return;else ja(14580,14319,384,14421)}function Bd(a){a=a|0;var b=0,d=0;b=a+8|0;d=c[b>>2]|0;if((d|0)<=0)ja(14601,14319,1609,14620);d=d+-1|0;c[b>>2]=d;if(d|0)return;Bg(c[a+12>>2]|0);Bg(c[a+16>>2]|0);Bg(c[a+20>>2]|0);Bg(c[a+24>>2]|0);b=c[a>>2]|0;d=c[a+4>>2]|0;c[b+4>>2]=d;c[d>>2]=b;Bg(a);return}function Cd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;d=c[g+8>>2]|0;if(d|0)db[c[b+4>>2]&15](b,d);h=c[g+12>>2]|0;d=b+4|0;if(h|0)db[c[d>>2]&15](b,h);db[c[d>>2]&15](b,c[g+4>>2]|0);d=c[g>>2]|0;if(!d){Bg(g);return}b=c[d+16>>2]|0;h=(f|0)<0;e=h?e:0;a[b+12>>0]=e;a[b+13>>0]=e>>>8;a[b+14>>0]=e>>>16;a[b+15>>0]=e>>>24;c[b+8>>2]=4;c[b+4>>2]=0;Bg(g);return}function Dd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((c[a>>2]|0)!=9)ja(14834,14319,1629,14972);h=a+192|0;a=c[h+4>>2]|0;a:do if((a|0)!=(h|0)){while(1){if(!(Og(c[a+12>>2]|0,b)|0))break;a=c[a+4>>2]|0;if((a|0)==(h|0)){i=8;break a}}if(a){Bg(c[a+16>>2]|0);Bg(c[a+20>>2]|0);Bg(c[a+24>>2]|0);h=a}else i=8}else i=8;while(0);if((i|0)==8){i=lf(276)|0;c[i+12>>2]=Ah(b)|0;c[i+8>>2]=1;b=c[h>>2]|0;c[b+4>>2]=i;c[i>>2]=b;c[i+4>>2]=h;c[h>>2]=i;h=i}c[h+16>>2]=Ah(d)|0;if(!e)a=0;else a=Ah(e)|0;c[h+20>>2]=a;if(!f)a=0;else a=Ah(f)|0;c[h+24>>2]=a;a=h+28|0;if(!g){c[a>>2]=0;return}else{c[a>>2]=1;ri(h+32|0,g|0,244)|0;return}}function Ed(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+1024|0;g=h;if(!b){g=0;l=h;return g|0}b=c[b+144>>2]|0;d=(a[d>>0]|0)==47?d+1|0:d;a:do if(a[d>>0]|0)while(1){e=Tg(d,47)|0;if(!e){f=Pg(d)|0;e=0}else{f=e-d|0;e=e+1|0}if(f>>>0>1023){b=0;break a}ri(g|0,d|0,f|0)|0;a[g+f>>0]=0;if((c[b+24>>2]|0)!=4){b=0;break a}d=b+56|0;b=c[b+60>>2]|0;if((b|0)==(d|0)){b=0;break a}while(1){if(!(Og(b+13|0,g)|0))break;b=c[b+4>>2]|0;if((b|0)==(d|0)){b=0;break a}}if(!b){b=0;break a}b=c[b+8>>2]|0;if(!e)break;else d=e}while(0);g=b;l=h;return g|0}function Fd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if((c[a>>2]|0)!=9)ja(14834,14319,1687,14957);k=a+192|0;i=c[k+4>>2]|0;if((i|0)==(k|0)){l=-2;return l|0}j=i;while(1){if(!(Og(c[j+12>>2]|0,d)|0))break;i=c[j+4>>2]|0;if((i|0)==(k|0)){i=-2;l=13;break}else j=i}if((l|0)==13)return i|0;if(!j){l=-2;return l|0}if((c[b+24>>2]|0)!=8){l=-5;return l|0}i=b+56|0;if(c[i>>2]|0){l=-5;return l|0}if(c[b+68>>2]|0){l=-5;return l|0}if((g|0)==0&(h|0)==0){l=0;return l|0}c[i>>2]=1;c[b+72>>2]=j;l=j+8|0;c[l>>2]=(c[l>>2]|0)+1;c[b+60>>2]=g;l=c[a+140>>2]|0;g=ei(g|0,h|0,-1,-1)|0;g=ei(g|0,y|0,l|0,0)|0;g=ni(g|0,y|0,c[a+136>>2]|0)|0;l=a+112|0;h=l;h=ei(g|0,y|0,c[h>>2]|0,c[h+4>>2]|0)|0;c[l>>2]=h;c[l+4>>2]=y;l=b+80|0;c[l>>2]=e;c[l+4>>2]=f;l=0;return l|0}function Gd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((c[b+24>>2]|0)!=8){l=-22;return l|0}if(e>>>0>0|(e|0)==0&d>>>0>4294967295){l=-28;return l|0}j=b+60|0;f=c[j>>2]|0;h=d-f|0;if(!h){l=0;return l|0}m=ei(c[a+140>>2]|0,0,-1,-1)|0;g=y;i=ei(m|0,g|0,d|0,e|0)|0;k=c[a+136>>2]|0;i=ni(i|0,y|0,k|0)|0;l=y;g=ei(m|0,g|0,f|0,0)|0;k=ni(g|0,y|0,k|0)|0;k=fi(i|0,l|0,k|0,y|0)|0;l=b+56|0;a:do switch(c[l>>2]|0){case 1:{if((d|0)==0&(e|0)==0)c[l>>2]=0;break}case 0:case 3:{if((h|0)<=0){f=(c[b+68>>2]<<2>>>0)/5|0;if(!(0<e>>>0|0==(e|0)&f>>>0<d>>>0)?(Ja(b+64|0,f|0)|0)<0:0){m=-28;return m|0}}else{i=a+112|0;i=ei(c[i>>2]|0,c[i+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;n=y;m=a+120|0;g=c[m+4>>2]|0;if(n>>>0>g>>>0|((n|0)==(g|0)?i>>>0>(c[m>>2]|0)>>>0:0)){n=-28;return n|0}i=b+64|0;g=c[b+68>>2]|0;do if(0<e>>>0|0==(e|0)&g>>>0<d>>>0){n=(g*5|0)>>>2;if((Ja(i|0,(0<e>>>0|0==(e|0)&n>>>0<d>>>0?d:n)|0)|0)<0){n=-28;return n|0}else{f=c[j>>2]|0;break}}while(0);Ka(i|0,f|0,0,h|0)}if((c[l>>2]|0)==3){n=b+88|0;i=c[n>>2]|0;b=b+92|0;m=c[b>>2]|0;c[i+4>>2]=m;c[m>>2]=i;c[n>>2]=0;c[b>>2]=0;b=a+160|0;n=b;n=fi(c[n>>2]|0,c[n+4>>2]|0,c[j>>2]|0,0)|0;m=y;c[b>>2]=n;c[b+4>>2]=m;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){c[l>>2]=0;break a}else ja(14470,14319,1240,14945)}break}case 2:{n=-5;return n|0}default:ra()}while(0);l=a+112|0;n=l;n=ei(c[n>>2]|0,c[n+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;m=y;c[l>>2]=n;c[l+4>>2]=m;if(!((m|0)>-1|(m|0)==-1&n>>>0>4294967295))ja(14451,14319,1248,14945);c[j>>2]=d;n=0;return n|0}function Hd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;p=q;j=b+56|0;if((c[j>>2]|0)!=1)ja(15026,14319,848,15063);k=b+60|0;m=c[k>>2]|0;o=a+160|0;r=o;r=ei(c[r>>2]|0,c[r+4>>2]|0,m|0,0)|0;t=y;h=a+168|0;g=h;s=c[g+4>>2]|0;do if((t|0)>(s|0)|((t|0)==(s|0)?r>>>0>(c[g>>2]|0)>>>0:0)?(i=a+148|0,e=c[i>>2]|0,(e|0)!=(i|0)):0){f=e+-32|0;if((c[f>>2]|0)!=3)ja(15076,14319,684,15111);g=e;while(1){e=g;g=c[g>>2]|0;if(!(c[e+-68>>2]|0)){Ia(e+-24|0);c[f>>2]=1;s=c[e>>2]|0;f=e+4|0;t=c[f>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[e>>2]=0;c[f>>2]=0;f=o;e=fi(c[f>>2]|0,c[f+4>>2]|0,c[e+-28>>2]|0,0)|0;f=y;t=o;c[t>>2]=e;c[t+4>>2]=f;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){f=10;break}s=ei(e|0,f|0,m|0,0)|0;f=y;t=h;r=c[t+4>>2]|0;if((g|0)==(i|0)|((f|0)<(r|0)|((f|0)==(r|0)?s>>>0<=(c[t>>2]|0)>>>0:0))){f=14;break}}else if((g|0)==(i|0)){f=14;break}f=g+-32|0;if((c[f>>2]|0)!=3){f=7;break}}if((f|0)==7)ja(15076,14319,684,15111);else if((f|0)==10)ja(14470,14319,697,15111);else if((f|0)==14){n=c[k>>2]|0;break}}else n=m;while(0);if((Ja(b+64|0,n|0)|0)<0){t=-5;l=q;return t|0}c[j>>2]=2;g=lf(64)|0;c[g+20>>2]=0;c[g>>2]=a;c[g+12>>2]=b;c[g+4>>2]=d;switch(d|0){case 2:break;case 1:{f=g+40|0;c[f>>2]=f;c[g+44>>2]=f;f=18;break}default:f=18}if((f|0)==18){f=b+80|0;oe(p,c[f>>2]|0,c[f+4>>2]|0)|0;f=c[b+72>>2]|0;e=fe(c[f+16>>2]|0,p)|0;if(c[f+28>>2]|0)c[g+16>>2]=Zd(f+32|0,14,g)|0;c[g+8>>2]=Yd(e,c[f+20>>2]|0,c[f+24>>2]|0,g,5,0)|0}c[b+96>>2]=g;t=0;l=q;return t|0}function Id(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a+12>>2]|0;a=a+20|0;e=c[a>>2]|0;g=(c[f+60>>2]|0)-e|0;d=g>>>0>d>>>0?d:g;La(f+64|0,e|0,b|0,d|0);c[a>>2]=d+(c[a>>2]|0);return 0}function Jd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1024|0;n=q;j=a+12|0;p=c[j>>2]|0;do if((b|0)>=0){f=a+16|0;g=c[f>>2]|0;if(!g){g=p+60|0;m=a+20|0;r=c[m>>2]|0;f=(c[g>>2]|0)-r|0;f=f>>>0>e>>>0?e:f;La(p+64|0,r|0,d|0,f|0);f=f+(c[m>>2]|0)|0;c[m>>2]=f;if(b){l=q;return}}else{if((_d(g,d,e)|0)<0)break;if(b|0){l=q;return}if(($d(c[f>>2]|0)|0)<0)break;g=p+60|0;f=c[a+20>>2]|0}if((f|0)==(c[g>>2]|0)){if((c[a+4>>2]|0)==1?(o=a+40|0,i=c[a+44>>2]|0,(i|0)!=(o|0)):0){m=(c[j>>2]|0)+64|0;do{f=i;i=c[i+4>>2]|0;j=c[f+-12>>2]|0;k=j+60|0;g=c[k>>2]|0;if(g|0){b=f+8|0;a=j+64|0;f=0;h=0;d=0;e=c[b>>2]|0;b=c[b+4>>2]|0;while(1){f=fi(g|0,f|0,h|0,d|0)|0;r=y;s=r>>>0<0|(r|0)==0&f>>>0<1024;f=s?f:1024;r=s?r:0;Ha(m|0,e|0,n|0,f|0);La(a|0,h|0,n|0,f|0);e=ei(f|0,r|0,e|0,b|0)|0;b=y;h=ei(f|0,r|0,h|0,d|0)|0;d=y;g=c[k>>2]|0;if(!(d>>>0<0|(d|0)==0&h>>>0<g>>>0))break;else f=0}}Kd(j)}while((i|0)!=(o|0))}Kd(p);l=q;return}}while(0);a:do if((c[a+4>>2]|0)==1?(k=a+40|0,h=c[a+44>>2]|0,(h|0)!=(k|0)):0){while(1){f=h;h=c[h+4>>2]|0;f=c[f+-12>>2]|0;g=f+56|0;if((c[g>>2]|0)!=2)break;d=c[f+96>>2]|0;c[g>>2]=1;Ia(f+64|0);f=c[d+52>>2]|0;if(f|0)fb[f&31](c[d>>2]|0,0,-5,c[d+56>>2]|0);if((c[d+4>>2]|0)==2){r=d+24|0;n=c[r>>2]|0;s=d+28|0;o=c[s>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[r>>2]=0;c[s>>2]=0}f=c[d+16>>2]|0;if(f|0)ae(f);Bg(d);if((h|0)==(k|0))break a}ja(14496,14319,754,14532)}while(0);f=p+56|0;if((c[f>>2]|0)!=2)ja(14496,14319,754,14532);g=c[p+96>>2]|0;c[f>>2]=1;Ia(p+64|0);f=c[g+52>>2]|0;if(f|0)fb[f&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){r=g+24|0;o=c[r>>2]|0;s=g+28|0;p=c[s>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[r>>2]=0;c[s>>2]=0}f=c[g+16>>2]|0;if(f|0)ae(f);Bg(g);l=q;return}function Kd(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;e=g;d=b+56|0;if((c[d>>2]|0)!=2)ja(14496,14319,735,15125);f=c[b+96>>2]|0;h=c[f>>2]|0;c[d>>2]=3;i=b+88|0;j=h+152|0;d=c[j>>2]|0;c[j>>2]=i;c[i>>2]=h+148;c[b+92>>2]=d;c[d>>2]=i;d=h+160|0;h=d;h=ei(c[h>>2]|0,c[h+4>>2]|0,c[b+60>>2]|0,0)|0;c[d>>2]=h;c[d+4>>2]=y;d=f+52|0;if(c[d>>2]|0){c[(c[f+48>>2]|0)+8>>2]=1;h=c[b+24>>2]|0;a[e>>0]=(h|0)==4?-128:(h|0)==10?2:0;c[e+4>>2]=0;h=b+8|0;i=c[h+4>>2]|0;j=e+8|0;c[j>>2]=c[h>>2];c[j+4>>2]=i;fb[c[d>>2]&31](c[f>>2]|0,e,0,c[f+56>>2]|0)}if((c[f+4>>2]|0)==2){i=f+24|0;e=c[i>>2]|0;j=f+28|0;h=c[j>>2]|0;c[e+4>>2]=h;c[h>>2]=e;c[i>>2]=0;c[j>>2]=0}d=c[f+16>>2]|0;if(!d){Bg(f);l=g;return}ae(d);Bg(f);l=g;return}function Ld(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;i=o+144|0;m=o+128|0;g=o;h=o+152|0;n=cd()|0;if(!(c[6969]|0))c[6969]=n;c[n+200>>2]=Ah(15189)|0;e=n+12|0;if(_a[c[e>>2]&15](n,m,g,0,28468,28468)|0)ja(15194,14319,2070,15240);j=n+28|0;if($a[c[j>>2]&3](n,g,c[m>>2]|0,15254,514,438,0)|0)ja(15261,14319,2072,15240);k=c[m>>2]|0;c[(c[k+4>>2]|0)+100>>2]=1;db[c[n+4>>2]&15](n,k);if(!a){l=o;return n|0}k=lf(28)|0;c[k>>2]=n;f=k+4|0;c[f>>2]=Ah(a)|0;c[k+8>>2]=b;c[k+12>>2]=d;a=k+16|0;if(_a[c[e>>2]&15](n,a,m,0,28468,28468)|0)ja(15340,14319,2145,15389);Oa(h|0,0)|0;b=c[h>>2]|0;b=ki(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;h=c[h+4>>2]|0;h=ei(b|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;Wg(g,128,15405,i)|0;b=ge(c[f>>2]|0,g)|0;a=$c(n,c[a>>2]|0)|0;if($a[c[j>>2]&3](n,m,a,15423,514,420,0)|0)ja(15429,14319,2154,15389);be(n,a,b,0,0,0,0,0,3,k,0);Bg(b);l=o;return n|0}function Md(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;h=n+64|0;j=n;k=n+56|0;m=n+40|0;i=n+32|0;if((f|0)<0){c[h>>2]=0-e;Nd(15505,h)}f=Ag(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);d=g+16|0;Xa[c[b+76>>2]&31](b,c[d>>2]|0,15423)|0;if((ue(f)|0)!=1)Nd(15548,n+72|0);if((te(k,f,15569)|0)<0)Nd(15576,n+80|0);e=(se(i,f,15596)|0)==0;h=i;f=c[h>>2]|0;h=c[h+4>>2]|0;do if(e&(h>>>0>0|(h|0)==0&f>>>0>1048575))if((c[b>>2]|0)==9){e=c[b+140>>2]|0;i=ei(f|0,h|0,-1,-1)|0;e=ei(i|0,y|0,e|0,0)|0;e=ni(e|0,y|0,c[b+136>>2]|0)|0;i=b+120|0;c[i>>2]=e;c[i+4>>2]=y;break}else ja(14834,14319,1677,15606);while(0);h=ge(c[g+4>>2]|0,15629)|0;Dd(b,15635,h,0,0,0);f=$c(b,c[d>>2]|0)|0;if(!($a[c[b+28>>2]&3](b,m,f,15637,514,420,0)|0)){m=k;oe(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=ge(h,j)|0;be(b,f,m,0,0,0,0,0,4,g,0);Bg(h);Bg(m);l=n;return}else ja(15651,14319,2196,15743)}function Nd(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;b=c[3261]|0;Uh(16070,7,1,b)|0;Yg(b,a,d)|0;Zh(10,b)|0;Da(1)}function Od(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;h=k;i=k+12|0;if((f|0)<0){c[h>>2]=0-e;Nd(15755,h)}f=Ag(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);Xa[c[b+76>>2]&31](b,c[g+16>>2]|0,15637)|0;if((ue(f)|0)==1?(e=qe(f)|0,c[i>>2]=e,e|0):0)if(!(Pd(b,i,c[b+144>>2]|0,28468)|0)){c[g+24>>2]=0;Qd(b,0,0,g);l=k;return}else Nd(15796,j);Nd(15796,j)} +function Of(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;i=p;o=1<<h;if(o+-1&e|0){if((h|0)==31){g=0;l=p;return g|0}m=0;while(1){i=m+e|0;j=ni(f|0,g|0,m<<3|0)|0;k=i>>>12&255;if((c[d+2580+(k<<3)>>2]|0)!=(i&-4096|0)){i=Of(d,i,j&255,0,0)|0;if(i|0){j=24;break}}else a[(c[d+2580+(k<<3)+4>>2]|0)+i>>0]=j;m=m+1|0;if((m|0)>=(o|0)){i=0;j=24;break}}if((j|0)==24){l=p;return i|0}}if(Rf(d,i,e,1)|0){c[d+440>>2]=e;c[d+436>>2]=15;g=-1;l=p;return g|0}k=c[i>>2]|0;n=ff(c[d+528>>2]|0,k,0)|0;if(!n){g=0;l=p;return g|0}m=n+8|0;i=k-(c[m>>2]|0)|0;if(!(c[n+32>>2]|0)){j=c[n+76>>2]|0;if(j&o|0){fb[c[n+72>>2]&31](c[n+64>>2]|0,i,f,h);g=0;l=p;return g|0}if(!((h|0)==3&(j&4|0)!=0)){g=0;l=p;return g|0}d=n+72|0;e=n+64|0;fb[c[d>>2]&31](c[e>>2]|0,i,f,2);fb[c[d>>2]&31](c[e>>2]|0,i+4|0,g,2);g=0;l=p;return g|0}o=c[n+48>>2]|0;j=o+(i>>>17<<2)|0;if(o){c[j>>2]=c[j>>2]|1<<(i>>>12&31);i=k-(c[m>>2]|0)|0}o=e>>>12&255;i=(c[n+40>>2]|0)+i|0;c[d+2580+(o<<3)>>2]=e&-4096;c[d+2580+(o<<3)+4>>2]=i-e;switch(h|0){case 0:{a[i>>0]=f;g=0;l=p;return g|0}case 1:{b[i>>1]=f;g=0;l=p;return g|0}case 2:{c[i>>2]=f;g=0;l=p;return g|0}case 3:{e=i;c[e>>2]=f;c[e+4>>2]=g;g=0;l=p;return g|0}default:ra()}return 0}function Pf(b,e,f){b=b|0;e=e|0;f=f|0;if((e&3072|0)==3072&(f|0)!=0){b=-1;return b|0}f=a[21566]|0;if((e>>>8&3)>>>0>(f&255)>>>0){b=-1;return b|0}a:do switch(e|0){case 1:if(!(a[21567]|0)){b=-1;return b|0}else{f=c[5390]|0;e=46;break a}case 2:if(!(a[21567]|0)){b=-1;return b|0}else{f=d[21564]|0;e=46;break a}case 3:if(!(a[21567]|0)){b=-1;return b|0}else{f=d[21564]<<5|c[5390];e=46;break a}case 3074:case 3072:{if((f&255)<3?((f<<24>>24==0?c[5418]|0:c[5411]|0)&1<<(e&31)|0)==0:0){e=45;break a}f=c[5394]|0;e=46;break}case 3202:case 3200:{if((a[21565]|0)==32){if((f&255)<3?((f<<24>>24==0?c[5418]|0:c[5411]|0)&1<<(e&31)|0)==0:0){e=45;break a}f=c[5395]|0;e=46}else e=45;break}case 256:{e=d[21567]<<13|c[5399];f=e&909619;if((e&24576|0)==24576|(e&98304|0)==98304){f=1<<(d[21565]|0)+-1|f;e=46}else e=46;break}case 260:{f=c[5410]&c[5407];e=46;break}case 261:{f=c[5412]|0;e=46;break}case 262:{f=c[5418]|0;e=46;break}case 320:{f=c[5413]|0;e=46;break}case 321:{f=c[5414]|0;e=46;break}case 322:{f=c[5415]|0;e=46;break}case 323:{f=c[5416]|0;e=46;break}case 324:{f=c[5410]&c[5408];e=46;break}case 384:{f=c[5417]|0;e=46;break}case 768:{f=d[21567]<<13|c[5399];if((f&24576|0)==24576|(f&98304|0)==98304){f=1<<(d[21565]|0)+-1|f;e=46}else e=46;break}case 769:{f=d[21568]<<(d[21565]|0)+-2|c[5406];e=46;break}case 770:{f=c[5409]|0;e=46;break}case 771:{f=c[5410]|0;e=46;break}case 772:{f=c[5407]|0;e=46;break}case 773:{f=c[5400]|0;e=46;break}case 774:{f=c[5411]|0;e=46;break}case 832:{f=c[5401]|0;e=46;break}case 833:{f=c[5402]|0;e=46;break}case 834:{f=c[5403]|0;e=46;break}case 835:{f=c[5404]|0;e=46;break}case 836:{f=c[5408]|0;e=46;break}case 2818:case 2816:{f=c[5394]|0;e=46;break}case 2946:case 2944:{if((a[21565]|0)==32){f=c[5395]|0;e=46}else e=45;break}case 3860:{f=c[5405]|0;e=46;break}default:e=45}while(0);if((e|0)==45){c[b>>2]=0;b=-1;return b|0}else if((e|0)==46){c[b>>2]=f;b=0;return b|0}return 0}function Qf(b,d){b=b|0;d=d|0;var e=0,f=0;do switch(b|0){case 1:{c[5390]=d&31;a[21567]=3;break}case 2:{d=d&7;a[21564]=d>>>0>4?0:d&255;a[21567]=3;break}case 3:{f=d>>>5&7;a[21564]=f>>>0>4?0:f&255;c[5390]=d&31;a[21567]=3;break}case 256:{e=c[5399]|0;f=e&-909620|d&909619;b=f^e;if(!((b&917504|0)==0?(e&131072|0)==0|(b&6144|0)==0:0)){b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256)}a[21567]=d>>>13&3;c[5399]=f&924091|e&-924092;break}case 260:{f=c[5410]|0;c[5407]=c[5407]&~f|f&d;break}case 261:{c[5412]=d&-4;break}case 262:{c[5418]=d&5;break}case 320:{c[5413]=d;break}case 321:{c[5414]=d&-2;break}case 322:{c[5415]=d;break}case 323:{c[5416]=d;break}case 324:{f=c[5410]|0;c[5408]=c[5408]&~f|f&d;break}case 384:{c[5417]=d&-2143289345;b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256);b=2;return b|0}case 768:{e=c[5399]|0;f=e^d;if(!((f&917504|0)==0?(e&131072|0)==0|(f&6144|0)==0:0)){b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256)}a[21567]=d>>>13&3;c[5399]=e&-924092|d&924091;break}case 769:break;case 770:{c[5409]=c[5409]&-65536|d&65535;break}case 771:{c[5410]=c[5410]&-547|d&546;break}case 772:{c[5407]=c[5407]&-683|d&682;break}case 773:{c[5400]=d&-4;break}case 774:{c[5411]=d&5;break}case 832:{c[5401]=d;break}case 833:{c[5402]=d&-2;break}case 834:{c[5403]=d;break}case 835:{c[5404]=d;break}case 836:{c[5408]=c[5408]&-35|d&34;break}default:{d=-1;return d|0}}while(0);d=0;return d|0}function Rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;q=b+444|0;h=c[q>>2]|0;if((g|0)!=2&(h&131072|0)!=0)o=h>>>11&3;else o=d[b+414>>0]|0;if((o|0)==3){r=a[b+413>>0]|0;c[e>>2]=((r&255)<32?(1<<(r&255))+-1|0:-1)&f;r=0;return r|0}h=c[b+516>>2]|0;if((h|0)>-1){c[e>>2]=f;r=0;return r|0}p=b+528|0;j=f>>>20&4092|h<<12;h=ff(c[p>>2]|0,j,0)|0;if(!h){r=-1;return r|0}if(!(c[h+32>>2]|0)){r=-1;return r|0}b=c[(c[h+40>>2]|0)+(j-(c[h+8>>2]|0))>>2]|0;if(!(b&1)){r=-1;return r|0}i=b>>>10<<12;h=b>>>1&7;if(!h){j=f>>>10&4092|i;h=ff(c[p>>2]|0,j,0)|0;if(!h){r=-1;return r|0}if(!(c[h+32>>2]|0)){r=-1;return r|0}i=c[(c[h+40>>2]|0)+(j-(c[h+8>>2]|0))>>2]|0;if(!(i&1)){r=-1;return r|0}h=i>>>1&7;if(!h){r=-1;return r|0}else{b=i;i=i>>>10<<12;m=j;n=12;k=j;l=0}}else{m=j;n=22;k=j;l=0}if((h|4|0)==6){r=-1;return r|0}j=(b&16|0)!=0;if((o|0)==1){if(j?(c[q>>2]&262144|0)==0:0){r=-1;return r|0}}else if(!j){r=-1;return r|0}if(!((((c[q>>2]&524288|0)==0?0:h>>>2)|h)&1<<g)){r=-1;return r|0}q=(g|0)==1;h=b|(q?192:64);if(((b&64|0)==0|q&(b&128|0)==0?(r=ff(c[p>>2]|0,k,l)|0,r|0):0)?c[r+32>>2]|0:0)c[(c[r+40>>2]|0)+(m-(c[r+8>>2]|0))>>2]=h;r=1<<n;c[e>>2]=i&0-r|r+-1&f;r=0;return r|0}function Sf(b,d){b=b|0;d=d|0;if((d|0)!=32){d=0;return d|0}c[5288]=12968;c[5420]=b;c[5289]=4096;a[21566]=3;a[21565]=32;a[21568]=1;c[5399]=0;c[5406]=c[5406]|1315117;b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256);b=21152;return b|0}function Tf(a){a=a|0;return}function Uf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;z=l;l=l+96|0;x=z+80|0;u=z+72|0;q=z+64|0;o=z+56|0;n=z+48|0;k=z+40|0;f=z+32|0;d=z+24|0;e=z+88|0;m=z;b=c[a+8>>2]|0;if(Og(b,17419)|0)if(Og(b,17427)|0)if(!(Og(b,17435)|0))b=128;else{c[d>>2]=b;ng(17444,d);x=0;l=z;return x|0}else b=64;else b=32;r=lf(488)|0;c[r>>2]=c[a+4>>2];d=a+16|0;t=d;j=c[t+4>>2]|0;s=r+32|0;p=s;c[p>>2]=c[t>>2];c[p+4>>2]=j;p=r+24|0;c[p>>2]=b;j=$e()|0;t=r+20|0;c[t>>2]=j;c[j+2584>>2]=r;c[(c[t>>2]|0)+2588>>2]=8;j=Sf(c[t>>2]|0,b)|0;c[r+28>>2]=j;if(!j){c[f>>2]=b;ng(17469,f);x=0;l=z;return x|0}i=c[t>>2]|0;j=d;_a[c[i+2568>>2]&15](i,-2147483648,0,c[j>>2]|0,c[j+4>>2]|0,0)|0;j=c[t>>2]|0;_a[c[j+2568>>2]&15](j,0,0,65536,0,0)|0;j=a+24|0;c[r+40>>2]=c[j>>2];if(c[j>>2]|0){sa(1,e|0)|0;j=c[e>>2]|0;j=ki(j|0,((j|0)<0)<<31>>31|0,1e7,0)|0;i=(c[e+4>>2]|0)/100|0;i=ei(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;j=r+48|0;c[j>>2]=i;c[j+4>>2]=y}gf(c[t>>2]|0,33554432,0,786432,0,r,16,13,4)|0;gf(c[t>>2]|0,1074790400,0,4194304,0,r,17,14,4)|0;j=r+72|0;b=1;do{kf(j+(b*12|0)|0,9,r,b);b=b+1|0}while((b|0)!=32);gf(c[t>>2]|0,1073774592,0,16,0,r,18,15,4)|0;b=a+44|0;c[r+12>>2]=c[b>>2];c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+4>>2]=c[t>>2];i=m+8|0;h=i;c[h>>2]=1073807360;c[h+4>>2]=0;b=c[b>>2]|0;if(!b)b=1;else{c[m+16>>2]=r+84;c[r+8>>2]=Nc(m,b)|0;h=i;h=ei(c[h>>2]|0,c[h+4>>2]|0,4096,0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;b=r+480|0;c[b>>2]=(c[b>>2]|0)+1;b=2}e=a+180|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+4|0;h=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);B=a+168+(d*12|0)+8|0;Ec(m,c[B>>2]|0)|0;c[g>>2]=c[B>>2];B=i;B=ei(c[B>>2]|0,c[B+4>>2]|0,4096,0)|0;A=i;c[A>>2]=B;c[A+4>>2]=y;b=b+1|0;c[h>>2]=(c[h>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+96|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);mc(m,c[a+48+(d*12|0)+8>>2]|0)|0;A=i;A=ei(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+164|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);Vc(m,c[a+100+(d<<4)+12>>2]|0,c[a+100+(d<<4)+4>>2]|0)|0;A=i;A=ei(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0));e=b}else e=b;b=a+32|0;do if(c[b>>2]|0){d=lf(28)|0;c[r+16>>2]=d;b=c[b>>2]|0;if(!(Og(b,17494)|0)){xe(c[t>>2]|0,1090519040,0,d,c[a+36>>2]|0,c[a+40>>2]|0)|0;break}else{c[k>>2]=b;ng(17503,k);Da(1)}}while(0);b=c[a+192>>2]|0;do if(b|0)if(!(Og(b,17535)|0)){n=m+16|0;c[n>>2]=j+(e*12|0);c[r+472>>2]=Sc(m,0)|0;A=i;A=ei(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;B=r+480|0;c[B>>2]=(c[B>>2]|0)+1;c[n>>2]=j+((e+1|0)*12|0);c[r+476>>2]=Sc(m,2)|0;n=i;n=ei(c[n>>2]|0,c[n+4>>2]|0,4096,0)|0;A=i;c[A>>2]=n;c[A+4>>2]=y;c[B>>2]=(c[B>>2]|0)+1;break}else{c[n>>2]=b;ng(17542,n);Da(1)}while(0);b=a+200|0;if(!(c[b>>2]|0))ng(17572,o);e=c[a+204>>2]|0;f=c[a+224>>2]|0;h=c[a+228>>2]|0;i=c[a+236>>2]|0;j=c[a+240>>2]|0;g=c[a+184>>2]|0;A=((e|0)<0)<<31>>31;B=s;a=c[B+4>>2]|0;if(a>>>0<A>>>0|((a|0)==(A|0)?(c[B>>2]|0)>>>0<e>>>0:0)){ng(17586,q);Da(1)}B=c[b>>2]|0;d=jf(c[t>>2]|0,-2147483648,0,1)|0;ri(d|0,B|0,e|0)|0;if((h|0)>0){b=(c[p>>2]|0)==32?4194304:2097152;b=e+-1+b&0-b;ri(d+b|0,f|0,h|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+h|0)>>>0:0)){ng(17600,u);Da(1)}else w=b}else w=0;if((j|0)>0){b=s;b=ni(c[b>>2]|0,c[b+4>>2]|0,1)|0;b=b>>>0<134217728?b:134217728;ri(d+b|0,i|0,j|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+j|0)>>>0:0)){ng(17615,x);Da(1)}else v=b}else v=0;B=jf(c[t>>2]|0,0,0,1)|0;hg(r,B+4160|0,w^-2147483648,0,h,((h|0)<0)<<31>>31,v|-2147483648,0,j,((j|0)<0)<<31>>31,g);c[B+4096>>2]=2147480215;c[B+4100>>2]=1431;c[B+4104>>2]=63276435;c[B+4108>>2]=-247454349;c[B+4112>>2]=163943;B=r;l=z;return B|0}function Vf(a){a=a|0;var b=0;b=c[a+28>>2]|0;cb[c[(c[b>>2]|0)+4>>2]&15](b);ef(c[a+20>>2]|0);Bg(a);return}function Wf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;d=i;e=a+28|0;h=c[e>>2]|0;do if(!((Va[c[(c[h>>2]|0)+24>>2]&15](h)|0)&128)){g=a+56|0;f=c[g>>2]|0;g=c[g+4>>2]|0;if(!(c[a+40>>2]|0)){a=c[e>>2]|0;a=Va[c[(c[a>>2]|0)+12>>2]&15](a)|0;a=ni(a|0,y|0,4)|0;d=y}else{sa(1,d|0)|0;e=c[d>>2]|0;e=ki(e|0,((e|0)<0)<<31>>31|0,1e7,0)|0;d=(c[d+4>>2]|0)/100|0;d=ei(e|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;a=a+48|0;a=fi(d|0,y|0,c[a>>2]|0,c[a+4>>2]|0)|0;d=y}a=fi(f|0,g|0,a|0,d|0)|0;d=y;if((d|0)<0|(d|0)==0&a>>>0<1){db[c[(c[h>>2]|0)+16>>2]&15](h,128);b=0;break}else{g=li(a|0,d|0,1e4,0)|0;e=y;f=((b|0)<0)<<31>>31;b=(e|0)<(f|0)|(e|0)==(f|0)&g>>>0<b>>>0?g:b;break}}while(0);h=(Va[c[(c[h>>2]|0)+28>>2]&15](h)|0)==0;l=i;return (h?0:b)|0}function Xf(a,b){a=a|0;b=b|0;a=c[a+28>>2]|0;db[c[(c[a>>2]|0)+8>>2]&15](a,b);return}function Yf(a){a=a|0;return 1}function Zf(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;a=c[a+476>>2]|0;if(!a)return;Rc(a,b,d,e,f)|0;return}function _f(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+472>>2]|0;if(!a)return;Pc(a,b,d)|0;return}function $f(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+28>>2]|0;eb[c[(c[a>>2]|0)+36>>2]&15](a,b,d);return}function ag(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((d|0)!=2)ja(18248,18213,200,18365);if((b|0)<49144)switch(b|0){case 16384:{e=c[a+56>>2]|0;l=f;return e|0}case 16388:{e=c[a+56+4>>2]|0;l=f;return e|0}default:{e=0;l=f;return e|0}}switch(b|0){case 49144:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=ni(e|0,y|0,4)|0;l=f;return e|0}else{sa(1,e|0)|0;d=c[e>>2]|0;d=ki(d|0,((d|0)<0)<<31>>31|0,1e7,0)|0;d=ei(d|0,y|0,(c[e+4>>2]|0)/100|0|0,0)|0;e=a+48|0;e=fi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;l=f;return e|0}case 49148:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=ni(e|0,y|0,36)|0;l=f;return e|0}else{sa(1,e|0)|0;b=c[e>>2]|0;b=ki(b|0,((b|0)<0)<<31>>31|0,1e7,0)|0;d=(c[e+4>>2]|0)/100|0;d=ei(b|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;e=a+48|0;fi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=y;l=f;return e|0}default:{e=0;l=f;return e|0}}return 0}function bg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,226,18353);switch(b|0){case 16384:{e=a+56|0;c[e>>2]=d;c[e+4>>2]=0;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}case 16388:{b=a+56|0;e=b;c[e>>2]=c[b>>2];c[e+4>>2]=d;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}default:return}}function cg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;if((d|0)!=2)ja(18248,18213,261,18343);if((b|0)!=2097156){h=0;return h|0}h=c[a+64>>2]|0;f=a+68|0;g=c[f>>2]|0;d=h&~g;if(!d){h=0;return h|0}b=0;while(1){if(1<<b&d|0){e=b;break}b=b+1|0;if(b>>>0>=32){e=32;break}}g=1<<e|g;c[f>>2]=g;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(h&~g))db[c[d+20>>2]&15](b,2560);else db[c[d+16>>2]&15](b,2560);h=e+1|0;return h|0}function dg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,289,18332);if((b|0)!=2097156)return;b=d+-1|0;if(b>>>0>=32)return;d=a+68|0;e=c[d>>2]&~(1<<b);c[d>>2]=e;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(c[a+64>>2]&~e)){db[c[d+20>>2]&15](b,2560);return}else{db[c[d+16>>2]&15](b,2560);return}}function eg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=1<<b+-1;if(!d){e=a+64|0;d=c[e>>2]&~b;c[e>>2]=d}else{e=a+64|0;d=c[e>>2]|b;c[e>>2]=d}b=c[a+28>>2]|0;e=c[b>>2]|0;if(!(d&~c[a+68>>2])){db[c[e+20>>2]&15](b,2560);return}else{db[c[e+16>>2]&15](b,2560);return}}function fg(a,b,d){a=a|0;b=b|0;d=d|0;if((d|0)!=2)ja(18248,18213,108,18322);switch(b>>>2|b<<30|0){case 0:{d=c[a+456>>2]|0;return d|0}case 1:{d=c[a+456+4>>2]|0;return d|0}case 2:{d=c[a+464>>2]|0;return d|0}case 3:{d=c[a+464+4>>2]|0;return d|0}default:{d=0;return d|0}}return 0}function gg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;i=k+8|0;if((f|0)!=2)ja(18248,18213,158,18263);switch(d>>>2|d<<30|0){case 0:{j=b+456|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 1:{d=b+456|0;f=c[d>>2]|0;g=d;c[g>>2]=f;c[g+4>>2]=e;g=e>>>16&255;if((f|0)==1&(e|0)==0){_h(18274)|0;Da(0)}h=(e&-16777216|0)==16777216&0==0;if(h&(g|0)==1){a[i>>0]=f;j=c[b+12>>2]|0;eb[c[j+4>>2]&15](c[j>>2]|0,i,1);j=d;c[j>>2]=0;c[j+4>>2]=0;j=b+464|0;c[j>>2]=0;c[j+4>>2]=16842752;l=k;return}if(h&(g|0)==0){j=d;c[j>>2]=0;c[j+4>>2]=0;l=k;return}else{i=j;c[i>>2]=f;c[i+4>>2]=e;Yh(18286,j)|0;l=k;return}}case 2:{j=b+464|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 3:{i=b+464|0;j=i;c[j>>2]=c[i>>2];c[j+4>>2]=e;l=k;return}default:{l=k;return}}}function hg(b,d,e,f,g,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+160|0;v=D+136|0;t=D+128|0;u=D;A=lf(28)|0;B=A+4|0;r=c[B>>2]|0;o=r+1|0;C=A+8|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){p=A;q=c[A>>2]|0;o=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}a[q+(o<<2)>>0]=0;o=(c[p>>2]|0)+(c[B>>2]<<2)+1|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;z=A+12|0;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}x=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=x;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[A>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;jg(A,17657,17668,24);jg(A,17692,17698,21);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+2|0;p=c[C>>2]|0;if((p|0)<(o|0)){p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}else{p=A;q=c[A>>2]|0;o=r}o=q+(o<<2)|0;a[o>>0]=a[17719]|0;a[o+1>>0]=a[17720]|0;a[o+2>>0]=a[17721]|0;a[o+3>>0]=a[17722]|0;a[o+4>>0]=a[17723]|0;o=(c[p>>2]|0)+(c[B>>2]<<2)+5|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+2|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+3|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17724)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=-2137614336;kg(A,17743,0,0);jg(A,17747,17743,4);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;jg(A,17763,17770,5);jg(A,17657,17775,6);q=c[b+24>>2]|0;r=c[b+28>>2]|0;r=Va[c[(c[r>>2]|0)+32>>2]&15](r)|0;c[t>>2]=q;p=0;o=u+(Wg(u,128,17781,t)|0)|0;do{if(1<<p&r){a[o>>0]=p+97;o=o+1|0}p=p+1|0}while((p|0)!=26);a[o>>0]=0;jg(A,17786,u,(Pg(u)|0)+1|0);jg(A,17818,(q|0)<33?17796:17807,11);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17827)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=9713015;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;q=c[B>>2]|0;o=q+6|0;p=c[C>>2]|0;if((p|0)<(o|0)){r=(p*3|0)/2|0;r=(r|0)<(o|0)?o:r;p=Cg(c[A>>2]|0,r<<2)|0;c[A>>2]=p;c[C>>2]=r;r=A;o=c[B>>2]|0}else{r=A;p=c[A>>2]|0;o=q}o=p+(o<<2)|0;p=17843;q=o+21|0;do{a[o>>0]=a[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(q|0));o=(c[r>>2]|0)+(c[B>>2]<<2)+21|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+6|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+7|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;jg(A,17843,0,0);jg(A,17657,17881,15);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;kg(A,17904,-2147483648,0);jg(A,17747,17904,7);t=b+32|0;u=c[t>>2]|0;t=c[t+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){x=A;w=A;q=c[A>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;x=A;p=o+1|0;w=A}r=pi(s|0)|0;c[B>>2]=p;c[q+(o<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=128;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;r=p+(o<<2)|0;a[r>>0]=a[17911]|0;a[r+1>>0]=a[17912]|0;a[r+2>>0]=a[17913]|0;a[r+3>>0]=a[17914]|0;a[r+4>>0]=a[17915]|0;r=(c[x>>2]|0)+(c[B>>2]<<2)+5|0;a[r>>0]=0;a[r+1>>0]=0;a[r+2>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;jg(A,17657,17916,10);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))p=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}o=p+(o<<2)|0;a[o>>0]=115;a[o+1>>0]=111;a[o+2>>0]=99;a[o+3>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[v>>2]=17926;c[v+4>>2]=17950;c[v+8>>2]=0;lg(A,0,v);jg(A,17961,0,0);kg(A,17968,33554432,0);jg(A,17657,17974,13);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=117440512;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=2;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=3072;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;kg(A,18007,1074790400,0);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;jg(A,17843,0,0);jg(A,17657,18012,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18024)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=520093696;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=4160;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16384;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=150994944;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=184549376;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;v=b+480|0;if((c[v>>2]|0)>0){u=0;do{t=(u<<12)+1073807360|0;kg(A,17535,t,0);jg(A,17657,18035,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=1048576;u=u+1|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}while((u|0)<(c[v>>2]|0))}u=c[b+16>>2]|0;if(u|0){kg(A,18047,1090519040,0);jg(A,17657,18059,19);t=c[u+16>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=ig(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=65;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t>>31|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18898)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18904)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+8>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=ig(A,18078)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;jg(A,18085,18092,9);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Cg(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;b=p+(o<<2)|0;a[b>>0]=a[18101]|0;a[b+1>>0]=a[18102]|0;a[b+2>>0]=a[18103]|0;a[b+3>>0]=a[18104]|0;a[b+4>>0]=a[18105]|0;a[b+5>>0]=a[18106]|0;a[b+6>>0]=a[18107]|0;a[(c[x>>2]|0)+(c[B>>2]<<2)+7>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;n=(n|0)==0?28468:n;jg(A,18108,n,(Pg(n)|0)+1|0);if(!((g|0)==0&(h|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18117)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(f|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=pi(e|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=ei(g|0,h|0,e|0,f|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18136)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}h=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=h}if(!((k|0)==0&(m|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18153)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(j|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=pi(i|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=ei(k|0,m|0,i|0,j|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=ig(A,18172)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=pi(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}m=pi(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=m}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Cg(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0)){k=p;m=c[x>>2]|0;C=o;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;mg(A,d)|0;C=c[w>>2]|0;Bg(C);C=A+16|0;C=c[C>>2]|0;Bg(C);Bg(A);l=D;return}else{k=(q*3|0)/2|0;k=(k|0)<(p|0)?p:k;m=Cg(c[w>>2]|0,k<<2)|0;c[w>>2]=m;c[C>>2]=k;C=c[B>>2]|0;k=C+1|0;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;mg(A,d)|0;C=c[w>>2]|0;Bg(C);C=A+16|0;C=c[C>>2]|0;Bg(C);Bg(A);l=D;return}}function ig(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+20|0;h=c[i>>2]|0;a:do if((h|0)>0){e=c[a+16>>2]|0;d=0;while(1){f=e+d|0;if(!(Og(f,b)|0))break;d=d+1+(Pg(f)|0)|0;if((d|0)>=(h|0))break a}return d|0}while(0);f=(Pg(b)|0)+1|0;g=f+h|0;d=a+24|0;e=c[d>>2]|0;if((g|0)>(e|0)){h=(e*3|0)/2|0;h=(g|0)>(h|0)?g:h;a=a+16|0;e=Cg(c[a>>2]|0,h)|0;c[a>>2]=e;c[d>>2]=h;d=c[i>>2]|0}else{e=c[a+16>>2]|0;d=h}ri(e+d|0,b|0,f|0)|0;c[i>>2]=g;i=d;return i|0}function jg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=a+4|0;f=c[j>>2]|0;g=f+1|0;k=a+8|0;h=c[k>>2]|0;if((h|0)>(f|0))h=c[a>>2]|0;else{f=(h*3|0)/2|0;f=(f|0)<(g|0)?g:f;h=Cg(c[a>>2]|0,f<<2)|0;c[a>>2]=h;c[k>>2]=f;f=c[j>>2]|0;g=f+1|0}c[j>>2]=g;c[h+(f<<2)>>2]=50331648;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Cg(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=pi(e|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;b=ig(a,b)|0;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Cg(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=pi(b|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;f=(e+3|0)/4|0;g=c[j>>2]|0;h=g+f|0;i=c[k>>2]|0;if((i|0)<(h|0)){i=(i*3|0)/2|0;i=(i|0)<(h|0)?h:i;b=Cg(c[a>>2]|0,i<<2)|0;c[a>>2]=b;c[k>>2]=i;k=a;a=c[j>>2]|0;a=b+(a<<2)|0;ri(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;si(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}else{k=a;b=c[a>>2]|0;a=g;a=b+(a<<2)|0;ri(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;si(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}}function kg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+272|0;j=m+256|0;k=m;c[j>>2]=b;f=j+8|0;c[f>>2]=d;c[f+4>>2]=e;Wg(k,256,18240,j)|0;j=a+4|0;f=c[j>>2]|0;b=f+1|0;i=a+8|0;d=c[i>>2]|0;if((d|0)>(f|0)){e=c[a>>2]|0;d=f}else{d=(d*3|0)/2|0;d=(d|0)<(b|0)?b:d;e=Cg(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=c[j>>2]|0;b=d+1|0}c[j>>2]=b;c[e+(d<<2)>>2]=16777216;f=Pg(k)|0;g=f+1|0;h=(f+4|0)/4|0;b=c[j>>2]|0;d=h+b|0;e=c[i>>2]|0;if((e|0)<(d|0)){e=(e*3|0)/2|0;d=(e|0)<(d|0)?d:e;e=Cg(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=a;b=c[j>>2]|0}else{d=a;e=c[a>>2]|0}ri(e+(b<<2)|0,k|0,g|0)|0;si((c[d>>2]|0)+(c[j>>2]<<2)+g|0,0,f&3^3|0)|0;c[j>>2]=(c[j>>2]|0)+h;k=a+12|0;c[k>>2]=(c[k>>2]|0)+1;l=m;return}function lg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4;if(!e)b=0;else{b=0;do{b=b+1+(Pg(e)|0)|0;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4}while((e|0)!=0)}f=Ag(b)|0;c[g>>2]=d;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4;if(!e){g=0;jg(a,17657,f,g);Bg(f);l=h;return}b=0;do{d=(Pg(e)|0)+1|0;ri(f+b|0,e|0,d|0)|0;b=d+b|0;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4}while((e|0)!=0);jg(a,17657,f,b);Bg(f);l=h;return}function mg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c[b+12>>2]|0)ja(18189,18213,536,18229);i=b+4|0;e=c[i>>2]|0;f=e+1|0;g=b+8|0;h=c[g>>2]|0;if((h|0)>(e|0)){h=b;g=c[b>>2]|0}else{e=(h*3|0)/2|0;e=(e|0)<(f|0)?f:e;j=Cg(c[b>>2]|0,e<<2)|0;c[b>>2]=j;c[g>>2]=e;e=c[i>>2]|0;f=e+1|0;h=b;g=j}c[i>>2]=f;c[g+(e<<2)>>2]=150994944;e=c[i>>2]<<2;g=c[b+20>>2]|0;c[d>>2]=-302117424;c[d+20>>2]=285212672;c[d+24>>2]=268435456;c[d+28>>2]=0;c[d+32>>2]=pi(g|0)|0;c[d+36>>2]=pi(e|0)|0;c[d+8>>2]=671088640;ri(d+40|0,c[h>>2]|0,e|0)|0;e=e+40|0;if(e&4)while(1){f=e+1|0;a[d+e>>0]=0;if(!(f&7)){e=f;break}else e=f}c[d+16>>2]=pi(e|0)|0;j=d+e|0;i=j;c[i>>2]=0;c[i+4>>2]=0;j=j+8|0;c[j>>2]=0;c[j+4>>2]=0;e=e+16|0;c[d+12>>2]=pi(e|0)|0;ri(d+e|0,c[b+16>>2]|0,g|0)|0;e=e+g|0;if(!(e&7)){j=e;b=pi(j|0)|0;d=d+4|0;c[d>>2]=b;return j|0}f=e;while(1){e=f+1|0;a[d+f>>0]=0;if(!(e&7))break;else f=e}b=pi(e|0)|0;j=d+4|0;c[j>>2]=b;return e|0}function ng(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;Xh(a,e)|0;l=d;return}function og(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+24|0;f=g+16|0;e=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Ie(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[e>>2]=b;ng(18376,e);i=-1;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;ng(18401,f);i=-1;l=g;return i|0}}return 0}function pg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+16|0;f=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Ie(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[d>>2]=e;i=0;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;ng(18401,f);i=-1;l=g;return i|0}}return 0}function qg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=lf(24)|0;c[f>>2]=a;c[f+4>>2]=d;c[f+8>>2]=e;c[a>>2]=Ah(b)|0;if(!(ve(b)|0))rg();else{c[f+12>>2]=10;c[f+16>>2]=f;Yd(b,0,0,f,16,1)|0;return}}function rg(){ra()}function sg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;oa=l;l=l+816|0;ma=oa+796|0;na=oa+744|0;ja=oa+736|0;ga=oa+728|0;fa=oa+720|0;ea=oa+712|0;da=oa+704|0;ca=oa+696|0;ba=oa+688|0;aa=oa+680|0;$=oa+672|0;_=oa+664|0;Y=oa+656|0;X=oa+648|0;W=oa+640|0;V=oa+632|0;U=oa+624|0;T=oa+616|0;ia=oa+608|0;P=oa+600|0;O=oa+592|0;N=oa+584|0;M=oa+576|0;L=oa+568|0;K=oa+560|0;ha=oa+552|0;H=oa+544|0;G=oa+536|0;F=oa+528|0;E=oa+520|0;D=oa+512|0;J=oa+504|0;A=oa+488|0;v=oa+480|0;u=oa+472|0;t=oa+464|0;s=oa+456|0;r=oa+448|0;q=oa+440|0;p=oa+432|0;j=oa+424|0;i=oa+416|0;n=oa+408|0;m=oa+400|0;k=oa+392|0;h=oa+384|0;g=oa+376|0;C=oa+288|0;w=oa+256|0;x=oa+792|0;z=oa+748|0;S=oa;la=oa+368|0;pa=oa+360|0;B=oa+352|0;I=oa+344|0;R=oa+336|0;Z=oa+328|0;f=oa+320|0;ka=c[b>>2]|0;Re(pa,d,e);e=pa;d=c[e>>2]|0;e=c[e+4>>2]|0;pa=la;c[pa>>2]=d;c[pa+4>>2]=e;if((d|0)==7){c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];c[g>>2]=Me(ma)|0;ng(18452,g);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);Da(1)}pa=w;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18463);pa=C;d=c[pa+4>>2]|0;a:do switch(c[pa>>2]|0){case 6:{c[h>>2]=18463;ng(18376,h);Q=6;break}case 1:{if((d|0)!=1)if((d|0)>1){ng(18471,m);Da(1)}else{ng(18527,n);Da(1)}m=la;n=c[m+4>>2]|0;pa=w;c[pa>>2]=c[m>>2];c[pa+4>>2]=n;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18633);switch(c[C>>2]|0){case 6:{c[i>>2]=18633;ng(18376,i);break}case 0:{g=Ah((c[C+4>>2]|0)+4|0)|0;c[ka+8>>2]=g;d=c[3252]|0;e=Tg(d,44)|0;b:do if(!e){o=d;Q=20}else{h=Pg(g)|0;while(1){if((e-d|0)==(h|0)?(Gh(g,d,h)|0)==0:0)break b;d=e+1|0;e=Tg(d,44)|0;if(!e){o=d;Q=20;break}}}while(0);if((Q|0)==20?Og(g,o)|0:0){c[ka+4>>2]=0;c[p>>2]=g;ng(18662,p);break a}c[ka+4>>2]=13008;cb[c[13012>>2]&15](ka);pa=la;d=c[pa+4>>2]|0;e=w;c[e>>2]=c[pa>>2];c[e+4>>2]=d;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18688);e=C;d=c[e>>2]|0;e=c[e+4>>2]|0;switch(d|0){case 6:{c[q>>2]=18688;ng(18376,q);break}case 1:{q=ka+16|0;c[q>>2]=oi(mi(d|0,e|0,32)|0,y|0,20)|0;c[q+4>>2]=y;q=la;r=c[q+4>>2]|0;pa=w;c[pa>>2]=c[q>>2];c[pa+4>>2]=r;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18700);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+196>>2]=Ah((c[C+4>>2]|0)+4|0)|0;break}default:{c[s>>2]=18700;ng(18641,s);break a}}r=la;s=c[r+4>>2]|0;pa=w;c[pa>>2]=c[r>>2];c[pa+4>>2]=s;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18705);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+220>>2]=Ah((c[C+4>>2]|0)+4|0)|0;break}default:{c[t>>2]=18705;ng(18641,t);break a}}s=la;t=c[s+4>>2]|0;pa=w;c[pa>>2]=c[s>>2];c[pa+4>>2]=t;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18712);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+232>>2]=Ah((c[C+4>>2]|0)+4|0)|0;break}default:{c[u>>2]=18712;ng(18641,u);break a}}t=la;u=c[t+4>>2]|0;pa=w;c[pa>>2]=c[t>>2];c[pa+4>>2]=u;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Ie(C,ma,18719);switch(c[C>>2]|0){case 6:break;case 0:{d=(c[C+4>>2]|0)+4|0;nf(ma);h=C;i=z+36|0;c:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 0:break c;case 36:{e=d+1|0;if((a[e>>0]|0)==123){e=C;g=d+2|0;d:while(1){d=a[g>>0]|0;switch(d<<24>>24){case 0:case 125:break d;default:{}}if((e-h|0)>>>0<31){a[e>>0]=d;d=e+1|0}else d=e;e=d;g=g+1|0}a[e>>0]=0;d=(a[g>>0]|0)==125?g+1|0:g;if(!(Og(C,18727)|0)){Ra(x|0)|0;Pa(x|0,z|0)|0;u=c[i>>2]|0;v=(u|0)/60|0;u=(u|0)<-59;v=u?0-v|0:v;pa=(v|0)/60|0;c[A>>2]=u?43:45;c[A+4>>2]=pa;c[A+8>>2]=v-(pa*60|0);Wg(w,32,18730,A)|0;pf(ma,w)}}else{d=e;Q=52}break}default:{d=d+1|0;Q=52}}if((Q|0)==52){Q=0;of(ma,g)}}of(ma,0);c[ka+184>>2]=c[ma>>2];break}default:{c[v>>2]=18719;ng(18641,v);break a}}i=ka+96|0;c[J>>2]=c[i>>2];Wg(S,256,18745,J)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(B,ma,S);e=B;d=c[e>>2]|0;e:do if((d|0)==6)Q=68;else{h=J+4|0;g=J+4|0;e=c[e+4>>2]|0;f:while(1){if((c[i>>2]|0)>3){Q=58;break}pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Ie(J,ma,18770);switch(c[J>>2]|0){case 6:{Q=60;break f}case 0:break;default:{Q=61;break f}}pa=Ah((c[h>>2]|0)+4|0)|0;c[ka+48+((c[i>>2]|0)*12|0)+4>>2]=pa;pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Ie(J,ma,18775);switch(c[J>>2]|0){case 6:{d=0;break}case 0:{d=Ah((c[g>>2]|0)+4|0)|0;break}default:{Q=65;break f}}c[ka+48+((c[i>>2]|0)*12|0)>>2]=d;e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[H>>2]=e;Wg(S,256,18745,H)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(B,ma,S);e=B;d=c[e>>2]|0;if((d|0)==6){Q=68;break e}else e=c[e+4>>2]|0}if((Q|0)==58){ng(18753,D);break}else if((Q|0)==60){c[E>>2]=18770;ng(18376,E)}else if((Q|0)==61){c[F>>2]=18770;ng(18641,F)}else if((Q|0)==65){c[G>>2]=18775;ng(18641,G);break a}break a}while(0);g:do if((Q|0)==68){j=ka+164|0;c[ha>>2]=c[j>>2];Wg(S,256,18782,ha)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(I,ma,S);e=I;d=c[e>>2]|0;h:do if((d|0)!=6){h=ha+4|0;i=ha+4|0;e=c[e+4>>2]|0;i:while(1){if((c[j>>2]|0)>3){Q=71;break}pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Ie(ha,ma,18770);switch(c[ha>>2]|0){case 6:{Q=73;break i}case 0:break;default:{Q=74;break i}}pa=Ah((c[h>>2]|0)+4|0)|0;c[ka+100+(c[j>>2]<<4)+8>>2]=pa;pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Ie(ha,ma,18809);j:do switch(c[ha>>2]|0){case 6:{d=c[j>>2]|0;if(!d){d=S;e=18813;g=d+10|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(g|0));d=S;break j}else{c[O>>2]=d;Wg(S,256,18823,O)|0;d=S;break j}}case 0:{d=(c[i>>2]|0)+4|0;break}default:{Q=77;break i}}while(0);d=Ah(d)|0;e=c[j>>2]|0;c[ka+100+(e<<4)+4>>2]=d;e=e+1|0;c[j>>2]=e;c[P>>2]=e;Wg(S,256,18782,P)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(I,ma,S);e=I;d=c[e>>2]|0;if((d|0)==6)break h;else e=c[e+4>>2]|0}if((Q|0)==71){ng(18787,K);break g}else if((Q|0)==73){c[L>>2]=18770;ng(18376,L)}else if((Q|0)==74){c[M>>2]=18770;ng(18641,M)}else if((Q|0)==77){c[N>>2]=18809;ng(18641,N);break a}break a}while(0);i=ka+180|0;c[ia>>2]=c[i>>2];Wg(S,256,18835,ia)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(R,ma,S);e=R;d=c[e>>2]|0;k:do if((d|0)!=6){g=ia+4|0;h=ia+4|0;e=c[e+4>>2]|0;l:while(1){if((c[i>>2]|0)>0){Q=86;break}pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18871);switch(c[ia>>2]|0){case 6:{Q=88;break l}case 0:break;default:{Q=89;break l}}pa=(c[g>>2]|0)+4|0;P=Ah(pa)|0;c[ka+168+((c[i>>2]|0)*12|0)>>2]=P;if(!(Og(pa,18878)|0)){pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18882);switch(c[ia>>2]|0){case 6:{Q=93;break l}case 0:break;default:{Q=94;break l}}pa=Ah((c[h>>2]|0)+4|0)|0;c[ka+168+((c[i>>2]|0)*12|0)+4>>2]=pa}e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[Y>>2]=e;Wg(S,256,18835,Y)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(R,ma,S);e=R;d=c[e>>2]|0;if((d|0)==6)break k;else e=c[e+4>>2]|0}if((Q|0)==86){ng(18841,T);break g}else if((Q|0)==88){c[U>>2]=18871;ng(18376,U);Q=90}else if((Q|0)==89){c[V>>2]=18871;ng(18641,V);Q=90}else if((Q|0)==93){c[W>>2]=18882;ng(18376,W);Q=95}else if((Q|0)==94){c[X>>2]=18882;ng(18641,X);Q=95}if((Q|0)==90)break a;else if((Q|0)==95)break a}while(0);d=ka+32|0;c[d>>2]=0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(Z,ma,18889);g=Z;e=c[g>>2]|0;g=c[g+4>>2]|0;m:do if((e|0)!=6){pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18775);switch(c[ia>>2]|0){case 6:{c[_>>2]=18775;ng(18376,_);break}case 0:{c[d>>2]=Ah((c[ia+4>>2]|0)+4|0)|0;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18898);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[aa>>2]=18898;ng(18376,aa);break}case 1:{c[ka+36>>2]=d;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18904);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[ca>>2]=18904;ng(18376,ca);break}case 1:{c[ka+40>>2]=d;pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18911);switch(c[ia>>2]|0){case 6:break m;case 0:{c[ka+208>>2]=Ah((c[ia+4>>2]|0)+4|0)|0;break m}default:{c[ea>>2]=18911;ng(18641,ea);break a}}}default:{c[da>>2]=18904;ng(18401,da)}}break a}default:{c[ba>>2]=18898;ng(18401,ba)}}break a}default:{c[$>>2]=18775;ng(18641,$)}}break a}while(0);da=la;ea=c[da+4>>2]|0;pa=ha;c[pa>>2]=c[da>>2];c[pa+4>>2]=ea;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18920);switch(c[ia>>2]|0){case 6:{d=0;break}case 0:{d=Ah((c[ia+4>>2]|0)+4|0)|0;break}default:{c[fa>>2]=18920;ng(18641,fa);break a}}c[ka+192>>2]=d;ea=la;fa=c[ea+4>>2]|0;pa=ha;c[pa>>2]=c[ea>>2];c[pa+4>>2]=fa;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Ie(ia,ma,18933);n:do switch(c[ia>>2]|0){case 6:break;case 0:{d=(c[ia+4>>2]|0)+4|0;if(!(Og(d,18939)|0)){c[ka+188>>2]=0;break n}if(!(Og(d,18944)|0)){c[ka+188>>2]=1;break n}c[ja>>2]=d;ng(18949,ja);Da(1);break}default:{c[ga>>2]=18933;ng(18641,ga);break a}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ie(f,ma,18981);switch(c[f>>2]|0){case 4:{c[ka+28>>2]=c[f+4>>2];c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);pa=b+20|0;c[pa>>2]=0;ug(b);l=oa;return}case 6:{c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);pa=b+20|0;c[pa>>2]=0;ug(b);l=oa;return}default:{c[na>>2]=18981;ng(18996,na);break a}}}while(0);Da(1);break}default:{c[r>>2]=18688;ng(18401,r)}}break a}default:{c[j>>2]=18633;ng(18641,j)}}break}default:{c[k>>2]=18463;ng(18401,k);Q=6}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ke(ma);Da(1)}function tg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if((b|0)<0){c[f>>2]=0-b;ng(18423,f);Da(1)}else{eb[c[a+12>>2]&15](c[a+16>>2]|0,d,e);l=g;return}}function ug(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=c[b>>2]|0;f=b+20|0;d=c[f>>2]|0;a:do if((d|0)<4)while(1){e=c[g+196+(d*12|0)>>2]|0;if(e|0)break a;e=d+1|0;c[f>>2]=e;if((d|0)<3)d=e;else{d=e;h=5;break}}else h=5;while(0);do if((h|0)==5){if((d|0)!=4){e=c[g+196+(d*12|0)>>2]|0;break}d=c[b+4>>2]|0;if(d|0)cb[d&15](c[b+8>>2]|0);Bg(b);return}while(0);d=c[g>>2]|0;if((((d|0)!=0?(Tg(e,58)|0)==0:0)?(a[e>>0]|0)!=47:0)?(i=yh(d,47)|0,(i|0)!=0):0){g=i+1-d|0;h=(Pg(e)|0)+1|0;i=Ag(h+g|0)|0;ri(i|0,d|0,g|0)|0;ri(i+g|0,e|0,h|0)|0;d=i}else d=Ah(e)|0;if(!(ve(d)|0))rg();c[b+12>>2]=11;c[b+16>>2]=b;Yd(d,0,0,b,16,1)|0;Bg(d);return}function vg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;g=Ag(d)|0;e=a+20|0;c[f+196+((c[e>>2]|0)*12|0)+4>>2]=g;ri(c[f+196+((c[e>>2]|0)*12|0)+4>>2]|0,b|0,d|0)|0;c[f+196+((c[e>>2]|0)*12|0)+8>>2]=d;c[e>>2]=(c[e>>2]|0)+1;ug(a);return}function wg(b,d){b=b|0;d=d|0;var e=0,f=0;if((a[d>>0]|0)==33){e=Ah(d+1|0)|0;d=b+184|0;b=c[d>>2]|0;Bg(b);c[d>>2]=e;return}else{e=b+184|0;f=c[e>>2]|0;f=(f|0)==0?28468:f;b=Pg(f)|0;b=Ag(b+2+(Pg(d)|0)|0)|0;Qg(b,f)|0;f=b+(Pg(b)|0)|0;a[f>>0]=32;a[f+1>>0]=0;Rg(b,d)|0;d=b;b=c[e>>2]|0;Bg(b);c[e>>2]=d;return}}function xg(a){a=a|0;var b=0,d=0;Bg(c[a+8>>2]|0);Bg(c[a+184>>2]|0);Bg(c[a+196>>2]|0);Bg(c[a+200>>2]|0);Bg(c[a+208>>2]|0);Bg(c[a+212>>2]|0);Bg(c[a+220>>2]|0);Bg(c[a+224>>2]|0);Bg(c[a+232>>2]|0);Bg(c[a+236>>2]|0);d=a+96|0;if((c[d>>2]|0)>0){b=0;do{Bg(c[a+48+(b*12|0)+4>>2]|0);Bg(c[a+48+(b*12|0)>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+164|0;if((c[d>>2]|0)>0){b=0;do{Bg(c[a+100+(b<<4)+8>>2]|0);Bg(c[a+100+(b<<4)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+180|0;if((c[d>>2]|0)<=0){d=a+192|0;d=c[d>>2]|0;Bg(d);d=a+32|0;d=c[d>>2]|0;Bg(d);a=c[a>>2]|0;Bg(a);return}b=0;do{Bg(c[a+168+(b*12|0)>>2]|0);Bg(c[a+168+(b*12|0)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0));d=a+192|0;d=c[d>>2]|0;Bg(d);d=a+32|0;d=c[d>>2]|0;Bg(d);a=c[a>>2]|0;Bg(a);return}function yg(a){a=a|0;return Va[c[(c[a+4>>2]|0)+8>>2]&15](a)|0}function zg(a){a=a|0;si(a|0,0,248)|0;return}function Ag(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;o=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;n=c[6971]|0;d=n>>>a;if(d&3|0){b=(d&1^1)+a|0;a=27924+(b<<1<<2)|0;d=a+8|0;e=c[d>>2]|0;f=e+8|0;g=c[f>>2]|0;if((g|0)==(a|0))c[6971]=n&~(1<<b);else{c[g+12>>2]=a;c[d>>2]=g}w=b<<3;c[e+4>>2]=w|3;w=e+w+4|0;c[w>>2]=c[w>>2]|1;w=f;l=x;return w|0}m=c[6973]|0;if(k>>>0>m>>>0){if(d|0){b=2<<a;b=d<<a&(b|0-b);b=(b&0-b)+-1|0;i=b>>>12&16;b=b>>>i;d=b>>>5&8;b=b>>>d;g=b>>>2&4;b=b>>>g;a=b>>>1&2;b=b>>>a;e=b>>>1&1;e=(d|i|g|a|e)+(b>>>e)|0;b=27924+(e<<1<<2)|0;a=b+8|0;g=c[a>>2]|0;i=g+8|0;d=c[i>>2]|0;if((d|0)==(b|0)){a=n&~(1<<e);c[6971]=a}else{c[d+12>>2]=b;c[a>>2]=d;a=n}w=e<<3;h=w-k|0;c[g+4>>2]=k|3;f=g+k|0;c[f+4>>2]=h|1;c[g+w>>2]=h;if(m|0){e=c[6976]|0;b=m>>>3;d=27924+(b<<1<<2)|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[6973]=h;c[6976]=f;w=i;l=x;return w|0}g=c[6972]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=c[28188+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(c[j+4>>2]&-8)-k|0;while(1){a=c[d+16>>2]|0;if(!a){a=c[d+20>>2]|0;if(!a)break}h=(c[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){d=0;break}}while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);do if(f|0){b=c[i+28>>2]|0;a=28188+(b<<2)|0;if((i|0)==(c[a>>2]|0)){c[a>>2]=d;if(!d){c[6972]=g&~(1<<b);break}}else{w=f+16|0;c[((c[w>>2]|0)==(i|0)?w:f+20|0)>>2]=d;if(!d)break}c[d+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}b=c[i+20>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}while(0);if(j>>>0<16){w=j+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[h+4>>2]=j|1;c[h+j>>2]=j;if(m|0){e=c[6976]|0;b=m>>>3;d=27924+(b<<1<<2)|0;b=1<<b;if(!(b&n)){c[6971]=b|n;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[6973]=j;c[6976]=h}w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=c[6972]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{n=(a+1048320|0)>>>16&8;r=a<<n;i=(r+520192|0)>>>16&4;r=r<<i;j=(r+245760|0)>>>16&2;j=14-(i|n|j)+(r<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=c[28188+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;r=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(c[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;r=65;break a}else{a=d;f=h}r=c[d+20>>2]|0;d=c[d+16+(i>>>31<<2)>>2]|0;g=(r|0)==0|(r|0)==(d|0)?g:r;if(!d){d=g;r=61;break}else i=i<<1}}while(0);if((r|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){n=k;break}n=(a&0-a)+-1|0;h=n>>>12&16;n=n>>>h;g=n>>>5&8;n=n>>>g;i=n>>>2&4;n=n>>>i;j=n>>>1&2;n=n>>>j;d=n>>>1&1;a=0;d=c[28188+((g|h|i|j|d)+(n>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else r=65}if((r|0)==65){g=d;while(1){n=(c[g+4>>2]&-8)-k|0;d=n>>>0<f>>>0;f=d?n:f;a=d?g:a;d=c[g+16>>2]|0;if(!d)d=c[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((c[6973]|0)-k|0)>>>0:0)?(m=i+k|0,m>>>0>i>>>0):0){g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;else{b=d;a=f}}else{b=d;a=f}}c[a>>2]=0}else{w=c[i+8>>2]|0;c[w+12>>2]=b;c[b+8>>2]=w}while(0);do if(g){a=c[i+28>>2]|0;d=28188+(a<<2)|0;if((i|0)==(c[d>>2]|0)){c[d>>2]=b;if(!b){e=e&~(1<<a);c[6972]=e;break}}else{w=g+16|0;c[((c[w>>2]|0)==(i|0)?w:g+20|0)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[i+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[i+20>>2]|0;if(a){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);b:do if(h>>>0<16){w=h+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[m+4>>2]=h|1;c[m+h>>2]=h;b=h>>>3;if(h>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=m;c[b+12>>2]=m;c[m+8>>2]=b;c[m+12>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;d=(w+245760|0)>>>16&2;d=14-(u|v|d)+(w<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=28188+(d<<2)|0;c[m+28>>2]=d;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<d;if(!(e&a)){c[6972]=e|a;c[b>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(h|0)){b=a;break c}else{e=e<<1;b=a}}c[d>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break b}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=m;c[v>>2]=m;c[m+8>>2]=w;c[m+12>>2]=b;c[m+24>>2]=0}while(0);w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=-1;while(0);d=c[6973]|0;if(d>>>0>=n>>>0){b=d-n|0;a=c[6976]|0;if(b>>>0>15){w=a+n|0;c[6976]=w;c[6973]=b;c[w+4>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=n|3}else{c[6973]=0;c[6976]=0;c[a+4>>2]=d|3;w=a+d+4|0;c[w>>2]=c[w>>2]|1}w=a+8|0;l=x;return w|0}h=c[6974]|0;if(h>>>0>n>>>0){u=h-n|0;c[6974]=u;w=c[6977]|0;v=w+n|0;c[6977]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}if(!(c[7089]|0)){c[7091]=4096;c[7090]=4096;c[7092]=-1;c[7093]=-1;c[7094]=0;c[7082]=0;c[7089]=o&-16^1431655768;a=4096}else a=c[7091]|0;i=n+48|0;j=n+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=n>>>0){w=0;l=x;return w|0}a=c[7081]|0;if(a|0?(m=c[7079]|0,o=m+k|0,o>>>0<=m>>>0|o>>>0>a>>>0):0){w=0;l=x;return w|0}d:do if(!(c[7082]&4)){d=c[6977]|0;e:do if(d){e=28332;while(1){o=c[e>>2]|0;if(o>>>0<=d>>>0?(o+(c[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=c[e+8>>2]|0;if(!a){r=128;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=ti(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;r=145;break d}}else{e=a;r=136}}else b=0}else r=128;while(0);do if((r|0)==128){d=ti(0)|0;if((d|0)!=(-1|0)?(b=d,p=c[7090]|0,q=p+-1|0,b=((q&b|0)==0?0:(q+b&0-p)-b|0)+k|0,p=c[7079]|0,q=b+p|0,b>>>0>n>>>0&b>>>0<2147483647):0){o=c[7081]|0;if(o|0?q>>>0<=p>>>0|q>>>0>o>>>0:0){b=0;break}a=ti(b|0)|0;if((a|0)==(d|0)){h=b;g=d;r=145;break d}else{e=a;r=136}}else b=0}while(0);do if((r|0)==136){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;r=145;break d}a=c[7091]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;r=145;break d}if((ti(a|0)|0)==(-1|0)){ti(d|0)|0;b=0;break}else{h=a+b|0;g=e;r=145;break d}}while(0);c[7082]=c[7082]|4;r=143}else{b=0;r=143}while(0);if(((r|0)==143?k>>>0<2147483647:0)?(u=ti(k|0)|0,q=ti(0)|0,s=q-u|0,t=s>>>0>(n+40|0)>>>0,!((u|0)==(-1|0)|t^1|u>>>0<q>>>0&((u|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=t?s:b;g=u;r=145}if((r|0)==145){b=(c[7079]|0)+h|0;c[7079]=b;if(b>>>0>(c[7080]|0)>>>0)c[7080]=b;j=c[6977]|0;f:do if(j){b=28332;while(1){a=c[b>>2]|0;d=c[b+4>>2]|0;if((g|0)==(a+d|0)){r=154;break}e=c[b+8>>2]|0;if(!e)break;else b=e}if(((r|0)==154?(v=b+4|0,(c[b+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){c[v>>2]=d+h;w=(c[6974]|0)+h|0;u=j+8|0;u=(u&7|0)==0?0:0-u&7;v=j+u|0;u=w-u|0;c[6977]=v;c[6974]=u;c[v+4>>2]=u|1;c[j+w+4>>2]=40;c[6978]=c[7093];break}if(g>>>0<(c[6975]|0)>>>0)c[6975]=g;d=g+h|0;b=28332;while(1){if((c[b>>2]|0)==(d|0)){r=162;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((r|0)==162?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;m=b+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;k=m+n|0;i=b-m-n|0;c[m+4>>2]=n|3;g:do if((j|0)==(b|0)){w=(c[6974]|0)+i|0;c[6974]=w;c[6977]=k;c[k+4>>2]=w|1}else{if((c[6976]|0)==(b|0)){w=(c[6973]|0)+i|0;c[6973]=w;c[6976]=k;c[k+4>>2]=w|1;c[k+w>>2]=w;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=c[b+8>>2]|0;d=c[b+12>>2]|0;if((d|0)==(a|0)){c[6971]=c[6971]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}else{g=c[b+24>>2]|0;a=c[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{w=c[b+8>>2]|0;c[w+12>>2]=a;c[a+8>>2]=w}while(0);if(!g)break;d=c[b+28>>2]|0;e=28188+(d<<2)|0;do if((c[e>>2]|0)!=(b|0)){w=g+16|0;c[((c[w>>2]|0)==(b|0)?w:g+20|0)>>2]=a;if(!a)break h}else{c[e>>2]=a;if(a|0)break;c[6972]=c[6972]&~(1<<d);break h}while(0);c[a+24>>2]=g;d=b+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(!d)break;c[a+20>>2]=d;c[d+24>>2]=a}while(0);b=b+h|0;f=h+i|0}else f=i;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;b=f>>>3;if(f>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=k;c[b+12>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=28188+(e<<2)|0;c[k+28>>2]=e;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[6972]|0;d=1<<e;if(!(a&d)){c[6972]=a|d;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break}b=c[b>>2]|0;i:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break i}else{e=e<<1;b=a}}c[d>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break g}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=k;c[v>>2]=k;c[k+8>>2]=w;c[k+12>>2]=b;c[k+24>>2]=0}while(0);w=m+8|0;l=x;return w|0}b=28332;while(1){a=c[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(c[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=c[b+8>>2]|0}f=w+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;b=a+8|0;d=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=d-u|0;c[6977]=v;c[6974]=u;c[v+4>>2]=u|1;c[g+d+4>>2]=40;c[6978]=c[7093];d=a+4|0;c[d>>2]=27;c[b>>2]=c[7083];c[b+4>>2]=c[7084];c[b+8>>2]=c[7085];c[b+12>>2]=c[7086];c[7083]=g;c[7084]=h;c[7086]=0;c[7085]=b;b=a+24|0;do{v=b;b=b+4|0;c[b>>2]=7}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;c[d>>2]=c[d>>2]&-2;c[j+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=j;c[b+12>>2]=j;c[j+8>>2]=b;c[j+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=28188+(e<<2)|0;c[j+28>>2]=e;c[j+20>>2]=0;c[f>>2]=0;b=c[6972]|0;a=1<<e;if(!(b&a)){c[6972]=b|a;c[d>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}b=c[d>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(g|0)){b=a;break j}else{e=e<<1;b=a}}c[d>>2]=j;c[j+24>>2]=b;c[j+12>>2]=j;c[j+8>>2]=j;break f}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=j;c[v>>2]=j;c[j+8>>2]=w;c[j+12>>2]=b;c[j+24>>2]=0}}else{w=c[6975]|0;if((w|0)==0|g>>>0<w>>>0)c[6975]=g;c[7083]=g;c[7084]=h;c[7086]=0;c[6980]=c[7089];c[6979]=-1;c[6984]=27924;c[6983]=27924;c[6986]=27932;c[6985]=27932;c[6988]=27940;c[6987]=27940;c[6990]=27948;c[6989]=27948;c[6992]=27956;c[6991]=27956;c[6994]=27964;c[6993]=27964;c[6996]=27972;c[6995]=27972;c[6998]=27980;c[6997]=27980;c[7e3]=27988;c[6999]=27988;c[7002]=27996;c[7001]=27996;c[7004]=28004;c[7003]=28004;c[7006]=28012;c[7005]=28012;c[7008]=28020;c[7007]=28020;c[7010]=28028;c[7009]=28028;c[7012]=28036;c[7011]=28036;c[7014]=28044;c[7013]=28044;c[7016]=28052;c[7015]=28052;c[7018]=28060;c[7017]=28060;c[7020]=28068;c[7019]=28068;c[7022]=28076;c[7021]=28076;c[7024]=28084;c[7023]=28084;c[7026]=28092;c[7025]=28092;c[7028]=28100;c[7027]=28100;c[7030]=28108;c[7029]=28108;c[7032]=28116;c[7031]=28116;c[7034]=28124;c[7033]=28124;c[7036]=28132;c[7035]=28132;c[7038]=28140;c[7037]=28140;c[7040]=28148;c[7039]=28148;c[7042]=28156;c[7041]=28156;c[7044]=28164;c[7043]=28164;c[7046]=28172;c[7045]=28172;w=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=w-u|0;c[6977]=v;c[6974]=u;c[v+4>>2]=u|1;c[g+w+4>>2]=40;c[6978]=c[7093]}while(0);b=c[6974]|0;if(b>>>0>n>>>0){u=b-n|0;c[6974]=u;w=c[6977]|0;v=w+n|0;c[6977]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}}c[(Jg()|0)>>2]=12;w=0;l=x;return w|0}function Bg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=c[6975]|0;a=c[a+-4>>2]|0;b=a&-8;j=d+b|0;do if(!(a&1)){e=c[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+b|0;if(h>>>0<f>>>0)return;if((c[6976]|0)==(h|0)){a=j+4|0;b=c[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}c[6973]=g;c[a>>2]=b&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[6971]=c[6971]&~(1<<d);i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){b=h+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){a=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;d=28188+(b<<2)|0;if((c[d>>2]|0)==(h|0)){c[d>>2]=a;if(!a){c[6972]=c[6972]&~(1<<b);i=h;b=g;break}}else{i=f+16|0;c[((c[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=h+16|0;d=c[b>>2]|0;if(d|0){c[a+16>>2]=d;c[d+24>>2]=a}b=c[b+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=c[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((c[6977]|0)==(j|0)){j=(c[6974]|0)+b|0;c[6974]=j;c[6977]=i;c[i+4>>2]=j|1;if((i|0)!=(c[6976]|0))return;c[6976]=0;c[6973]=0;return}if((c[6976]|0)==(j|0)){j=(c[6973]|0)+b|0;c[6973]=j;c[6976]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[6971]=c[6971]&~(1<<d);break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){d=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0;d=a}else{d=c[j+8>>2]|0;c[d+12>>2]=a;c[a+8>>2]=d;d=a}while(0);if(g|0){a=c[j+28>>2]|0;b=28188+(a<<2)|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=d;if(!d){c[6972]=c[6972]&~(1<<a);break}}else{e=g+16|0;c[((c[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;a=j+16|0;b=c[a>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}a=c[a+4>>2]|0;if(a|0){c[d+20>>2]=a;c[a+24>>2]=d}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[6976]|0)){c[6973]=f;return}}else{c[a>>2]=e&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}a=f>>>3;if(f>>>0<256){d=27924+(a<<1<<2)|0;b=c[6971]|0;a=1<<a;if(!(b&a)){c[6971]=b|a;a=d;b=d+8|0}else{b=d+8|0;a=c[b>>2]|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=28188+(e<<2)|0;c[i+28>>2]=e;c[i+20>>2]=0;c[i+16>>2]=0;b=c[6972]|0;d=1<<e;a:do if(!(b&d)){c[6972]=b|d;c[a>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i}else{a=c[a>>2]|0;b:do if((c[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;b=c[d>>2]|0;if(!b)break;if((c[b+4>>2]&-8|0)==(f|0)){a=b;break b}else{e=e<<1;a=b}}c[d>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break a}while(0);h=a+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=a;c[i+24>>2]=0}while(0);j=(c[6979]|0)+-1|0;c[6979]=j;if(j|0)return;a=28340;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[6979]=-1;return}function Cg(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=Ag(b)|0;return b|0}if(b>>>0>4294967231){c[(Jg()|0)>>2]=12;b=0;return b|0}d=Dg(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=Ag(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;ri(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Bg(a);b=d;return b|0}function Dg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=a+4|0;m=c[l>>2]|0;d=m&-8;i=a+d|0;if(!(m&3)){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[7091]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;k=a+b|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|3;m=i+4|0;c[m>>2]=c[m>>2]|1;Eg(k,d);return a|0}if((c[6977]|0)==(i|0)){k=(c[6974]|0)+d|0;d=k-b|0;e=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}c[l>>2]=m&1|b|2;c[e+4>>2]=d|1;c[6977]=e;c[6974]=d;return a|0}if((c[6976]|0)==(i|0)){e=(c[6973]|0)+d|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){k=a+b|0;e=a+e|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|1;c[e>>2]=d;e=e+4|0;c[e>>2]=c[e>>2]&-2;e=k}else{c[l>>2]=m&1|e|2;e=a+e+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[6973]=d;c[6976]=e;return a|0}e=c[i+4>>2]|0;if(e&2|0){a=0;return a|0}j=(e&-8)+d|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;f=e>>>3;do if(e>>>0<256){e=c[i+8>>2]|0;d=c[i+12>>2]|0;if((d|0)==(e|0)){c[6971]=c[6971]&~(1<<f);break}else{c[e+12>>2]=d;c[d+8>>2]=e;break}}else{h=c[i+24>>2]|0;d=c[i+12>>2]|0;do if((d|0)==(i|0)){e=i+16|0;f=e+4|0;d=c[f>>2]|0;if(!d){d=c[e>>2]|0;if(!d){f=0;break}}else e=f;while(1){g=d+20|0;f=c[g>>2]|0;if(!f){g=d+16|0;f=c[g>>2]|0;if(!f)break;else{d=f;e=g}}else{d=f;e=g}}c[e>>2]=0;f=d}else{f=c[i+8>>2]|0;c[f+12>>2]=d;c[d+8>>2]=f;f=d}while(0);if(h|0){d=c[i+28>>2]|0;e=28188+(d<<2)|0;if((c[e>>2]|0)==(i|0)){c[e>>2]=f;if(!f){c[6972]=c[6972]&~(1<<d);break}}else{g=h+16|0;c[((c[g>>2]|0)==(i|0)?g:h+20|0)>>2]=f;if(!f)break}c[f+24>>2]=h;d=i+16|0;e=c[d>>2]|0;if(e|0){c[f+16>>2]=e;c[e+24>>2]=f}d=c[d+4>>2]|0;if(d|0){c[f+20>>2]=d;c[d+24>>2]=f}}}while(0);if(k>>>0<16){c[l>>2]=m&1|j|2;m=a+j+4|0;c[m>>2]=c[m>>2]|1;return a|0}else{i=a+b|0;c[l>>2]=m&1|b|2;c[i+4>>2]=k|3;m=a+j+4|0;c[m>>2]=c[m>>2]|1;Eg(i,k);return a|0}return 0}function Eg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){f=c[a>>2]|0;if(!(d&3))return;h=a+(0-f)|0;b=f+b|0;if((c[6976]|0)==(h|0)){a=i+4|0;d=c[a>>2]|0;if((d&3|0)!=3)break;c[6973]=b;c[a>>2]=d&-2;c[h+4>>2]=b|1;c[i>>2]=b;return}e=f>>>3;if(f>>>0<256){a=c[h+8>>2]|0;d=c[h+12>>2]|0;if((d|0)==(a|0)){c[6971]=c[6971]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}g=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){d=h+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{f=c[h+8>>2]|0;c[f+12>>2]=a;c[a+8>>2]=f}while(0);if(g){d=c[h+28>>2]|0;e=28188+(d<<2)|0;if((c[e>>2]|0)==(h|0)){c[e>>2]=a;if(!a){c[6972]=c[6972]&~(1<<d);break}}else{f=g+16|0;c[((c[f>>2]|0)==(h|0)?f:g+20|0)>>2]=a;if(!a)break}c[a+24>>2]=g;d=h+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(d){c[a+20>>2]=d;c[d+24>>2]=a}}}else h=a;while(0);a=i+4|0;e=c[a>>2]|0;if(!(e&2)){if((c[6977]|0)==(i|0)){i=(c[6974]|0)+b|0;c[6974]=i;c[6977]=h;c[h+4>>2]=i|1;if((h|0)!=(c[6976]|0))return;c[6976]=0;c[6973]=0;return}if((c[6976]|0)==(i|0)){i=(c[6973]|0)+b|0;c[6973]=i;c[6976]=h;c[h+4>>2]=i|1;c[h+i>>2]=i;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){a=c[i+8>>2]|0;b=c[i+12>>2]|0;if((b|0)==(a|0)){c[6971]=c[6971]&~(1<<d);break}else{c[a+12>>2]=b;c[b+8>>2]=a;break}}else{g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+16|0;d=a+4|0;b=c[d>>2]|0;if(!b){b=c[a>>2]|0;if(!b){d=0;break}}else a=d;while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);if(g|0){b=c[i+28>>2]|0;a=28188+(b<<2)|0;if((c[a>>2]|0)==(i|0)){c[a>>2]=d;if(!d){c[6972]=c[6972]&~(1<<b);break}}else{e=g+16|0;c[((c[e>>2]|0)==(i|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;b=i+16|0;a=c[b>>2]|0;if(a|0){c[d+16>>2]=a;c[a+24>>2]=d}b=c[b+4>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}}while(0);c[h+4>>2]=f|1;c[h+f>>2]=f;if((h|0)==(c[6976]|0)){c[6973]=f;return}}else{c[a>>2]=e&-2;c[h+4>>2]=b|1;c[h+b>>2]=b;f=b}b=f>>>3;if(f>>>0<256){d=27924+(b<<1<<2)|0;a=c[6971]|0;b=1<<b;if(!(a&b)){c[6971]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=h;c[b+12>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{g=(b+1048320|0)>>>16&8;i=b<<g;d=(i+520192|0)>>>16&4;i=i<<d;e=(i+245760|0)>>>16&2;e=14-(d|g|e)+(i<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=28188+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[h+16>>2]=0;a=c[6972]|0;d=1<<e;if(!(a&d)){c[6972]=a|d;c[b>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}b=c[b>>2]|0;a:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break a}else{e=e<<1;b=a}}c[d>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}while(0);g=b+8|0;i=c[g>>2]|0;c[i+12>>2]=h;c[g>>2]=h;c[h+8>>2]=i;c[h+12>>2]=b;c[h+24>>2]=0;return}function Fg(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Kg(c[a+60>>2]|0)|0;a=Ig(pa(6,d|0)|0)|0;l=b;return a|0}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+32|0;g=n+16|0;f=n;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Ig(na(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=b+(o<<31>>31)|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Ig(na(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Hg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Ig(ma(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Ig(a){a=a|0;if(a>>>0>4294963200){c[(Jg()|0)>>2]=0-a;a=-1}return a|0}function Jg(){return 28444}function Kg(a){a=a|0;return a|0}function Lg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=1;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,oa(54,f|0)|0):0)a[b+75>>0]=-1;f=Gg(b,d,e)|0;l=g;return f|0}function Mg(a){a=a|0;return (a+-48|0)>>>0<10|0}function Ng(){return 13300}function Og(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function Pg(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=5;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=5;break}}}while(0);if((e|0)==5){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function Qg(a,b){a=a|0;b=b|0;Sg(a,b)|0;return a|0}function Rg(a,b){a=a|0;b=b|0;Qg(a+(Pg(a)|0)|0,b)|0;return a|0}function Sg(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=10}else f=10;while(0);if((f|0)==10){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function Tg(b,c){b=b|0;c=c|0;b=Vg(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function Ug(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else i=16;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)==g<<24>>24)if(!e){i=16;break}else break;f=N(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break c;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break}}else i=11;while(0);if((i|0)==11)if(!e){i=16;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;e=e+-1|0;if(!e){i=16;break}else b=b+1|0}}while(0);if((i|0)==16)b=0;return b|0}function Vg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(Pg(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=N(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function Wg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f;c[g>>2]=e;e=Xg(a,b,d,g)|0;l=f;return e|0}function Xg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=13544;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(Jg()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=Yg(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function Yg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+208|0;p=s+160|0;q=s+80|0;r=s;f=p;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((Zg(0,d,n,q,p)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)o=_g(b)|0;else o=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=Zg(b,d,n,q,p)|0;if(h){Xa[c[b+36>>2]&31](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=Zg(b,d,n,q,p)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(o|0)$g(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function Zg(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+64|0;D=I+56|0;E=I+40|0;A=I;G=I+48|0;H=I+60|0;c[D>>2]=e;w=(d|0)!=0;x=A+40|0;z=x;A=A+39|0;B=G+4|0;j=0;e=0;m=0;a:while(1){do{do if((e|0)>-1)if((j|0)>(2147483647-e|0)){c[(Jg()|0)>>2]=75;e=-1;break}else{e=j+e|0;break}while(0);s=c[D>>2]|0;j=a[s>>0]|0;if(!(j<<24>>24)){v=94;break a}k=s;b:while(1){switch(j<<24>>24){case 37:{v=10;break b}case 0:{j=k;break b}default:{}}u=k+1|0;c[D>>2]=u;j=a[u>>0]|0;k=u}c:do if((v|0)==10){v=0;j=k;do{if((a[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;c[D>>2]=k}while((a[k>>0]|0)==37)}while(0);j=j-s|0;if(w)ah(d,s,j)}while((j|0)!=0);u=(Mg(a[(c[D>>2]|0)+1>>0]|0)|0)==0;k=c[D>>2]|0;if(!u?(a[k+2>>0]|0)==36:0){q=(a[k+1>>0]|0)+-48|0;o=1;j=3}else{q=-1;o=m;j=1}j=k+j|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>31|(1<<m&75913|0)==0)n=0;else{n=0;do{n=1<<m|n;j=j+1|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0}while(!(m>>>0>31|(1<<m&75913|0)==0))}if(k<<24>>24==42){if((Mg(a[j+1>>0]|0)|0)!=0?(F=c[D>>2]|0,(a[F+2>>0]|0)==36):0){j=F+1|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;m=1;k=F+3|0}else{if(o|0){e=-1;break}if(w){u=(c[f>>2]|0)+(4-1)&~(4-1);j=c[u>>2]|0;c[f>>2]=u+4}else j=0;m=0;k=(c[D>>2]|0)+1|0}c[D>>2]=k;u=(j|0)<0;t=u?0-j|0:j;n=u?n|8192:n;u=m}else{j=bh(D)|0;if((j|0)<0){e=-1;break}t=j;u=o;k=c[D>>2]|0}do if((a[k>>0]|0)==46){j=k+1|0;if((a[j>>0]|0)!=42){c[D>>2]=j;j=bh(D)|0;k=c[D>>2]|0;break}if(Mg(a[k+2>>0]|0)|0?(C=c[D>>2]|0,(a[C+3>>0]|0)==36):0){j=C+2|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;k=C+4|0;c[D>>2]=k;break}if(u|0){e=-1;break a}if(w){r=(c[f>>2]|0)+(4-1)&~(4-1);j=c[r>>2]|0;c[f>>2]=r+4}else j=0;k=(c[D>>2]|0)+2|0;c[D>>2]=k}else j=-1;while(0);r=0;while(1){if(((a[k>>0]|0)+-65|0)>>>0>57){e=-1;break a}m=k;k=k+1|0;c[D>>2]=k;m=a[(a[m>>0]|0)+-65+(10304+(r*58|0))>>0]|0;o=m&255;if((o+-1|0)>>>0>=8)break;else r=o}if(!(m<<24>>24)){e=-1;break}p=(q|0)>-1;do if(m<<24>>24==19)if(p){e=-1;break a}else v=54;else{if(p){c[i+(q<<2)>>2]=o;p=g+(q<<3)|0;q=c[p+4>>2]|0;v=E;c[v>>2]=c[p>>2];c[v+4>>2]=q;v=54;break}if(!w){e=0;break a}ch(E,o,f);k=c[D>>2]|0;v=55}while(0);if((v|0)==54){v=0;if(w)v=55;else j=0}d:do if((v|0)==55){v=0;k=a[k+-1>>0]|0;k=(r|0)!=0&(k&15|0)==3?k&-33:k;m=n&-65537;q=(n&8192|0)==0?n:m;e:do switch(k|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[E>>2]>>2]=e;j=0;break d}case 1:{c[c[E>>2]>>2]=e;j=0;break d}case 2:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}case 3:{b[c[E>>2]>>1]=e;j=0;break d}case 4:{a[c[E>>2]>>0]=e;j=0;break d}case 6:{c[c[E>>2]>>2]=e;j=0;break d}case 7:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}default:{j=0;break d}}case 112:{k=120;j=j>>>0>8?j:8;m=q|8;v=67;break}case 88:case 120:{m=q;v=67;break}case 111:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;p=eh(k,m,x)|0;v=z-p|0;n=0;o=19018;j=(q&8|0)==0|(j|0)>(v|0)?j:v+1|0;v=73;break}case 105:case 100:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;if((m|0)<0){k=fi(0,0,k|0,m|0)|0;m=y;n=E;c[n>>2]=k;c[n+4>>2]=m;n=1;o=19018;v=72;break e}else{n=(q&2049|0)!=0&1;o=(q&2048|0)==0?((q&1|0)==0?19018:19020):19019;v=72;break e}}case 117:{m=E;n=0;o=19018;k=c[m>>2]|0;m=c[m+4>>2]|0;v=72;break}case 99:{a[A>>0]=c[E>>2];r=A;n=0;o=19018;p=1;j=z;break}case 109:{k=gh(c[(Jg()|0)>>2]|0)|0;v=77;break}case 115:{k=c[E>>2]|0;k=(k|0)==0?19028:k;v=77;break}case 67:{c[G>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=G;o=-1;v=81;break}case 83:{if(!j){hh(d,32,t,0,q);j=0;v=91}else{o=j;v=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=jh(d,+h[E>>3],t,j,q,k)|0;break d}default:{r=s;n=0;o=19018;p=j;m=q;j=z}}while(0);f:do if((v|0)==67){s=E;r=c[s>>2]|0;s=c[s+4>>2]|0;p=dh(r,s,x,k&32)|0;o=(m&8|0)==0|(r|0)==0&(s|0)==0;n=o?0:2;o=o?19018:19018+(k>>>4)|0;q=m;k=r;m=s;v=73}else if((v|0)==72){p=fh(k,m,x)|0;v=73}else if((v|0)==77){v=0;s=Ug(k,0,j)|0;q=(s|0)==0;r=k;n=0;o=19018;p=q?j:s-k|0;j=q?k+j|0:s}else if((v|0)==81){v=0;n=c[E>>2]|0;j=0;while(1){k=c[n>>2]|0;if(!k)break;k=ih(H,k)|0;m=(k|0)<0;if(m|k>>>0>(o-j|0)>>>0){v=85;break}j=k+j|0;if(o>>>0>j>>>0)n=n+4|0;else break}if((v|0)==85){v=0;if(m){e=-1;break a}}hh(d,32,t,j,q);if(!j){j=0;v=91}else{m=c[E>>2]|0;n=0;while(1){k=c[m>>2]|0;if(!k){v=91;break f}k=ih(H,k)|0;n=k+n|0;if((n|0)>(j|0)){v=91;break f}ah(d,H,k);if(n>>>0>=j>>>0){v=91;break}else m=m+4|0}}}while(0);if((v|0)==73){v=0;m=(k|0)!=0|(m|0)!=0;s=(j|0)!=0|m;m=z-p+((m^1)&1)|0;r=s?p:x;p=s?((j|0)>(m|0)?j:m):0;m=(j|0)>-1?q&-65537:q;j=z}else if((v|0)==91){v=0;hh(d,32,t,j,q^8192);j=(t|0)>(j|0)?t:j;break}q=j-r|0;p=(p|0)<(q|0)?q:p;s=p+n|0;j=(t|0)<(s|0)?s:t;hh(d,32,j,s,m);ah(d,o,n);hh(d,48,j,s,m^65536);hh(d,48,p,q,0);ah(d,r,q);hh(d,32,j,s,m^8192)}while(0);m=u}g:do if((v|0)==94)if(!d)if(!m)e=0;else{e=1;while(1){j=c[i+(e<<2)>>2]|0;if(!j)break;ch(g+(e<<3)|0,j,f);e=e+1|0;if(e>>>0>=10){e=1;break g}}while(1){if(c[i+(e<<2)>>2]|0){e=-1;break g}e=e+1|0;if(e>>>0>=10){e=1;break}}}while(0);l=I;return e|0}function _g(a){a=a|0;return 0}function $g(a){a=a|0;return}function ah(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))vh(b,d,a)|0;return}function bh(b){b=b|0;var d=0,e=0;if(!(Mg(a[c[b>>2]>>0]|0)|0))d=0;else{d=0;do{e=c[b>>2]|0;d=(d*10|0)+-48+(a[e>>0]|0)|0;e=e+1|0;c[b>>2]=e}while((Mg(a[e>>0]|0)|0)!=0)}return d|0}function ch(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function dh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[10768+(b&15)>>0]|0|f;b=ni(b|0,c|0,4)|0;c=y}while(!((b|0)==0&(c|0)==0));return e|0}function eh(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=ni(b|0,c|0,3)|0;c=y}while(!((b|0)==0&(c|0)==0));return d|0}function fh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){do{e=b;b=li(b|0,c|0,10,0)|0;f=c;c=y;g=ki(b|0,c|0,10,0)|0;g=fi(e|0,f|0,g|0,y|0)|0;d=d+-1|0;a[d>>0]=g&255|48}while(f>>>0>9|(f|0)==9&e>>>0>4294967295);c=b}else c=b;if(c)do{g=c;c=(c>>>0)/10|0;d=d+-1|0;a[d>>0]=g-(c*10|0)|48}while(g>>>0>=10);return d|0}function gh(a){a=a|0;return qh(a,c[(ph()|0)+188>>2]|0)|0}function hh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;si(f|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{ah(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}ah(a,f,e)}l=g;return}function ih(a,b){a=a|0;b=b|0;if(!a)a=0;else a=nh(a,b,0)|0;return a|0}function jh(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+32|0;v=H+536|0;G=H;F=G;n=H+540|0;c[v>>2]=0;E=n+12|0;kh(e)|0;j=y;if((j|0)<0){e=-e;kh(e)|0;D=1;C=19035;j=y}else{D=(h&2049|0)!=0&1;C=(h&2048|0)==0?((h&1|0)==0?19036:19041):19038}do if(0==0&(j&2146435072|0)==2146435072){G=(i&32|0)!=0;j=D+3|0;hh(b,32,f,j,h&-65537);ah(b,C,D);ah(b,e!=e|0.0!=0.0?(G?19062:19066):G?19054:19058,3);hh(b,32,f,j,h^8192)}else{r=+lh(e,v)*2.0;j=r!=0.0;if(j)c[v>>2]=(c[v>>2]|0)+-1;u=i|32;if((u|0)==97){p=i&32;s=(p|0)==0?C:C+9|0;q=D|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[s>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[v>>2]|0;j=(k|0)<0?0-k|0:k;j=fh(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;k=(g|0)<1;m=(h&8|0)==0;n=G;do{D=~~e;j=n+1|0;a[n>>0]=p|d[10768+D>>0];e=(e-+(D|0))*16.0;if((j-F|0)==1?!(m&(k&e==0.0)):0){a[j>>0]=46;n=n+2|0}else n=j}while(e!=0.0);if((g|0)!=0?(-2-F+n|0)<(g|0):0){k=E;m=o;j=g+2+k-m|0}else{k=E;m=o;j=k-F-m+n|0}E=j+q|0;hh(b,32,f,E,h);ah(b,s,q);hh(b,48,f,E,h^65536);F=n-F|0;ah(b,G,F);G=k-m|0;hh(b,48,j-(F+G)|0,0,0);ah(b,o,G);hh(b,32,f,E,h^8192);j=E;break}k=(g|0)<0?6:g;if(j){j=(c[v>>2]|0)+-28|0;c[v>>2]=j;e=r*268435456.0}else{e=r;j=c[v>>2]|0}B=(j|0)<0?m:m+288|0;m=B;do{z=~~e>>>0;c[m>>2]=z;m=m+4|0;e=(e-+(z>>>0))*1.0e9}while(e!=0.0);z=B;if((j|0)>0){p=B;while(1){o=(j|0)<29?j:29;j=m+-4|0;if(j>>>0>=p>>>0){n=0;do{t=oi(c[j>>2]|0,0,o|0)|0;t=ei(t|0,y|0,n|0,0)|0;w=y;n=li(t|0,w|0,1e9,0)|0;x=ki(n|0,y|0,1e9,0)|0;x=fi(t|0,w|0,x|0,y|0)|0;c[j>>2]=x;j=j+-4|0}while(j>>>0>=p>>>0);if(n){x=p+-4|0;c[x>>2]=n;n=x}else n=p}else n=p;a:do if(m>>>0>n>>>0){j=m;while(1){m=j+-4|0;if(c[m>>2]|0){m=j;break a}if(m>>>0>n>>>0)j=m;else break}}while(0);j=(c[v>>2]|0)-o|0;c[v>>2]=j;if((j|0)>0)p=n;else break}}else n=B;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(u|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0<m>>>0){o=(1<<s)+-1|0;p=1e9>>>s;q=0;j=n;do{x=c[j>>2]|0;c[j>>2]=(x>>>s)+q;q=N(x&o,p)|0;j=j+4|0}while(j>>>0<m>>>0);n=(c[n>>2]|0)==0?n+4|0:n;if(q){c[m>>2]=q;m=m+4|0}}else n=(c[n>>2]|0)==0?n+4|0:n;j=t?B:n;m=(m-j>>2|0)>(g|0)?j+(g<<2)|0:m;j=(c[v>>2]|0)+s|0;c[v>>2]=j}while((j|0)<0);t=n}else t=n;if(t>>>0<m>>>0){j=(z-t>>2)*9|0;o=c[t>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;j=j+1|0}while(o>>>0>=n>>>0)}}else j=0;w=(u|0)==103;x=(k|0)!=0;n=k-((u|0)==102?0:j)+((x&w)<<31>>31)|0;if((n|0)<(((m-z>>2)*9|0)+-9|0)){v=n+9216|0;n=(v|0)/9|0;g=B+4+(n+-1024<<2)|0;n=v-(n*9|0)|0;if((n|0)<8){o=10;while(1){o=o*10|0;if((n|0)<7)n=n+1|0;else break}}else o=10;q=c[g>>2]|0;n=(q>>>0)/(o>>>0)|0;s=q-(N(n,o)|0)|0;p=(g+4|0)==(m|0);if(!(p&(s|0)==0)){r=(n&1|0)==0?9007199254740992.0:9007199254740994.0;v=o>>>1;e=s>>>0<v>>>0?.5:p&(s|0)==(v|0)?1.0:1.5;if(D){v=(a[C>>0]|0)==45;e=v?-e:e;r=v?-r:r}n=q-s|0;c[g>>2]=n;if(r+e!=r){v=n+o|0;c[g>>2]=v;if(v>>>0>999999999){o=g;j=t;while(1){n=o+-4|0;c[o>>2]=0;if(n>>>0<j>>>0){j=j+-4|0;c[j>>2]=0}v=(c[n>>2]|0)+1|0;c[n>>2]=v;if(v>>>0>999999999)o=n;else{o=j;break}}}else{n=g;o=t}j=(z-o>>2)*9|0;q=c[o>>2]|0;if(q>>>0>=10){p=10;do{p=p*10|0;j=j+1|0}while(q>>>0>=p>>>0)}}else{n=g;o=t}}else{n=g;o=t}v=n+4|0;m=m>>>0>v>>>0?v:m}else o=t;g=0-j|0;b:do if(m>>>0>o>>>0)while(1){n=m+-4|0;if(c[n>>2]|0){v=m;u=1;break b}if(n>>>0>o>>>0)m=n;else{v=n;u=0;break}}else{v=m;u=0}while(0);do if(w){k=k+((x^1)&1)|0;if((k|0)>(j|0)&(j|0)>-5){p=i+-1|0;k=k+-1-j|0}else{p=i+-2|0;k=k+-1|0}if(!(h&8)){if(u?(A=c[v+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){n=0;m=10;do{m=m*10|0;n=n+1|0}while(!((A>>>0)%(m>>>0)|0|0))}else n=0;else n=9;m=((v-z>>2)*9|0)+-9|0;if((p|32|0)==102){i=m-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}else{i=m+j-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}}}else p=i;while(0);t=(k|0)!=0;q=t?1:h>>>3&1;s=(p|32|0)==102;if(s){w=0;j=(j|0)>0?j:0}else{m=(j|0)<0?g:j;m=fh(m,((m|0)<0)<<31>>31,E)|0;n=E;if((n-m|0)<2)do{m=m+-1|0;a[m>>0]=48}while((n-m|0)<2);a[m+-1>>0]=(j>>31&2)+43;j=m+-2|0;a[j>>0]=p;w=j;j=n-j|0}j=D+1+k+q+j|0;hh(b,32,f,j,h);ah(b,C,D);hh(b,48,f,j,h^65536);if(s){q=o>>>0>B>>>0?B:o;s=G+9|0;o=s;p=G+8|0;n=q;do{m=fh(c[n>>2]|0,0,s)|0;if((n|0)==(q|0)){if((m|0)==(s|0)){a[p>>0]=48;m=p}}else if(m>>>0>G>>>0){si(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}ah(b,m,o-m|0);n=n+4|0}while(n>>>0<=B>>>0);if(!((h&8|0)==0&(t^1)))ah(b,19070,1);if(n>>>0<v>>>0&(k|0)>0)while(1){m=fh(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){si(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}ah(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0<v>>>0&(k|0)>9)){k=m;break}else k=m}hh(b,48,k+9|0,9,0)}else{v=u?v:o+4|0;if(o>>>0<v>>>0&(k|0)>-1){g=G+9|0;t=(h&8|0)==0;u=g;q=0-F|0;s=G+8|0;p=o;do{m=fh(c[p>>2]|0,0,g)|0;if((m|0)==(g|0)){a[s>>0]=48;m=s}do if((p|0)==(o|0)){n=m+1|0;ah(b,m,1);if(t&(k|0)<1){m=n;break}ah(b,19070,1);m=n}else{if(m>>>0<=G>>>0)break;si(G|0,48,m+q|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=u-m|0;ah(b,m,(k|0)>(F|0)?F:k);k=k-F|0;p=p+4|0}while(p>>>0<v>>>0&(k|0)>-1)}hh(b,48,k+18|0,18,0);ah(b,w,E-w|0)}hh(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function kh(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;y=c[j+4>>2]|0;return b|0}function lh(a,b){a=+a;b=b|0;return +(+mh(a,b))}function mh(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=ni(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+mh(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function nh(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(oh()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(Jg()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(Jg()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function oh(){return Ng()|0}function ph(){return Ng()|0}function qh(b,e){b=b|0;e=e|0;var f=0,g=0;f=0;while(1){if((d[10784+f>>0]|0)==(b|0)){g=4;break}f=f+1|0;if((f|0)==87){b=87;g=5;break}}if((g|0)==4)if(!f)f=10880;else{b=f;g=5}if((g|0)==5){f=10880;do{do{g=f;f=f+1|0}while((a[g>>0]|0)!=0);b=b+-1|0}while((b|0)!=0)}return rh(f,c[e+20>>2]|0)|0}function rh(a,b){a=a|0;b=b|0;return sh(a,b)|0}function sh(a,b){a=a|0;b=b|0;if(!b)b=0;else b=th(c[b>>2]|0,c[b+4>>2]|0,a)|0;return ((b|0)==0?a:b)|0}function th(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=uh(c[b+8>>2]|0,o)|0;f=uh(c[b+12>>2]|0,o)|0;g=uh(c[b+16>>2]|0,o)|0;a:do if((h>>>0<d>>>2>>>0?(n=d-(h<<2)|0,f>>>0<n>>>0&g>>>0<n>>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=uh(c[b+(g<<2)>>2]|0,o)|0;g=uh(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<d>>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=Og(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}l=f?l:k;h=f?j:h-j|0}f=i+m|0;g=uh(c[b+(f<<2)>>2]|0,o)|0;f=uh(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0<d>>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function uh(a,b){a=a|0;b=b|0;var c=0;c=pi(a|0)|0;return ((b|0)==0?a:c)|0}function vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(wh(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0<d>>>0){f=Xa[c[e+36>>2]&31](e,b,d)|0;break}b:do if((a[e+75>>0]|0)<0|(d|0)==0){h=0;g=b}else{i=d;while(1){g=i+-1|0;if((a[b+g>>0]|0)==10)break;if(!g){h=0;g=b;break b}else i=g}f=Xa[c[e+36>>2]&31](e,b,i)|0;if(f>>>0<i>>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}while(0);ri(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0} +function Pd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;K=l;l=l+2080|0;D=K+2056|0;E=K+1024|0;F=K;J=K+2076|0;G=K+2072|0;H=K+2068|0;o=K+2064|0;p=K+2048|0;c[J>>2]=c[d>>2];q=b+128|0;r=b+88|0;s=b+92|0;t=b+96|0;u=D+4|0;v=b+140|0;w=b+136|0;x=b+112|0;z=e+16|0;A=e+24|0;B=e+56|0;C=e+64|0;a:while(1){g=c[J>>2]|0;b:do switch(a[g>>0]|0){case 0:{h=44;break a}case 46:{h=5;break a}case 35:{he(J);break}default:{if((je(G,J,8)|0)<0){h=7;break a}m=c[G>>2]|0;n=m>>>12;c[G>>2]=m&4095;if((le(H,J)|0)<0){h=9;break a}if((le(o,J)|0)<0){h=11;break a}h=c[G>>2]|0;k=c[H>>2]|0;m=c[o>>2]|0;i=lf(104)|0;g=i+16|0;c[g>>2]=1;c[i+20>>2]=0;M=q;j=c[M+4>>2]|0;L=i+8|0;c[L>>2]=c[M>>2];c[L+4>>2]=j;L=q;j=q;c[j>>2]=ei(c[L>>2]|0,c[L+4>>2]|0,1,0)|0;c[j+4>>2]=y;j=i+24|0;c[j>>2]=n;c[i+28>>2]=h&4095;c[i+32>>2]=k;c[i+36>>2]=m;switch(n&1048575|0){case 8:{Ga(i+64|0);break}case 4:{M=i+56|0;c[M>>2]=M;c[i+60>>2]=M;break}default:{}}k=c[s>>2]|0;c[s>>2]=i;c[i>>2]=r;c[i+4>>2]=k;c[k>>2]=i;k=t;L=t;c[L>>2]=ei(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[L+4>>2]=y;Oa(D|0,0)|0;L=c[D>>2]|0;k=i+40|0;c[k>>2]=L;M=(c[u>>2]|0)*1e3|0;m=i+48|0;c[m>>2]=M;c[i+44>>2]=L;c[i+52>>2]=M;M=p;c[M>>2]=0;c[M+4>>2]=0;switch(n&1048575|0){case 6:case 2:{if((le(i+56|0,J)|0)<0){h=17;break a}if((le(i+60|0,J)|0)<0){h=19;break a}break}case 8:{if((ke(p,J)|0)<0){h=21;break a}break}case 4:{c[g>>2]=(c[g>>2]|0)+1;if((c[j>>2]|0)!=4){h=23;break a}M=lf(18)|0;c[M+8>>2]=i;g=M+13|0;a[g>>0]=46;a[g+1>>0]=0;g=i+56|0;h=i+64|0;R=c[h>>2]|0;L=R+18|0;S=ei(c[v>>2]|0,0,-1,-1)|0;N=y;P=ei(S|0,N|0,L|0,((L|0)<0)<<31>>31|0)|0;Q=c[w>>2]|0;P=ni(P|0,y|0,Q|0)|0;O=y;Q=ni(ei(S|0,N|0,R|0,((R|0)<0)<<31>>31|0)|0,y|0,Q|0)|0;R=x;N=x;c[N>>2]=ei(fi(c[R>>2]|0,c[R+4>>2]|0,Q|0,y|0)|0,y|0,P|0,O|0)|0;c[N+4>>2]=y;c[h>>2]=L;L=c[g>>2]|0;c[L+4>>2]=M;c[M>>2]=L;c[M+4>>2]=g;c[g>>2]=M;c[z>>2]=(c[z>>2]|0)+1;if((c[j>>2]|0)!=4){h=25;break a}S=lf(19)|0;c[S+8>>2]=e;M=S+13|0;a[M>>0]=a[14342]|0;a[M+1>>0]=a[14343]|0;a[M+2>>0]=a[14344]|0;M=c[h>>2]|0;R=M+19|0;L=ei(c[v>>2]|0,0,-1,-1)|0;Q=y;O=ei(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=ni(O|0,y|0,N|0)|0;P=y;N=ni(ei(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=ei(fi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[h>>2]=R;R=c[g>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=g;c[g>>2]=S;break}default:{}}if((me(k,m,J)|0)<0){h=28;break a}if((ie(E,1024,J)|0)<0){h=30;break a}if((c[A>>2]|0)!=4){h=32;break a}M=Pg(E)|0;R=M+17|0;S=lf(R)|0;c[S+8>>2]=i;ri(S+13|0,E|0,M+1|0)|0;M=c[C>>2]|0;R=M+R|0;L=ei(c[v>>2]|0,0,-1,-1)|0;Q=y;O=ei(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=ni(O|0,y|0,N|0)|0;P=y;N=ni(ei(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=ei(fi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[C>>2]=R;R=c[B>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=B;c[B>>2]=S;do if((n|0)!=10){S=p;if(!((n|0)==8&((c[S>>2]|0)!=0|(c[S+4>>2]|0)!=0))){he(J);if((n|0)!=4)break b;S=fe(f,E)|0;g=Pd(b,J,i,S)|0;Bg(S);if(!g)break b;else{h=46;break a}}else{if((ne(D,J)|0)<0){h=40;break a}R=D;S=p;Fd(b,i,15635,c[R>>2]|0,c[R+4>>2]|0,c[S>>2]|0,c[S+4>>2]|0)|0;break}}else{if((ie(F,1024,J)|0)<0){h=35;break a}c[i+56>>2]=Ah(F)|0}while(0);he(J)}}while(0)}switch(h|0){case 5:{c[J>>2]=g+1;he(J);I=c[J>>2]|0;break}case 7:{Uh(15963,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 9:{Uh(15977,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 11:{Uh(15990,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 17:{Uh(16003,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 19:{Uh(16018,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 21:{Uh(15932,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 23:{ja(14301,14319,456,14328);break}case 25:{ja(14301,14319,456,14328);break}case 28:{Uh(16033,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 30:{Uh(15857,17,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 32:{ja(14301,14319,456,14328);break}case 35:{Uh(16048,21,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 40:{Uh(15946,16,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 44:{I=g;break}case 46:{l=K;return g|0}}c[d>>2]=I;S=0;l=K;return S|0}function Qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;f=h;g=e+20|0;b=c[g>>2]|0;if(b|0){db[c[a+4>>2]&15](a,b);c[g>>2]=0}b=e+24|0;d=c[b>>2]|0;if((d|0)<=1){i=c[e+16>>2]|0;c[b>>2]=d+1;b=bd(a,i,c[12960+(d<<2)>>2]|0)|0;c[g>>2]=b;if(b|0?(_a[c[a+24>>2]&15](a,f,b,0,6,e)|0)>=1:0){l=h;return}Qd(a,0,0,e);l=h;return}if((Rd(a,15826,1)|0)<0)Rd(a,15848,0)|0;db[c[a+4>>2]&15](a,c[e+16>>2]|0);b=c[e+8>>2]|0;if(b|0)cb[b&15](c[e+12>>2]|0);Bg(e);l=h;return}function Rd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=l;l=l+1072|0;h=t+1056|0;o=t+1048|0;n=t+1040|0;q=t+1060|0;r=t;k=t+1032|0;m=t+1024|0;d=Ed(b,d)|0;if(!d){s=-1;l=t;return s|0}if((c[d+24>>2]|0)!=8){s=-1;l=t;return s|0}if((c[d+56>>2]|0)!=3){s=-1;l=t;return s|0}j=c[d+60>>2]|0;p=Ag(j+1|0)|0;Ha(d+64|0,0,p|0,j|0);a[p+j>>0]=0;if(!e){c[q>>2]=p;f=c[3261]|0;g=b+176|0;d=p;a:while(1)b:do switch(a[d>>0]|0){case 0:break a;case 9:case 32:{d=d+1|0;c[q>>2]=d;break}case 10:{d=d+1|0;c[q>>2]=d;break}default:{if((ie(r,1024,q)|0)<0){s=49;break a}d=Ed(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0){o=lf(24)|0;m=d+80|0;n=c[m+4>>2]|0;e=o+8|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;e=o+16|0;c[e>>2]=e;c[o+20>>2]=e;n=c[g>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=g;c[g>>2]=o;while(1){d=c[q>>2]|0;c:while(1){switch(a[d>>0]|0){case 10:case 0:break b;case 9:case 32:break;default:break c}o=d+1|0;c[q>>2]=o;d=o}if((ie(r,1024,q)|0)<0){s=61;break a}o=lf(16)|0;c[o+12>>2]=Ah(r)|0;n=c[e>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=e;c[e>>2]=o}}c[h>>2]=r;Wh(f,15875,h)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:break b;default:{}}o=d+1|0;c[q>>2]=o;d=o}}}while(0);if((s|0)==49)Uh(15857,17,1,f)|0;else if((s|0)==61)Uh(15857,17,1,f)|0}else{c[q>>2]=p;h=c[3261]|0;i=b+176|0;j=b+184|0;e=0;g=0;d=p;d:while(1){f=e;e:while(1){f:while(1){e=a[d>>0]|0;g:while(1)switch(e<<24>>24){case 0:break d;case 64:{s=12;break e}case 10:break f;case 35:break;case 9:case 32:break g;default:{e=0;break e}}e=d+1|0;c[q>>2]=e;d=e}d=d+1|0;c[q>>2]=d;f=0}if((s|0)==12){c[q>>2]=d+1;e=1}if((ie(r,1024,q)|0)<0){s=14;break}d=c[q>>2]|0;h:while(1){switch(a[d>>0]|0){case 58:{s=18;break h}case 9:case 32:break;default:{s=27;break h}}s=d+1|0;c[q>>2]=s;d=s}i:do if((s|0)==18){s=0;c[q>>2]=d+1;d=Ed(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0)if(!e){f=lf(24)|0;d=d+80|0;e=c[d+4>>2]|0;g=f+8|0;c[g>>2]=c[d>>2];c[g+4>>2]=e;g=f+16|0;c[g>>2]=g;c[f+20>>2]=g;g=c[i>>2]|0;c[g+4>>2]=f;c[f>>2]=g;c[f+4>>2]=i;c[i>>2]=f;g=0;break}else{g=lf(20)|0;c[g+8>>2]=Ah(r)|0;f=g+12|0;c[f>>2]=f;c[g+16>>2]=f;f=c[j>>2]|0;c[f+4>>2]=g;c[g>>2]=f;c[g+4>>2]=j;c[j>>2]=g;f=0;break}c[n>>2]=r;Wh(h,15875,n)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:{f=0;g=0;break i}default:{}}g=d+1|0;c[q>>2]=g;d=g}}else if((s|0)==27){s=0;d=(g|0)!=0;if(!(d|(f|0)!=0)){s=28;break d}if(!d){d=lf(16)|0;c[d+12>>2]=Ah(r)|0;c[d+8>>2]=e;g=f+16|0;e=c[g>>2]|0;c[e+4>>2]=d;c[d>>2]=e;c[d+4>>2]=g;c[g>>2]=d;g=0;break}if((ke(m,q)|0)<0){s=31;break d}if((ne(k,q)|0)<0){s=33;break d}d=lf(32)|0;c[d+24>>2]=Ah(r)|0;e=k;u=c[e+4>>2]|0;v=d+8|0;c[v>>2]=c[e>>2];c[v+4>>2]=u;v=m;u=c[v+4>>2]|0;e=d+16|0;c[e>>2]=c[v>>2];c[e+4>>2]=u;e=g+12|0;u=c[e>>2]|0;c[u+4>>2]=d;c[d>>2]=u;c[d+4>>2]=e;c[e>>2]=d}while(0);d=c[q>>2]|0;v=a[d>>0]|0;e=v<<24>>24==10;if(e^v<<24>>24!=0)do{d=d+1|0;c[q>>2]=d;v=a[d>>0]|0;e=v<<24>>24==10}while(e^v<<24>>24!=0);if(e){d=d+1|0;c[q>>2]=d}e=f}if((s|0)==14)Uh(15857,17,1,h)|0;else if((s|0)==28){c[o>>2]=r;Wh(h,15903,o)|0}else if((s|0)==31)Uh(15932,13,1,h)|0;else if((s|0)==33)Uh(15946,16,1,h)|0}Bg(p);v=0;l=t;return v|0}function Sd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=l;l=l+32|0;d=f+16|0;e=f;if((c[a>>2]|0)!=9)ja(16078,14319,2865,16092);if(_a[c[a+12>>2]&15](a,d,e,0,28468,28468)|0)ja(15194,14319,2867,16092);if(!($a[c[a+28>>2]&3](a,e,c[d>>2]|0,16107,514,384,0)|0)){h=c[a+52>>2]|0;g=c[d>>2]|0;e=Pg(b)|0;_a[h&15](a,g,0,0,b,e)|0;db[c[a+4>>2]&15](a,c[d>>2]|0);l=f;return}else ja(16118,14319,2869,16092)}function Td(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;f=i+16|0;g=i;h=c[6969]|0;if(!h){Bg(b);l=i;return}if(_a[c[h+12>>2]&15](h,f,g,1e3,28468,28468)|0)ja(16199,14319,2892,16248);e=bd(h,c[f>>2]|0,c[h+200>>2]|0)|0;if(e|0){wd(h,c[f>>2]|0,a)|0;if(($a[c[h+28>>2]&3](h,g,e,a,514,384,0)|0)>=0)_a[c[h+52>>2]&15](h,e,0,0,b,d)|0;db[c[h+4>>2]&15](h,e)}a=c[f>>2]|0;if(a|0)db[c[h+4>>2]&15](h,a);Bg(b);l=i;return}function Ud(){return}function Vd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[6970]|0;c[6970]=f+-1;a=(f|0)>1;if((f|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,0,d,e);return}function Wd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[6970]|0;c[6970]=e+-1;a=(e|0)>1;if((e|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,(d|0)<1?-404:0-d|0,0,0);return}function Xd(a){a=a|0;c[a+4>>2]=0;c[a>>2]=0;return}function Yd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=lf(8)|0;c[g>>2]=e;c[g+4>>2]=f;f=c[6970]|0;c[6970]=f+1;if(!f)Na(1);wa(a|0,16268,b|0,d|0,0,0,g|0,1,7,8,0)|0;return g|0}function Zd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=lf(4132)|0;c[e>>2]=b;c[e+4>>2]=d;c[e+16>>2]=a;return e|0}function _d(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!e){q=0;return q|0}l=b+8|0;m=b+12|0;n=b+36|0;o=b+16|0;p=b+20|0;q=b+4|0;k=b+40|0;j=d;a:while(1){switch(c[l>>2]|0){case 0:{i=c[m>>2]|0;d=20-i|0;d=(e|0)<(d|0)?e:d;ri(b+36+i|0,j|0,d|0)|0;i=d+(c[m>>2]|0)|0;c[m>>2]=i;if((i|0)>19){if(Gh(n,16326,4)|0){d=-1;e=12;break a}f=p;g=k;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[l>>2]=1;c[m>>2]=0}break}case 1:{d=c[m>>2]|0;i=4096-d|0;i=(e|0)<(i|0)?e:i;ri(b+36+d|0,j|0,i|0)|0;d=i+(c[m>>2]|0)|0;c[m>>2]=d;if((d|0)>4095){d=d+-16|0;uf(n,n,d,c[o>>2]|0,p,0);d=Xa[c[b>>2]&31](c[q>>2]|0,n,d)|0;if((d|0)<0){e=12;break a}f=n;g=(c[m>>2]|0)+(b+36)+-16|0;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[m>>2]=16;d=i}else d=i;break}default:{e=10;break a}}e=e-d|0;if(!e){d=0;e=12;break}else j=j+d|0}if((e|0)==10)ra();else if((e|0)==12)return d|0;return 0}function $d(b){b=b|0;var d=0,e=0,f=0,g=0;if((c[b+8>>2]|0)!=1){g=-1;return g|0}d=b+12|0;e=c[d>>2]|0;if(!((e|0)!=0&(e&15|0)==0)){g=-1;return g|0}g=b+36|0;uf(g,g,e,c[b+16>>2]|0,b+20|0,0);d=a[(c[d>>2]|0)+-1+(b+36)>>0]|0;if((d+-1&255)>15){g=-1;return g|0}d=e-(d&255)|0;if(d|0?(f=Xa[c[b>>2]&31](c[b+4>>2]|0,g,d)|0,(f|0)<0):0){g=f;return g|0}g=0;return g|0}function ae(a){a=a|0;Bg(a);return}function be(a,b,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=lf(48)|0;c[m>>2]=a;c[m+4>>2]=b;b=m+8|0;c[b>>2]=0;c[b+4>>2]=0;c[m+16>>2]=j;c[m+20>>2]=k;b=m+24|0;c[b>>2]=g;k=m+32|0;g=k;c[g>>2]=0;c[g+4>>2]=0;if(l|0){g=lf(4132)|0;c[g>>2]=15;c[g+4>>2]=m;c[g+16>>2]=l;c[m+40>>2]=g}l=lf(8)|0;c[l>>2]=m;c[l+4>>2]=9;g=(h|0)!=0|(i|0)!=0;if(g){a=Ag(h)|0;j=c[m>>2]|0;b=c[b>>2]|0;if((b|0)!=0?(n=k,n=_a[c[j+48>>2]&15](j,b,c[n>>2]|0,c[n+4>>2]|0,a,h)|0,(n|0)>=0):0){b=k;n=ei(c[b>>2]|0,c[b+4>>2]|0,n|0,((n|0)<0)<<31>>31|0)|0;b=k;c[b>>2]=n;c[b+4>>2]=y;b=16263}else b=16263}else{a=0;b=16268}n=c[6970]|0;c[6970]=n+1;if(!n)Na(1);wa(d|0,b|0,e|0,f|0,a|0,h|0,l|0,1,7,8,0)|0;if(!g)return;Bg(a);return}function ce(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=c[a>>2]|0;e=a+8|0;f=e;a=_a[c[g+52>>2]&15](g,c[a+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,b,d)|0;if((a|0)<0)return a|0;f=e;f=ei(c[f>>2]|0,c[f+4>>2]|0,a|0,((a|0)<0)<<31>>31|0)|0;g=e;c[g>>2]=f;c[g+4>>2]=y;return a|0}function de(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[b>>2]|0;do if((d|0)<0){h=b+40|0;i=d;g=((d|0)<0)<<31>>31}else{h=b+40|0;g=c[h>>2]|0;do if(!g){i=b+8|0;g=i;g=_a[c[o+52>>2]&15](o,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0,e,f)|0;if((g|0)<0)n=13;else{m=i;m=ei(c[m>>2]|0,c[m+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;n=i;c[n>>2]=m;c[n+4>>2]=y;n=14}}else{g=_d(g,e,f)|0;if(!((d|0)==0&(g|0)>-1))if((g|0)<0){n=13;break}else{n=14;break}g=c[h>>2]|0;if((((c[g+8>>2]|0)==1?(i=g+12|0,j=c[i>>2]|0,(j|0)!=0&(j&15|0)==0):0)?(k=g+36|0,uf(k,k,j,c[g+16>>2]|0,g+20|0,0),l=a[(c[i>>2]|0)+-1+(g+36)>>0]|0,(l+-1&255)<=15):0)?(m=j-(l&255)|0,m|0):0)Xa[c[g>>2]&31](c[g+4>>2]|0,k,m)|0}while(0);if((n|0)==13){i=g;g=((g|0)<0)<<31>>31;break}if((n|0)==14?d|0:0)return;g=b+8|0;i=c[g>>2]|0;g=c[g+4>>2]|0}while(0);gb[c[b+16>>2]&7](o,c[b+4>>2]|0,i,g,c[b+20>>2]|0);g=c[h>>2]|0;if(g|0)Bg(g);Bg(b);return}function ee(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+288|0;x=A+48|0;y=A;z=A+80|0;if((f|0)>=33)ja(16272,16297,589,16307);if((h|0)<=0){l=A;return}o=y+f|0;p=y+(f+1)|0;q=y+(f+2)|0;r=y+(f+3)|0;s=f+4|0;t=(g|0)>0;u=(d|0)>64;v=z+112|0;w=z+176|0;n=1;while(1){c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;ri(y|0,e|0,f|0)|0;a[o>>0]=n>>>24;a[p>>0]=n>>>16;a[q>>0]=n>>>8;a[r>>0]=n;if(t){k=s;m=0;while(1){if(u){zf(b,d,v);j=32}else{ri(v|0,b|0,d|0)|0;j=d}si(z+112+j|0,0,64-j|0)|0;j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^54;j=j+1|0}while((j|0)!=64);vf(z);wf(z,v,64);wf(z,y,k);yf(w,z);j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^106;j=j+1|0}while((j|0)!=64);zf(v,96,y);j=0;do{B=x+j|0;a[B>>0]=a[B>>0]^a[y+j>>0];j=j+1|0}while((j|0)!=32);m=m+1|0;if((m|0)==(g|0))break;else k=32}}j=(h|0)<32?h:32;ri(i|0,x|0,j|0)|0;h=h-j|0;if((h|0)<=0)break;else{i=i+j|0;n=n+1|0}}l=A;return}function fe(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(!(a[b>>0]|0)){f=Ah(c)|0;return f|0}g=Pg(b)|0;e=Pg(c)|0;f=Ag(g+2+e|0)|0;ri(f|0,b|0,g|0)|0;d=f+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}ri(d|0,c|0,e+1|0)|0;g=f;return g|0}function ge(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(Tg(c,58)|0){f=Ah(c)|0;return f|0}if(!(a[b>>0]|0)){f=Ah(c)|0;return f|0}g=Pg(b)|0;f=Pg(c)|0;e=Ag(g+2+f|0)|0;ri(e|0,b|0,g|0)|0;d=e+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}ri(d|0,c|0,f+1|0)|0;g=e;return g|0}function he(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){g=a[d>>0]|0;e=g<<24>>24==10;f=d+1|0;if(e^g<<24>>24!=0)d=f;else break}c[b>>2]=e?f:d;return}function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[e>>2]|0;a:while(1){f=a[h>>0]|0;switch(f<<24>>24){case 34:{j=4;break a}case 0:{i=-1;j=26;break a}case 9:case 32:break;default:{j=21;break a}}h=h+1|0}b:do if((j|0)==4){k=b+d+-1|0;f=h+1|0;c:while(1){d=f+1|0;j=a[f>>0]|0;h=j<<24>>24;d:do switch(j<<24>>24){case 34:{g=b;l=d;break b}case 0:case 10:{i=-1;j=26;break c}case 92:{i=f+2|0;h=a[d>>0]|0;switch(h|0){case 92:case 34:case 39:{f=i;break d}case 110:{h=10;f=i;break d}case 114:{h=13;f=i;break d}case 116:{h=9;f=i;break d}case 120:{i=a[i>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{j=d+-87|0;break}else{j=d+-55|0;break}else j=h;while(0);i=a[f+3>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{h=d+-87|0;break}else{h=d+-55|0;break}while(0);h=h|j<<4;f=f+4|0;break d}default:{i=-1;j=26;break c}}}default:f=d}while(0);if(b>>>0>=k>>>0){i=-1;j=26;break}a[b>>0]=h;b=b+1|0}if((j|0)==26)return i|0}else if((j|0)==21){i=b+d+-1|0;g=b;while(1){switch(f<<24>>24){case 10:case 0:case 9:case 32:{l=h;break b}default:{}}if(g>>>0>=i>>>0){i=-1;break}l=h+1|0;a[g>>0]=f;g=g+1|0;h=l;f=a[l>>0]|0}return i|0}else if((j|0)==26)return i|0;while(0);a[g>>0]=0;c[e>>2]=l;e=0;return e|0}function je(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=c[d>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Hh(g,f,e)|0;b=c[f>>2]|0;if((b|0)==(g|0)){d=-1;l=h;return d|0}c[d>>2]=b;d=0;l=h;return d|0}function ke(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=Rh(f,e,0)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function le(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}c[b>>2]=Hh(f,e,0)|0;b=c[e>>2]|0;if((b|0)==(f|0)){d=-1;l=g;return d|0}c[d>>2]=b;d=0;l=g;return d|0}function me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;g=c[e>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Hh(g,f,0)|0;b=c[f>>2]|0;if((b|0)==(g|0)){e=-1;l=i;return e|0}if((a[b>>0]|0)==46){b=b+1|0;f=a[b>>0]|0;if((f+-48&255)<10){g=0;h=1e9;do{h=(h>>>0)/10|0;g=(N((f<<24>>24)+-48|0,h)|0)+g|0;b=b+1|0;f=a[b>>0]|0}while((f+-48&255)<10);f=g}else f=0}else f=0;c[d>>2]=f;c[e>>2]=b;e=0;l=i;return e|0}function ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=Rh(f,e,16)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function oe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=f;c[g>>2]=b;c[g+4>>2]=d;Ih(a,16330,f)|0;l=e;return a|0}function pe(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if((d|0)<=0){d=0;return d|0}j=0;a:while(1){h=j<<1;f=a[c+h>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{i=g+-87|0;break}else{i=g+-55|0;break}else i=e;while(0);f=a[c+(h|1)>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{e=g+-87|0;break}else{e=g+-55|0;break}while(0);a[b+j>>0]=e|i<<4;j=j+1|0;if((j|0)>=(d|0)){e=0;f=12;break}}if((f|0)==12)return e|0;return 0}function qe(a){a=a|0;a=Bh(a,16338)|0;return ((a|0)==0?0:a+2|0)|0}function re(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+128|0;i=k;j=i;a:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 10:case 0:{d=-1;f=18;break a}default:{}}f=i;b:while(1){switch(g<<24>>24){case 0:case 10:case 58:break b;default:{}}if((f-j|0)>>>0<127){a[f>>0]=g;f=f+1|0}g=d+1|0;d=g;g=a[g>>0]|0}a[f>>0]=0;if((a[d>>0]|0)!=58){d=-1;f=18;break}c:while(1){d=d+1|0;switch(a[d>>0]|0){case 9:case 32:break;default:break c}}f=Tg(d,10)|0;g=(f|0)!=0;if(g)h=f-d|0;else h=Pg(d)|0;if(!(Og(i,e)|0)){f=16;break}if(g)d=f+1|0;else{d=-1;f=18;break}}if((f|0)==16){c=(h|0)<(c|0)?h:c+-1|0;ri(b|0,d|0,c|0)|0;a[b+c>>0]=0;c=0;l=k;return c|0}else if((f|0)==18){l=k;return d|0}return 0}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(re(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=Rh(f,g,0)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function te(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(re(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=Rh(f,g,16)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function ue(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+80|0;e=f+64|0;d=f;if(re(d,64,b,16341)|0){l=f;return -1}a:while(1){switch(a[d>>0]|0){case 9:case 32:break;default:break a}d=d+1|0}b=Rh(d,e,0)|0;l=f;return ((c[e>>2]|0)==(d|0)?-1:b)|0}function ve(a){a=a|0;if(mf(a,16349,0)|0){a=1;return a|0}if(mf(a,16355,0)|0){a=1;return a|0}a=(mf(a,16362,0)|0)!=0&1;return a|0}function we(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[e>>2]|0;o=Wa[c[o+2576>>2]&3](o,e)|0;if((f|0)<=0)return;m=a+8|0;n=a+4|0;l=0;h=0;e=0;while(1){g=c[o+(l>>>5<<2)>>2]|0;if(!g)g=h;else{i=0;k=e;while(1){j=i;while(1){e=1<<j;if(!(e&g))j=j+1|0;else break}g=g&~e;e=j+l<<12;p=c[m>>2]|0;i=(e|0)/(p|0)|0;p=((e|4095|0)/(p|0)|0)+1|0;e=c[n>>2]|0;e=(p|0)<(e|0)?p:e;if((k|0)!=(h|0)){if((i|0)>(k+3|0)){hb[b&1](a,d,0,h,c[a>>2]|0,k-h|0);h=i}}else h=i;if(!g){g=h;break}else{i=j;k=e}}}l=l+32|0;if((l|0)>=(f|0))break;else h=g}if((e|0)==(g|0))return;hb[b&1](a,d,0,g,c[a>>2]|0,e-g|0);return}function xe(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=lf(12)|0;c[h>>2]=e;c[e>>2]=f;c[e+4>>2]=g;f=f<<2;c[e+8>>2]=f;f=(N(f,g)|0)+65535&-65536;g=e+16|0;c[g>>2]=f;c[h+4>>2]=f>>12;g=c[g>>2]|0;g=_a[c[a+2568>>2]&15](a,b,d,g,((g|0)<0)<<31>>31,2)|0;c[h+8>>2]=g;c[e+12>>2]=c[g+40>>2];c[e+20>>2]=h;c[e+24>>2]=6;return h|0}function ye(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+20>>2]|0;we(a,b,d,c[e+8>>2]|0,c[e+4>>2]|0);return}function ze(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;a:do if((e|0)>=0){j=b+4+(e<<2)|0;if(c[j>>2]|0){i=0;return i|0}}else{e=0;while(1){j=b+4+(e<<2)|0;if(!(c[j>>2]|0))break a;e=e+8|0;if(e>>>0>=256){e=0;break}}return e|0}while(0);k=lf(432)|0;c[k>>2]=b;c[k+316>>2]=Ah(d)|0;a[k+4>>0]=e;a[k+56>>0]=f;a[k+57>>0]=(f&65535)>>>8;a[k+58>>0]=g;a[k+59>>0]=(g&65535)>>>8;a[k+64>>0]=h;a[k+66>>0]=i;a[k+67>>0]=(i&65535)>>>8;a[k+70>>0]=0;a[k+312>>0]=64;kf(k+8|0,7,k,0);kf(k+20|0,7,k,1);kf(k+32|0,7,k,2);kf(k+44|0,7,k,3);c[j>>2]=k;i=k;return i|0}function Ae(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a>>2]|0;f=d[a+4>>0]|0;a=b+3+(f>>>3)&3;b=1<<(f&31);if(!e){e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]&~b}else{e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]|b}eb[c[g+1164+(a*12|0)>>2]&15](c[g+1164+(a*12|0)+4>>2]|0,c[g+1164+(a*12|0)+8>>2]|0,(c[g+1036+(a<<5)+28>>2]|(c[g+1036+(a<<5)+24>>2]|(c[g+1036+(a<<5)+20>>2]|(c[g+1036+(a<<5)+16>>2]|(c[g+1036+(a<<5)+12>>2]|(c[g+1036+(a<<5)+8>>2]|(c[g+1036+(a<<5)+4>>2]|c[g+1036+(a<<5)>>2]))))))|0)!=0&1);return}function Be(a,b){a=a|0;b=b|0;if(b>>>0<4)return a+8+(b*12|0)|0;else ja(16368,16380,140,16386);return 0}function Ce(a){a=a|0;return c[(c[a>>2]|0)+1028>>2]|0}function De(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;if(d>>>0>=7)ja(16405,16380,190,16431);if(e+-1&e|0)ja(16448,16380,191,16431);if(e>>>0<=3)ja(16473,16380,192,16431);i=b+320+(d<<4)|0;if(!(c[i>>2]|0)){c[i>>2]=e;f=f&255;a[b+320+(d<<4)+4>>0]=f;a[b+320+(d<<4)+5>>0]=0;c[b+320+(d<<4)+8>>2]=g;c[b+320+(d<<4)+12>>2]=h;g=(d|0)==6;h=(g?48:(d<<2)+16|0)+(b+56)|0;a[h>>0]=g?0:f;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;return}else ja(16483,16380,194,16431)}function Ee(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return jf(c[(c[a>>2]|0)+1028>>2]|0,b,d,e)|0}function Fe(b,c,d){b=b|0;c=c|0;d=d|0;a[(c&255)+(b+56)>>0]=d;return}function Ge(b,c,d){b=b|0;c=c|0;d=d|0;c=(c&255)+(b+56)|0;a[c>>0]=d;a[c+1>>0]=(d&65535)>>>8;return}function He(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+312|0;f=a[e>>0]|0;g=f&255;h=g+d|0;if((h|0)>256){h=-1;return h|0}a[e>>0]=h;h=b+62|0;a[h>>0]=a[h>>0]|16;ri(b+56+g|0,c|0,d|0)|0;h=b+108|0;a[g+1+(b+56)>>0]=a[h>>0]|0;a[h>>0]=f;h=g;return h|0}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((c[b>>2]|0)!=2){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;f=c[b>>2]|0;a:do if((f|0)>0){e=c[b+8>>2]|0;b=0;while(1){if(!(Og((c[e+(b<<4)+4>>2]|0)+4|0,d)|0))break;b=b+1|0;if((b|0)>=(f|0))break a}if(e+(b<<4)|0){e=e+(b<<4)+8|0;f=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=f;return}}while(0);c[a>>2]=6;c[a+4>>2]=0;return}function Je(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;if((c[a>>2]|0)!=2){d=-1;l=j;return d|0}i=c[a+4>>2]|0;a=c[i>>2]|0;a:do if((a|0)>0){f=c[i+8>>2]|0;e=0;while(1){if(!(Og((c[f+(e<<4)+4>>2]|0)+4|0,b)|0))break;e=e+1|0;if((e|0)>=(a|0)){h=8;break a}}if(f+(e<<4)|0){a=f+(e<<4)+8|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];Ke(g)}else h=8}else h=8;while(0);if((h|0)==8){e=i+4|0;f=c[e>>2]|0;if((a|0)<(f|0))e=c[i+8>>2]|0;else{g=a+1|0;a=(f*3|0)/2|0;a=(g|0)>(a|0)?g:a;g=i+8|0;h=Cg(c[g>>2]|0,a<<4)|0;c[g>>2]=h;c[e>>2]=a;a=c[i>>2]|0;e=h}c[i>>2]=a+1;h=Pg(b)|0;i=Ag(h+5|0)|0;c[i>>2]=h;ri(i+4|0,b|0,h+1|0)|0;c[e+(a<<4)>>2]=0;c[e+(a<<4)+4>>2]=i;a=e+(a<<4)+8|0}i=d;b=c[i+4>>2]|0;d=a;c[d>>2]=c[i>>2];c[d+4>>2]=b;d=0;l=j;return d|0}function Ke(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=l;l=l+16|0;e=f;switch(c[a>>2]|0){case 7:case 0:{Bg(c[a+4>>2]|0);l=f;return}case 3:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=(c[d>>2]|0)+(a<<3)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ke(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Bg(b);l=f;return}case 2:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=c[d>>2]|0;h=g+(a<<4)|0;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];Ke(e);g=g+(a<<4)+8|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ke(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Bg(b);l=f;return}case 6:case 5:case 4:case 1:{l=f;return}default:ra()}}function Le(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[b>>2]|0)!=3){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;if((c[b>>2]|0)>>>0>d>>>0){e=(c[b+8>>2]|0)+(d<<3)|0;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}else{c[a>>2]=6;c[a+4>>2]=0;return}}function Me(a){a=a|0;return ((c[a>>2]|0)==7?(c[a+4>>2]|0)+4|0:0)|0}function Ne(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+272|0;g=e+256|0;f=e;c[g>>2]=d;Xg(f,256,b,g)|0;b=Pg(f)|0;d=Ag(b+5|0)|0;c[d>>2]=b;ri(d+4|0,f|0,b+1|0)|0;c[a>>2]=7;c[a+4>>2]=d;l=e;return}function Oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+240|0;u=y+224|0;m=y+216|0;i=y+208|0;j=y+200|0;s=y+192|0;p=y+184|0;o=y+176|0;n=y+168|0;h=y+160|0;q=y;w=y+212|0;x=y+152|0;v=y+136|0;k=y+144|0;r=y+128|0;e=c[d>>2]|0;c[w>>2]=e;a:while(1){f=a[e>>0]|0;b:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break a;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break b;default:{}}e=e+1|0}}case 42:break;default:break a}e=e+2|0;c:while(1)switch(a[e>>0]|0){case 0:break b;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break c;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;if(!(f<<24>>24)){Ne(b,16496,h);l=y;return}d:do if((g+-48|0)>>>0<10){u=Sh(e,w,0)|0;v=x;c[v>>2]=1;c[v+4>>2]=u}else switch(f<<24>>24){case 34:{Pe(x,w);break d}case 123:{e=e+1|0;c[w>>2]=e;i=lf(12)|0;c[x>>2]=2;c[x+4>>2]=i;i=k+4|0;h=q+1|0;j=q;e:while(1){f=a[e>>0]|0;f:do if(!(Oh(f<<24>>24)|0)){g:do if(f<<24>>24==47){switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break f;default:{}}e=e+1|0}}case 42:break;default:break g}e=e+2|0;h:while(1)switch(a[e>>0]|0){case 0:break f;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break h;else e=f;break}default:e=e+1|0}e=e+2|0;break f}while(0);c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;switch(f<<24>>24){case 125:{t=38;break e}case 34:{Pe(k,w);e=c[i>>2]|0;if((c[k>>2]|0)==7){t=40;break e}break}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){t=48;break e}a[q>>0]=f;e=e+1|0;g=a[e>>0]|0;t=g<<24>>24;if((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26)))){f=e;e=h;do{if((e-j|0)>126){t=48;break e}a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;t=g<<24>>24}while((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26))))}else{f=e;e=h}c[w>>2]=f;a[e>>0]=0;t=Pg(q)|0;e=Ag(t+5|0)|0;c[e>>2]=t;ri(e+4|0,q|0,t+1|0)|0}}if(!(c[e>>2]|0)){t=48;break e}f=c[w>>2]|0;i:while(1){g=a[f>>0]|0;j:do if(!(Oh(g<<24>>24)|0)){if(g<<24>>24!=47)break i;switch(a[f+1>>0]|0){case 47:{f=f+2|0;while(1){switch(a[f>>0]|0){case 10:case 0:break j;default:{}}f=f+1|0}}case 42:break;default:break i}f=f+2|0;k:while(1)switch(a[f>>0]|0){case 0:break j;case 42:{g=f+1|0;if((a[g>>0]|0)==47)break k;else f=g;break}default:f=f+1|0}f=f+2|0}else f=f+1|0;while(0)}c[w>>2]=f;if((a[f>>0]|0)!=58){t=65;break e}c[w>>2]=f+1;Oe(v,w);c[m>>2]=c[x>>2];c[m+4>>2]=c[x+4>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];Je(m,e+4|0,u)|0;e=c[w>>2]|0;l:while(1){f=a[e>>0]|0;m:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break l;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break m;default:{}}e=e+1|0}}case 42:break;default:break l}e=e+2|0;n:while(1)switch(a[e>>0]|0){case 0:break m;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break n;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 125:break f;case 44:break;default:{t=83;break e}}e=e+1|0;c[w>>2]=e}else e=e+1|0;while(0)}if((t|0)==38){c[w>>2]=e+1;break d}else if((t|0)==40){c[b>>2]=7;c[b+4>>2]=e;l=y;return}else if((t|0)==48){Ne(b,16519,n);l=y;return}else if((t|0)==65){Ne(b,16541,o);l=y;return}else if((t|0)==83){Ne(b,16554,p);l=y;return}break}case 91:{e=e+1|0;c[w>>2]=e;n=lf(12)|0;c[x>>2]=3;c[x+4>>2]=n;o=n+8|0;p=n+4|0;m=n+8|0;q=n+8|0;j=0;o:while(1){p:while(1){f=a[e>>0]|0;q:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break p;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break q;default:{}}e=e+1|0}}case 42:break;default:break p}e=e+2|0;r:while(1)switch(a[e>>0]|0){case 0:break q;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break r;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;if((a[e>>0]|0)==93){t=101;break}Oe(r,w);i=r;h=c[i>>2]|0;i=c[i+4>>2]|0;k=v;c[k>>2]=h;c[k+4>>2]=i;k=j+1|0;e=c[n>>2]|0;if(e>>>0<=j>>>0){if((e|0)==(j|0)){e=c[p>>2]|0;if((e|0)>(j|0)){f=k;g=c[m>>2]|0;e=j}else{e=(e*3|0)/2|0;e=(k|0)>(e|0)?k:e;g=Cg(c[q>>2]|0,e<<3)|0;c[q>>2]=g;c[p>>2]=e;e=c[n>>2]|0;f=e+1|0}c[n>>2]=f;e=g+(e<<3)|0;t=109}}else{e=(c[o>>2]|0)+(j<<3)|0;c[u>>2]=c[e>>2];c[u+4>>2]=c[e+4>>2];Ke(u);e=(c[o>>2]|0)+(j<<3)|0;t=109}if((t|0)==109){t=0;j=e;c[j>>2]=h;c[j+4>>2]=i}e=c[w>>2]|0;s:while(1){f=a[e>>0]|0;t:do if(!(Oh(f<<24>>24)|0)){if(f<<24>>24!=47)break s;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break t;default:{}}e=e+1|0}}case 42:break;default:break s}e=e+2|0;u:while(1)switch(a[e>>0]|0){case 0:break t;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break u;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 44:{e=e+1|0;c[w>>2]=e;break}case 93:break;default:break o}j=k}if((t|0)==101){c[w>>2]=e+1;break d}Ne(b,16575,s);l=y;return}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){Ne(b,16637,i);l=y;return}a[q>>0]=f;f=e+1|0;e=q+1|0;g=a[f>>0]|0;v=g<<24>>24;v:do if((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26)))){h=q;while(1){if((e-h|0)>126)break v;a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;v=g<<24>>24;if(!((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26))))){t=134;break}}}else t=134;while(0);if((t|0)==134){c[w>>2]=f;a[e>>0]=0;if(!(Og(q,16596)|0)){v=x;c[v>>2]=5;c[v+4>>2]=0;break d}if(!(Og(q,16601)|0)){v=x;c[v>>2]=4;c[v+4>>2]=1;break d}if(!(Og(q,16606)|0)){v=x;c[v>>2]=4;c[v+4>>2]=0;break d}}c[j>>2]=q;Ne(b,16612,j);l=y;return}}while(0);c[d>>2]=c[w>>2];d=x;w=c[d+4>>2]|0;x=b;c[x>>2]=c[d>>2];c[x+4>>2]=w;l=y;return}function Pe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4144|0;r=s+4128|0;q=s+4120|0;p=s+4112|0;o=s+4104|0;n=s+4096|0;m=s;j=m+4095|0;e=(c[d>>2]|0)+1|0;k=m;a:while(1){h=e+1|0;i=a[e>>0]|0;f=i<<24>>24;b:do switch(i<<24>>24){case 0:case 10:{e=3;break a}case 34:{e=23;break a}case 92:{g=e+2|0;f=a[h>>0]|0;switch(f|0){case 92:case 34:case 39:{e=g;break b}case 110:{f=10;e=g;break b}case 114:{f=13;e=g;break b}case 116:{f=9;e=g;break b}case 120:{g=a[g>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=12;break a}else{i=h+-87|0;break}else{i=h+-55|0;break}else i=f;while(0);g=a[e+3>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=17;break a}else{f=h+-87|0;break}else{f=h+-55|0;break}while(0);f=f|i<<4;e=e+4|0;break b}default:{e=19;break a}}}default:e=h}while(0);if(k>>>0>=j>>>0){e=21;break}a[k>>0]=f;k=k+1|0}if((e|0)==3){Ne(b,16658,n);l=s;return}else if((e|0)==12){Ne(b,16678,o);l=s;return}else if((e|0)==17){Ne(b,16678,p);l=s;return}else if((e|0)==19){Ne(b,16696,q);l=s;return}else if((e|0)==21){Ne(b,16716,r);l=s;return}else if((e|0)==23){a[k>>0]=0;c[d>>2]=h;q=Pg(m)|0;r=Ag(q+5|0)|0;c[r>>2]=q;ri(r+4|0,m|0,q+1|0)|0;c[b>>2]=0;c[b+4>>2]=r;l=s;return}}function Qe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;k=n+24|0;m=n+16|0;i=n+20|0;j=n+8|0;g=n;c[i>>2]=d;Oe(g,i);h=c[g>>2]|0;g=c[g+4>>2]|0;f=j;c[f>>2]=h;c[f+4>>2]=g;if((h|0)==7){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return}d=c[i>>2]|0;a:while(1){e=a[d>>0]|0;b:do if(!(Oh(e<<24>>24)|0)){if(e<<24>>24!=47){f=19;break a}switch(a[d+1>>0]|0){case 47:{d=d+2|0;while(1){switch(a[d>>0]|0){case 10:case 0:break b;default:{}}d=d+1|0}}case 42:break;default:{f=8;break a}}d=d+2|0;c:while(1)switch(a[d>>0]|0){case 0:break b;case 42:{e=d+1|0;if((a[e>>0]|0)==47)break c;else d=e;break}default:d=d+1|0}d=d+2|0}else d=d+1|0;while(0)}if((f|0)==8)c[i>>2]=d;else if((f|0)==19?(c[i>>2]=d,e<<24>>24==0):0){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return};c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];Ke(k);Ne(b,16732,m);l=n;return}function Re(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+16|0;g=f;h=Ag(e+1|0)|0;ri(h|0,d|0,e|0)|0;a[h+e>>0]=0;Qe(g,h);d=g;g=c[d>>2]|0;d=c[d+4>>2]|0;Bg(h);e=b;c[e>>2]=g;c[e+4>>2]=d;l=f;return}function Se(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=lf(16)|0;h=lf(1168)|0;j=h+8|0;Qg(j,b)|0;i=yh(j,47)|0;a[((i|0)==0?j:i+1|0)>>0]=0;i=h+1064|0;c[i>>2]=i;c[h+1068>>2]=i;c[h+4>>2]=d;c[h+1036>>2]=e;c[h+1040>>2]=f;c[h>>2]=g;c[g+12>>2]=h;c[g>>2]=10;c[g+4>>2]=2;c[g+8>>2]=3;Yd(b,0,0,g,10,1)|0;return g|0}function Te(a){a=a|0;a=(c[a+12>>2]|0)+1048|0;y=c[a+4>>2]|0;return c[a>>2]|0}function Ue(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=0;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1096|0;g=h;g=ei(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return _e(a,1)|0}function Ve(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=1;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1112|0;g=h;g=ei(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return _e(a,1)|0}function We(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=l;l=l+1280|0;B=G+128|0;E=G+1248|0;D=G+1240|0;C=G+1232|0;o=G+1224|0;n=G+1216|0;k=G+1200|0;i=G+1184|0;h=G+1176|0;g=G+1168|0;j=G+1256|0;x=G+1160|0;z=G+1152|0;f=G+1208|0;m=G+1192|0;A=G;v=G+1264|0;u=a+12|0;w=c[u>>2]|0;if((b|0)<0){t=c[3261]|0;c[g>>2]=0-b;Wh(t,16765,g)|0;Da(1)}Re(f,d,e);r=f;t=c[r>>2]|0;r=c[r+4>>2]|0;s=x;c[s>>2]=t;c[s+4>>2]=r;if((t|0)==7){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[h>>2]=Me(B)|0;ng(18452,h);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((og(B,16808,j)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}s=c[j>>2]|0;t=s<<1;b=w+1056|0;c[b>>2]=t;if((s|0)>=1?(t+-1&t|0)==0:0){a=w+1060|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((og(B,16839,a)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}a=c[a>>2]|0;if((a|0)<1){ng(16847,k);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}s=c[b>>2]|0;s=ki(s|0,((s|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;t=y;r=w+1048|0;c[r>>2]=s;c[r+4>>2]=t;c[w+1072>>2]=0;r=(c[w+4>>2]|0)/(c[j>>2]|0)|0;c[w+1076>>2]=(r|0)>1?r:1;c[w+1136>>2]=-1;c[w+1080>>2]=8;t=ei(s|0,t|0,7,0)|0;t=ii(t|0,y|0,8,0)|0;c[w+1088>>2]=t;c[w+1084>>2]=lf(t<<2)|0;t=w+1160|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((pg(B,16864,t,1)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}if((c[t>>2]|0)>32){ng(16883,n);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ie(m,B,16915);b=m;a=c[b>>2]|0;b=c[b+4>>2]|0;s=z;c[s>>2]=a;c[s+4>>2]=b;if((a|0)!=6){if((a|0)!=3){ng(16924,o);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}q=c[b>>2]|0;a:do if((q|0)>0){p=v+4|0;r=w+1064|0;s=w+1068|0;o=0;b:while(1){b=q-o|0;n=c[t>>2]|0;n=(b|0)<(n|0)?b:n;b=(n|0)>0;c:do if(b){a=0;do{c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];Le(v,B,a+o|0);if((c[v>>2]|0)!=1)break b;c[A+(a<<2)>>2]=c[p>>2];a=a+1|0}while((a|0)<(n|0));if((n|0)==1){d=c[A>>2]|0;b=c[s>>2]|0;d:do if((b|0)!=(r|0)){a=b;while(1){if((c[a+12>>2]|0)==(d|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break d}if((b|0)==(a|0))if(!b)break;else break c;else{j=c[a>>2]|0;k=a+4|0;m=c[k>>2]|0;c[j+4>>2]=m;c[m>>2]=j;c[a>>2]=0;c[k>>2]=0;m=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[k>>2]=m;c[m>>2]=a;break c}}while(0);k=c[u>>2]|0;m=Xe(k,d)|0;j=k+1104|0;i=j;i=ei(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[j>>2]=i;c[j+4>>2]=y;c[D>>2]=k+8;c[D+4>>2]=d;Wg(B,1024,16966,D)|0;Yd(B,0,0,m,11,1)|0}else F=35}else F=35;while(0);if((F|0)==35){F=0;j=(o|0)/(c[t>>2]|0)|0;k=c[u>>2]|0;m=Ag(140)|0;c[m>>2]=k;c[m+4>>2]=j;c[m+8>>2]=n;do if(b){g=k+1064|0;h=k+1068|0;i=m+12|0;a=0;f=0;do{e=c[A+(f<<2)>>2]|0;d=c[h>>2]|0;e:do if((d|0)!=(g|0)){b=d;while(1){if((c[b+12>>2]|0)==(e|0))break;b=c[b+4>>2]|0;if((b|0)==(g|0)){F=44;break e}}if((d|0)==(b|0))if(!d){F=44;break}else{b=0;break}else{H=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;c[H+4>>2]=e;c[e>>2]=H;c[b>>2]=0;c[d>>2]=0;e=c[h>>2]|0;c[h>>2]=b;c[b>>2]=g;c[d>>2]=e;c[e>>2]=b;b=0;break}}else F=44;while(0);if((F|0)==44){F=0;b=Xe(k,e)|0;a=1}c[i+(f<<2)>>2]=b;f=f+1|0}while((f|0)!=(n|0));if(!a){F=48;break}c[E>>2]=k+8;c[E+4>>2]=j;Wg(B,1024,16980,E)|0;Yd(B,0,0,m,12,1)|0}else F=48;while(0);if((F|0)==48){F=0;Bg(m)}}o=n+o|0;if((q|0)<=(o|0))break a}ng(16944,C);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}while(0)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);a=c[w+1036>>2]|0;if(!a){l=G;return}cb[a&15](c[w+1040>>2]|0);l=G;return}ng(16819,i);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ke(B);Da(1)}function Xe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=a+1072|0;d=c[h>>2]|0;i=a+1076|0;g=a+1064|0;a:do if((d|0)>=(c[i>>2]|0)?(e=c[g>>2]|0,(e|0)!=(g|0)):0)do{f=e;e=c[e>>2]|0;if((c[f+16>>2]|0)==1){c[h>>2]=d+-1;Ia(f+20|0);j=c[f>>2]|0;d=c[f+4>>2]|0;c[j+4>>2]=d;c[d>>2]=j;Bg(f);d=c[h>>2]|0;if((d|0)<(c[i>>2]|0))break a}}while((e|0)!=(g|0));while(0);j=lf(28)|0;c[j+8>>2]=a;c[j+12>>2]=b;c[j+16>>2]=0;b=j+20|0;Ga(b|0);Ja(b|0,c[a+1056>>2]<<9|0)|0;b=a+1068|0;i=c[b>>2]|0;c[b>>2]=j;c[j>>2]=g;c[j+4>>2]=i;c[i>>2]=j;c[h>>2]=(c[h>>2]|0)+1;return j|0}function Ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((b|0)<0){g=c[3261]|0;c[f>>2]=c[a+12>>2];Wh(g,17138,f)|0;Da(1)}g=c[a+8>>2]|0;if((c[g+1056>>2]<<9|0)!=(e|0))ja(17163,17058,366,17192);b=c[g>>2]|0;f=a+16|0;if(c[f>>2]|0)ja(17095,17058,346,17122);La(a+20|0,0,d|0,e|0);c[f>>2]=1;if((c[a+12>>2]|0)!=(c[g+1136>>2]|0)){l=h;return}_e(b,0)|0;l=h;return}function Ze(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;if((b|0)<0){k=c[3261]|0;c[f>>2]=c[a+4>>2];Wh(k,16994,f)|0;Da(1)}j=c[(c[a>>2]|0)+1056>>2]<<9;k=a+8|0;b=c[k>>2]|0;if((N(j,b)|0)!=(e|0))ja(17019,17058,252,17070);if((b|0)<=0){Bg(a);l=m;return}f=a+12|0;b=0;while(1){e=c[f+(b<<2)>>2]|0;if(e|0){g=c[e+8>>2]|0;h=c[g>>2]|0;i=e+16|0;if(c[i>>2]|0){b=9;break}n=d+(N(b,j)|0)|0;La(e+20|0,0,n|0,c[g+1056>>2]<<9|0);c[i>>2]=1;if((c[e+12>>2]|0)==(c[g+1136>>2]|0))_e(h,0)|0}b=b+1|0;if((b|0)>=(c[k>>2]|0)){b=13;break}}if((b|0)==9)ja(17095,17058,346,17122);else if((b|0)==13){Bg(a);l=m;return}}function _e(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+1040|0;C=E+1024|0;B=E;w=a+12|0;x=c[w>>2]|0;z=x+1144|0;A=x+1140|0;a=c[A>>2]|0;d=(c[z>>2]|0)-a|0;a:do if(d|0){m=x+1128|0;n=x+1080|0;o=x+1084|0;p=x+1056|0;q=x+1136|0;r=x+1064|0;s=x+1068|0;t=x+1120|0;u=x+1156|0;v=x+1092|0;b:while(1){i=m;h=c[i>>2]|0;i=c[i+4>>2]|0;e=c[n>>2]|0;f=((e|0)<0)<<31>>31;k=li(h|0,i|0,e|0,f|0)|0;g=y;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;do if(!j){e=c[p>>2]|0;f=((e|0)<0)<<31>>31;g=li(h|0,i|0,e|0,f|0)|0;f=ki(g|0,y|0,e|0,f|0)|0;f=fi(h|0,i|0,f|0,y|0)|0;e=e-f|0;d=(d|0)<(e|0)?d:e;c[q>>2]=g;e=c[s>>2]|0;if((e|0)==(r|0))break b;a=e;while(1){if((c[a+12>>2]|0)==(g|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break b}if((e|0)==(a|0)){if(!e)break b}else{h=c[a>>2]|0;i=a+4|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[a>>2]=0;c[i>>2]=0;j=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[i>>2]=j;c[j>>2]=a}if(!(c[a+16>>2]|0)){a=1;D=23;break b}if(!(c[t>>2]|0)){Ha(a+20|0,f<<9|0,(c[u>>2]|0)+(c[A>>2]<<9)|0,d<<9|0);a=(c[A>>2]|0)+d|0;c[A>>2]=a;j=m;j=ei(c[j>>2]|0,c[j+4>>2]|0,d|0,((d|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y;c[q>>2]=-1;break}else{h=lf(8)|0;i=c[n>>2]<<9;j=Ag(i)|0;Ga(h|0);Ja(h|0,i|0)|0;c[(c[o>>2]|0)+(k<<2)>>2]=h;k=N(c[n>>2]|0,k)|0;Ha(a+20|0,((c[p>>2]|0)+-1&k)<<9|0,j|0,i|0);La(h|0,0,j|0,i|0);Bg(j);c[v>>2]=(c[v>>2]|0)+1;a=c[A>>2]|0;break}}else{f=ki(k|0,g|0,e|0,f|0)|0;f=fi(h|0,i|0,f|0,y|0)|0;e=e-f|0;e=(d|0)<(e|0)?d:e;f=f<<9;a=(c[u>>2]|0)+(a<<9)|0;d=e<<9;if(!(c[t>>2]|0))Ha(j|0,f|0,a|0,d|0);else La(j|0,f|0,a|0,d|0);a=(c[A>>2]|0)+e|0;c[A>>2]=a;j=m;j=ei(c[j>>2]|0,c[j+4>>2]|0,e|0,((e|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y}while(0);d=(c[z>>2]|0)-a|0;if(!d)break a}if((D|0)==23){l=E;return a|0}b=c[w>>2]|0;D=Xe(b,g)|0;A=b+1104|0;z=A;z=ei(c[z>>2]|0,c[z+4>>2]|0,1,0)|0;c[A>>2]=z;c[A+4>>2]=y;c[C>>2]=b+8;c[C+4>>2]=g;Wg(B,1024,16966,C)|0;Yd(B,0,0,D,11,1)|0;D=1;l=E;return D|0}while(0);if(b|0){D=0;l=E;return D|0}db[c[x+1148>>2]&15](c[x+1152>>2]|0,0);D=0;l=E;return D|0}function $e(){var a=0;a=lf(2592)|0;c[a+2568>>2]=9;c[a+2572>>2]=10;c[a+2576>>2]=2;c[a+2580>>2]=5;return a|0}function af(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;i=c[a>>2]|0;if((i|0)>=32)ja(17207,17248,85,17256);if(!(((e|0)!=0|(f|0)!=0)&((e&4095|0)==0&0==0)))ja(17275,17248,86,17256);c[a>>2]=i+1;h=a+8+(i*80|0)|0;c[h>>2]=a;c[a+8+(i*80|0)+32>>2]=1;c[a+8+(i*80|0)+36>>2]=g&-5;j=a+8+(i*80|0)+8|0;c[j>>2]=b;c[j+4>>2]=d;b=a+8+(i*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(g&4|0)==0;j=a+8+(i*80|0)+24|0;c[j>>2]=b?e:0;c[j+4>>2]=b?f:0;j=a+8+(i*80|0)+40|0;c[j>>2]=0;b=a+8+(i*80|0)+48|0;c[b>>2]=0;d=lf(e)|0;c[j>>2]=d;if(!d){Uh(17325,29,1,c[3261]|0)|0;Da(1)}if(!(g&2))return h|0;f=ni(e|0,f|0,12)|0;f=(f+31|0)>>>5<<2;g=a+8+(i*80|0)+44|0;c[g>>2]=f;j=a+8+(i*80|0)+60|0;c[j>>2]=0;c[a+8+(i*80|0)+52>>2]=lf(f)|0;c[a+8+(i*80|0)+56>>2]=lf(c[g>>2]|0)|0;c[b>>2]=c[a+8+(i*80|0)+52+(c[j>>2]<<2)>>2];return h|0}function bf(a,b){a=a|0;b=b|0;Bg(c[b+40>>2]|0);return}function cf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=b+48|0;i=c[h>>2]|0;f=b+44|0;d=c[f>>2]|0;g=d>>>2;a:do if(g){e=0;while(1){if(c[i+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>=g>>>0)break a}g=b+24|0;if(!((c[g>>2]|0)==0&(c[g+4>>2]|0)==0)){eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);d=c[f>>2]|0}}while(0);f=b+60|0;g=c[f>>2]^1;c[f>>2]=g;b=c[b+52+(g<<2)>>2]|0;c[h>>2]=b;si(b|0,0,d|0)|0;return i|0}function df(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=b+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!f){if(g)return;if(c[b+32>>2]|0)eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);e=b+8|0;c[e>>2]=0;c[e+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;return}if(!g?(f=b+8|0,(c[f>>2]|0)==(d|0)?(c[f+4>>2]|0)==(e|0):0):0)return;if(!(c[b+32>>2]|0))a=b+16|0;else{f=b+16|0;eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[f>>2]|0);a=f}b=b+8|0;c[b>>2]=d;c[b+4>>2]=e;d=a;e=c[d+4>>2]|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;return}function ef(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)<=0){Bg(a);return}e=a+2572|0;d=0;do{if(c[a+8+(d*80|0)+32>>2]|0){db[c[e>>2]&15](a,a+8+(d*80|0)|0);b=c[a>>2]|0}d=d+1|0}while((d|0)<(b|0));Bg(a);return}function ff(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=c[a>>2]|0;if((h|0)<=0){i=0;return i|0}e=0;while(1){f=a+8+(e*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(j=a+8+(e*80|0)+24|0,g=ei(c[j>>2]|0,c[j+4>>2]|0,g|0,f|0)|0,f=y,f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0):0)break;e=e+1|0;if((e|0)>=(h|0)){e=0;i=7;break}}if((i|0)==7)return e|0;j=a+8+(e*80|0)|0;return j|0}function gf(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;k=c[a>>2]|0;if((k|0)>=32)ja(17207,17248,197,17355);if(f>>>0<1|(f|0)==1&e>>>0<0){c[a>>2]=k+1;l=a+8+(k*80|0)|0;c[l>>2]=a;m=a+8+(k*80|0)+8|0;c[m>>2]=b;c[m+4>>2]=d;b=a+8+(k*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(j&16|0)==0;d=a+8+(k*80|0)+24|0;c[d>>2]=b?e:0;c[d+4>>2]=b?f:0;c[a+8+(k*80|0)+32>>2]=0;c[a+8+(k*80|0)+64>>2]=g;c[a+8+(k*80|0)+68>>2]=h;c[a+8+(k*80|0)+72>>2]=i;c[a+8+(k*80|0)+76>>2]=j;return l|0}else ja(17375,17248,198,17355);return 0}function hf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[a>>2]|0;if(c[a+32>>2]|0){gb[c[f+2580>>2]&7](f,a,b,d,e);return}h=a+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!e){if(g)return;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;d=h;c[d>>2]=0;c[d+4>>2]=0;return}f=a+8|0;if(!g?(e=f,(c[e>>2]|0)==(b|0)?(c[e+4>>2]|0)==(d|0):0):0)return;e=f;c[e>>2]=b;c[e+4>>2]=d;a=a+16|0;b=c[a+4>>2]|0;d=h;c[d>>2]=c[a>>2];c[d+4>>2]=b;return}function jf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=c[a>>2]|0;if((i|0)<=0){k=0;return k|0}h=0;while(1){f=a+8+(h*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(l=a+8+(h*80|0)+24|0,l=ei(c[l>>2]|0,c[l+4>>2]|0,g|0,f|0)|0,m=y,m>>>0>d>>>0|(m|0)==(d|0)&l>>>0>b>>>0):0)break;f=h+1|0;if((f|0)<(i|0))h=f;else{f=0;k=11;break}}if((k|0)==11)return f|0;if(!(c[a+8+(h*80|0)+32>>2]|0)){m=0;return m|0}f=fi(b|0,d|0,g|0,f|0)|0;if(e|0?(m=c[a+8+(h*80|0)+48>>2]|0,j=m+(f>>>17<<2)|0,m|0):0)c[j>>2]=c[j>>2]|1<<(f>>>12&31);m=(c[a+8+(h*80|0)+40>>2]|0)+f|0;return m|0}function kf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;return}function lf(a){a=a|0;var b=0;b=Ag(a)|0;if(!b){b=0;return b|0}si(b|0,0,a|0)|0;return b|0}function mf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=a[d>>0]|0;a:do if(f<<24>>24){while(1){if((a[b>>0]|0)!=f<<24>>24){b=0;break}b=b+1|0;d=d+1|0;f=a[d>>0]|0;if(!(f<<24>>24))break a}return b|0}while(0);if(!e){e=1;return e|0}c[e>>2]=b;e=1;return e|0}function nf(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function of(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+4|0;i=c[h>>2]|0;j=i+1|0;g=b+8|0;k=c[g>>2]|0;f=(k*3|0)>>>1;f=(j|0)>(f|0)?j:f;e=c[b>>2]|0;if(j>>>0>k>>>0){e=Cg(e,f)|0;c[b>>2]=e;c[g>>2]=f}a[e+i>>0]=d;if(j>>>0<=(c[h>>2]|0)>>>0)return;c[h>>2]=j;return}function pf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+4|0;h=c[g>>2]|0;i=Pg(b)|0;j=i+h|0;f=a+8|0;k=c[f>>2]|0;e=(k*3|0)>>>1;e=(j|0)>(e|0)?j:e;d=c[a>>2]|0;if(j>>>0>k>>>0){d=Cg(d,e)|0;c[a>>2]=d;c[f>>2]=e}ri(d+h|0,b|0,i|0)|0;if(j>>>0<=(c[g>>2]|0)>>>0)return;c[g>>2]=j;return}function qf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;if(!((a|0)!=0&(e|0)!=0)){h=-1;return h|0}switch(b|0){case 128:case 192:case 256:break;default:{h=-2;return h|0}}g=(b|0)==128;do if(!g){f=e+240|0;if((b|0)==192){c[f>>2]=12;break}else{c[f>>2]=14;break}}else c[e+240>>2]=10;while(0);f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);c[e>>2]=f;c[e+4>>2]=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);c[e+8>>2]=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);c[e+12>>2]=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(g){a=0;do{g=c[e+12>>2]|0;f=c[16+((g>>>16&255)<<2)>>2]&-16777216^f^c[16+((g>>>8&255)<<2)>>2]&16711680^c[16+((g&255)<<2)>>2]&65280^c[16+(g>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];h=e;e=e+16|0;c[e>>2]=f;b=c[h+4>>2]^f;c[h+20>>2]=b;b=c[h+8>>2]^b;c[h+24>>2]=b;c[h+28>>2]=b^g;a=a+1|0}while((a|0)!=10);f=0;return f|0}c[e+16>>2]=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);c[e+20>>2]=(d[a+21>>0]|0)<<16|(d[a+20>>0]|0)<<24|(d[a+22>>0]|0)<<8|(d[a+23>>0]|0);if((b|0)==192){a=0;while(1){h=c[e+20>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+24|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+28>>2]=g;g=c[e+8>>2]^g;c[e+32>>2]=g;g=c[e+12>>2]^g;c[e+36>>2]=g;a=a+1|0;if((a|0)==8){f=0;break}g=c[e+16>>2]^g;c[e+40>>2]=g;c[e+44>>2]=g^h;e=b}return f|0}c[e+24>>2]=(d[a+25>>0]|0)<<16|(d[a+24>>0]|0)<<24|(d[a+26>>0]|0)<<8|(d[a+27>>0]|0);c[e+28>>2]=(d[a+29>>0]|0)<<16|(d[a+28>>0]|0)<<24|(d[a+30>>0]|0)<<8|(d[a+31>>0]|0);if((b|0)!=256){h=0;return h|0}a=0;while(1){h=c[e+28>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+32|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+36>>2]=g;g=c[e+8>>2]^g;c[e+40>>2]=g;g=c[e+12>>2]^g;c[e+44>>2]=g;a=a+1|0;if((a|0)==7){f=0;break}g=c[16+(g>>>24<<2)>>2]&-16777216^c[e+16>>2]^c[16+((g>>>16&255)<<2)>>2]&16711680^c[16+((g>>>8&255)<<2)>>2]&65280^c[16+((g&255)<<2)>>2]&255;c[e+48>>2]=g;g=c[e+20>>2]^g;c[e+52>>2]=g;g=c[e+24>>2]^g;c[e+56>>2]=g;c[e+60>>2]=g^h;e=b}return f|0}function rf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=qf(a,b,d)|0;if((a|0)<0){d=a;return d|0}e=d+240|0;a=c[e>>2]|0;if((a|0)<=0){d=0;return d|0}a=a<<2;b=0;do{f=d+(b<<2)|0;g=c[f>>2]|0;h=d+(a<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|1)<<2)|0;g=c[h>>2]|0;f=d+((a|1)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;f=d+((b|2)<<2)|0;g=c[f>>2]|0;h=d+((a|2)<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|3)<<2)|0;g=c[h>>2]|0;f=d+((a|3)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;b=b+4|0;a=a+-4|0}while((b|0)<(a|0));if((c[e>>2]|0)<=1){h=0;return h|0}a=d;b=1;do{h=a;a=a+16|0;g=c[a>>2]|0;c[a>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];g=h+20|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];g=h+24|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];h=h+28|0;g=c[h>>2]|0;c[h>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];b=b+1|0}while((b|0)<(c[e>>2]|0));a=0;return a|0}function sf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[6208+((h>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((i>>>8&255)<<2)>>2]^c[8256+((b&255)<<2)>>2]^c[n+16>>2];l=c[6208+((i>>>16&255)<<2)>>2]^c[5184+(h>>>24<<2)>>2]^c[7232+((b>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[n+20>>2];m=c[6208+((b>>>16&255)<<2)>>2]^c[5184+(i>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((h&255)<<2)>>2]^c[n+24>>2];g=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(b>>>24<<2)>>2]^c[7232+((h>>>8&255)<<2)>>2]^c[8256+((i&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[6208+((m>>>16&255)<<2)>>2]^c[5184+(l>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((k&255)<<2)>>2]^c[n+36>>2];q=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(m>>>24<<2)>>2]^c[7232+((k>>>8&255)<<2)>>2]^c[8256+((l&255)<<2)>>2]^c[n+40>>2];k=c[6208+((k>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((l>>>8&255)<<2)>>2]^c[8256+((m&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[6208+((l>>>16&255)<<2)>>2]^c[5184+(i<<2)>>2]^c[7232+((m>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[16+((l>>>16&255)<<2)>>2]&16711680|c[16+(i<<2)>>2]&-16777216|c[16+((m>>>8&255)<<2)>>2]&65280|c[16+((g&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[16+((m>>>16&255)<<2)>>2]&16711680|c[16+(l>>>24<<2)>>2]&-16777216|c[16+((g>>>8&255)<<2)>>2]&65280|c[16+((k&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[16+((g>>>16&255)<<2)>>2]&16711680|c[16+(m>>>24<<2)>>2]&-16777216|c[16+((k>>>8&255)<<2)>>2]&65280|c[16+((l&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[16+((k>>>16&255)<<2)>>2]&16711680|c[16+(g>>>24<<2)>>2]&-16777216|c[16+((l>>>8&255)<<2)>>2]&65280|c[16+((m&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function tf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[2112+((b>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((i>>>8&255)<<2)>>2]^c[4160+((h&255)<<2)>>2]^c[n+16>>2];l=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(h>>>24<<2)>>2]^c[3136+((b>>>8&255)<<2)>>2]^c[4160+((i&255)<<2)>>2]^c[n+20>>2];m=c[2112+((h>>>16&255)<<2)>>2]^c[1088+(i>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((b&255)<<2)>>2]^c[n+24>>2];g=c[2112+((i>>>16&255)<<2)>>2]^c[1088+(b>>>24<<2)>>2]^c[3136+((h>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[2112+((k>>>16&255)<<2)>>2]^c[1088+(l>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((m&255)<<2)>>2]^c[n+36>>2];q=c[2112+((l>>>16&255)<<2)>>2]^c[1088+(m>>>24<<2)>>2]^c[3136+((k>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+40>>2];k=c[2112+((m>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((l>>>8&255)<<2)>>2]^c[4160+((k&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(i<<2)>>2]^c[3136+((m>>>8&255)<<2)>>2]^c[4160+((l&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[9280+((g>>>16&255)<<2)>>2]&16711680|c[9280+(i<<2)>>2]&-16777216|c[9280+((m>>>8&255)<<2)>>2]&65280|c[9280+((l&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[9280+((k>>>16&255)<<2)>>2]&16711680|c[9280+(l>>>24<<2)>>2]&-16777216|c[9280+((g>>>8&255)<<2)>>2]&65280|c[9280+((m&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[9280+((l>>>16&255)<<2)>>2]&16711680|c[9280+(m>>>24<<2)>>2]&-16777216|c[9280+((k>>>8&255)<<2)>>2]&65280|c[9280+((g&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[9280+((m>>>16&255)<<2)>>2]&16711680|c[9280+(g>>>24<<2)>>2]&-16777216|c[9280+((l>>>8&255)<<2)>>2]&65280|c[9280+((k&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function uf(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=l;l=l+16|0;T=U;h=d>>>0>15;if(!g){if(h){i=d+-16|0;j=i&-16;A=j+16|0;g=b+A|0;k=f+1|0;m=f+2|0;n=f+3|0;o=f+4|0;p=f+5|0;q=f+6|0;r=f+7|0;s=f+8|0;t=f+9|0;u=f+10|0;v=f+11|0;w=f+12|0;x=f+13|0;y=f+14|0;z=f+15|0;h=b;b=c;while(1){S=T;Q=h;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));tf(h,b,e);a[b>>0]=a[b>>0]^a[f>>0];S=b+1|0;a[S>>0]=a[S>>0]^a[k>>0];S=b+2|0;a[S>>0]=a[S>>0]^a[m>>0];S=b+3|0;a[S>>0]=a[S>>0]^a[n>>0];S=b+4|0;a[S>>0]=a[S>>0]^a[o>>0];S=b+5|0;a[S>>0]=a[S>>0]^a[p>>0];S=b+6|0;a[S>>0]=a[S>>0]^a[q>>0];S=b+7|0;a[S>>0]=a[S>>0]^a[r>>0];S=b+8|0;a[S>>0]=a[S>>0]^a[s>>0];S=b+9|0;a[S>>0]=a[S>>0]^a[t>>0];S=b+10|0;a[S>>0]=a[S>>0]^a[u>>0];S=b+11|0;a[S>>0]=a[S>>0]^a[v>>0];S=b+12|0;a[S>>0]=a[S>>0]^a[w>>0];S=b+13|0;a[S>>0]=a[S>>0]^a[x>>0];S=b+14|0;a[S>>0]=a[S>>0]^a[y>>0];S=b+15|0;a[S>>0]=a[S>>0]^a[z>>0];S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{h=h+16|0;b=b+16|0}}d=i-j|0;h=c+A|0}else{g=b;h=c}if(!d){l=U;return}S=T;Q=g;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));tf(T,T,e);c=0;do{a[h+c>>0]=a[f+c>>0]^a[T+c>>0];c=c+1|0}while((c|0)!=(d|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}if(h){O=d+-16|0;i=O&-16;P=i+16|0;h=b+P|0;j=f+1|0;k=T+1|0;m=f+2|0;n=T+2|0;o=f+3|0;p=T+3|0;q=f+4|0;r=T+4|0;s=f+5|0;t=T+5|0;u=f+6|0;v=T+6|0;w=f+7|0;x=T+7|0;y=f+8|0;z=T+8|0;A=f+9|0;B=T+9|0;C=f+10|0;D=T+10|0;E=f+11|0;F=T+11|0;G=f+12|0;H=T+12|0;I=f+13|0;J=T+13|0;K=f+14|0;L=T+14|0;M=f+15|0;N=T+15|0;g=b;b=c;while(1){a[T>>0]=a[f>>0]^a[g>>0];a[k>>0]=a[j>>0]^a[g+1>>0];a[n>>0]=a[m>>0]^a[g+2>>0];a[p>>0]=a[o>>0]^a[g+3>>0];a[r>>0]=a[q>>0]^a[g+4>>0];a[t>>0]=a[s>>0]^a[g+5>>0];a[v>>0]=a[u>>0]^a[g+6>>0];a[x>>0]=a[w>>0]^a[g+7>>0];a[z>>0]=a[y>>0]^a[g+8>>0];a[B>>0]=a[A>>0]^a[g+9>>0];a[D>>0]=a[C>>0]^a[g+10>>0];a[F>>0]=a[E>>0]^a[g+11>>0];a[H>>0]=a[G>>0]^a[g+12>>0];a[J>>0]=a[I>>0]^a[g+13>>0];a[L>>0]=a[K>>0]^a[g+14>>0];a[N>>0]=a[M>>0]^a[g+15>>0];sf(T,b,e);S=f;Q=b;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{g=g+16|0;b=b+16|0}}d=O-i|0;c=c+P|0}else h=b;if(!d){l=U;return}g=0;do{a[T+g>>0]=a[f+g>>0]^a[h+g>>0];g=g+1|0}while((g|0)!=(d|0));if(d>>>0<16)ri(T+d|0,f+d|0,16-d|0)|0;sf(T,T,e);S=c;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}function vf(a){a=a|0;var b=0;c[a+40>>2]=0;b=a;c[b>>2]=0;c[b+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function wf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=a+40|0;e=c[g>>2]|0;if(e>>>0>64)ra();i=a;f=c[i>>2]|0;i=c[i+4>>2]|0;h=ei(f|0,i|0,d|0,0)|0;j=y;if(j>>>0<i>>>0|(j|0)==(i|0)&h>>>0<f>>>0)ra();if(!d)return;f=a+44|0;while(1){if(!(d>>>0>63&(e|0)==0)){i=64-e|0;i=(d|0)<(i|0)?d:i;ri(a+44+e|0,b|0,i|0)|0;j=(c[g>>2]|0)+i|0;c[g>>2]=j;e=b+i|0;d=d-i|0;if((j|0)==64){xf(a,f);i=a;i=ei(c[i>>2]|0,c[i+4>>2]|0,512,0)|0;j=a;c[j>>2]=i;c[j+4>>2]=y;c[g>>2]=0}}else{xf(a,b);j=a;j=ei(c[j>>2]|0,c[j+4>>2]|0,512,0)|0;e=a;c[e>>2]=j;c[e+4>>2]=y;e=b+64|0;d=d+-64|0}if(!d)break;b=e;e=c[g>>2]|0}return}function xf(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+288|0;f=i+256|0;g=i;h=a+8|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];c[f+24>>2]=c[h+24>>2];c[f+28>>2]=c[h+28>>2];e=0;do{j=b+(e<<2)|0;c[g+(e<<2)>>2]=(d[j+1>>0]|0)<<16|(d[j>>0]|0)<<24|(d[j+2>>0]|0)<<8|(d[j+3>>0]|0);e=e+1|0}while((e|0)!=16);e=16;b=c[g>>2]|0;do{j=c[g+(e+-2<<2)>>2]|0;k=b;b=c[g+(e+-15<<2)>>2]|0;c[g+(e<<2)>>2]=k+(c[g+(e+-7<<2)>>2]|0)+((j>>>19|j<<13)^j>>>10^(j>>>17|j<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);j=f+28|0;q=f+16|0;r=c[q>>2]|0;b=f+24|0;s=c[b>>2]|0;v=f+20|0;e=c[v>>2]|0;k=(c[j>>2]|0)+1116352408+(c[g>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((e^s)&r^s)|0;t=c[f>>2]|0;u=f+4|0;o=c[u>>2]|0;w=f+8|0;n=c[w>>2]|0;m=f+12|0;p=k+(c[m>>2]|0)|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((o|t)&n|o&t)+k|0;c[j>>2]=k;s=s+1899447441+(c[g+4>>2]|0)+(p&(e^r)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=e+-1245643825+(c[g+8>>2]|0)+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=r+-373957723+(c[g+12>>2]|0)+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=p+961987163+(c[g+16>>2]|0)+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=n+1508970993+(c[g+20>>2]|0)+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+24>>2]|0)+-1841331548+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+28>>2]|0)+-1424204075+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+32>>2]|0)+-670586216+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+36>>2]|0)+310598401+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+40>>2]|0)+607225278+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+44>>2]|0)+1426881987+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+48>>2]|0)+1925078388+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+52>>2]|0)+-2132889090+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+56>>2]|0)+-1680079193+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+60>>2]|0)+-1046744716+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+64>>2]|0)+-459576895+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+68>>2]|0)+-272742522+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+72>>2]|0)+264347078+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+76>>2]|0)+604807628+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+80>>2]|0)+770255983+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+84>>2]|0)+1249150122+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+88>>2]|0)+1555081692+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+92>>2]|0)+1996064986+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+96>>2]|0)+-1740746414+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+100>>2]|0)+-1473132947+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+104>>2]|0)+-1341970488+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+108>>2]|0)+-1084653625+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+112>>2]|0)+-958395405+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+116>>2]|0)+-710438585+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+120>>2]|0)+113926993+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+124>>2]|0)+338241895+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+128>>2]|0)+666307205+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+132>>2]|0)+773529912+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+136>>2]|0)+1294757372+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+140>>2]|0)+1396182291+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+144>>2]|0)+1695183700+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+148>>2]|0)+1986661051+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+152>>2]|0)+-2117940946+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+156>>2]|0)+-1838011259+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+160>>2]|0)+-1564481375+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+164>>2]|0)+-1474664885+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+168>>2]|0)+-1035236496+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+172>>2]|0)+-949202525+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+176>>2]|0)+-778901479+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+180>>2]|0)+-694614492+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+184>>2]|0)+-200395387+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+188>>2]|0)+275423344+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+192>>2]|0)+430227734+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+196>>2]|0)+506948616+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+200>>2]|0)+659060556+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+204>>2]|0)+883997877+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+208>>2]|0)+958139571+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+212>>2]|0)+1322822218+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+216>>2]|0)+1537002063+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+220>>2]|0)+1747873779+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+224>>2]|0)+1955562222+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+228>>2]|0)+2024104815+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+232>>2]|0)+-2067236844+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+236>>2]|0)+-1933114872+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+240>>2]|0)+-1866530822+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+244>>2]|0)+-1538233109+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+248>>2]|0)+-1090935817+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;k=(c[g+252>>2]|0)+-965641998+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;g=k+r|0;c[q>>2]=g;k=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+k|0;c[f>>2]=k;c[h>>2]=k+(c[h>>2]|0);k=a+12|0;c[k>>2]=o+(c[k>>2]|0);k=a+16|0;c[k>>2]=n+(c[k>>2]|0);k=a+20|0;c[k>>2]=(c[m>>2]|0)+(c[k>>2]|0);k=a+24|0;c[k>>2]=g+(c[k>>2]|0);k=a+28|0;c[k>>2]=e+(c[k>>2]|0);k=a+32|0;c[k>>2]=(c[b>>2]|0)+(c[k>>2]|0);k=a+36|0;c[k>>2]=(c[j>>2]|0)+(c[k>>2]|0);l=i;return}function yf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=d+40|0;e=c[h>>2]|0;if(e>>>0>63)ra();i=d;i=ei(c[i>>2]|0,c[i+4>>2]|0,e<<3|0,0)|0;g=d;c[g>>2]=i;c[g+4>>2]=y;g=d+44|0;c[h>>2]=e+1;a[d+44+e>>0]=-128;e=c[h>>2]|0;if(e>>>0<=56){if((e|0)!=56)f=9}else{if(e>>>0<64)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<64);xf(d,g);c[h>>2]=0;e=0;f=9}if((f|0)==9)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<56);h=d;i=c[h>>2]|0;h=c[h+4>>2]|0;f=ni(i|0,h|0,56)|0;a[d+100>>0]=f;f=ni(i|0,h|0,48)|0;a[d+101>>0]=f;f=ni(i|0,h|0,40)|0;a[d+102>>0]=f;a[d+103>>0]=h;a[d+104>>0]=i>>>24;a[d+105>>0]=i>>>16;a[d+106>>0]=i>>>8;a[d+107>>0]=i;xf(d,g);i=c[d+8>>2]|0;a[b>>0]=i>>>24;a[b+1>>0]=i>>>16;a[b+2>>0]=i>>>8;a[b+3>>0]=i;i=c[d+12>>2]|0;a[b+4>>0]=i>>>24;a[b+5>>0]=i>>>16;a[b+6>>0]=i>>>8;a[b+7>>0]=i;i=c[d+16>>2]|0;a[b+8>>0]=i>>>24;a[b+9>>0]=i>>>16;a[b+10>>0]=i>>>8;a[b+11>>0]=i;i=c[d+20>>2]|0;a[b+12>>0]=i>>>24;a[b+13>>0]=i>>>16;a[b+14>>0]=i>>>8;a[b+15>>0]=i;i=c[d+24>>2]|0;a[b+16>>0]=i>>>24;a[b+17>>0]=i>>>16;a[b+18>>0]=i>>>8;a[b+19>>0]=i;i=c[d+28>>2]|0;a[b+20>>0]=i>>>24;a[b+21>>0]=i>>>16;a[b+22>>0]=i>>>8;a[b+23>>0]=i;i=c[d+32>>2]|0;a[b+24>>0]=i>>>24;a[b+25>>0]=i>>>16;a[b+26>>0]=i>>>8;a[b+27>>0]=i;i=c[d+36>>2]|0;a[b+28>>0]=i>>>24;a[b+29>>0]=i>>>16;a[b+30>>0]=i>>>8;a[b+31>>0]=i;return}function zf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+112|0;f=e;c[f+40>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[f+8>>2]=1779033703;c[f+12>>2]=-1150833019;c[f+16>>2]=1013904242;c[f+20>>2]=-1521486534;c[f+24>>2]=1359893119;c[f+28>>2]=-1694144372;c[f+32>>2]=528734635;c[f+36>>2]=1541459225;wf(f,a,b);yf(d,f);l=e;return}function Af(b){b=b|0;c[5288]=12968;c[5420]=b;c[5289]=4096;a[21566]=3;a[21565]=32;a[21568]=1;c[5399]=0;c[5406]=c[5406]|1315117;b=0;do{c[21684+(b<<3)>>2]=-1;c[23732+(b<<3)>>2]=-1;c[25780+(b<<3)>>2]=-1;b=b+1|0}while((b|0)!=256);return 21152}function Bf(a){a=a|0;Bg(a);return}function Cf(b,d){b=b|0;d=d|0;var e=0,f=0;e=21576;e=ei(c[e>>2]|0,c[e+4>>2]|0,d|0,0)|0;f=y;if(!((c[5396]|0)==0&(d|0)>0))return;b=d;while(1){if((a[21565]|0)!=32){b=6;break}Kf(b);if(c[5396]|0){b=7;break}b=21576;b=fi(e|0,f|0,c[b>>2]|0,c[b+4>>2]|0)|0;if((b|0)<=0){b=7;break}}if((b|0)==6)ra();else if((b|0)==7)return}function Df(a){a=a|0;a=a+424|0;y=c[a+4>>2]|0;return c[a>>2]|0}function Ef(a,b){a=a|0;b=b|0;var d=0;d=a+480|0;b=c[d>>2]|b;c[d>>2]=b;d=a+432|0;if(!(c[d>>2]|0))return;if(!(c[a+476>>2]&b))return;c[d>>2]=0;return}function Ff(a,b){a=a|0;b=b|0;a=a+480|0;c[a>>2]=c[a>>2]&~b;return}function Gf(a){a=a|0;return c[a+480>>2]|0}function Hf(a){a=a|0;return c[a+432>>2]|0}function If(a){a=a|0;return c[a+472>>2]|0}function Jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=b+d|0;d=0;do{f=a+2580+(d<<3)|0;g=c[f>>2]|0;if((g|0)!=-1?(g=(c[a+2580+(d<<3)+4>>2]|0)+g|0,g>>>0>=b>>>0&e>>>0>g>>>0):0)c[f>>2]=-1;d=d+1|0}while((d|0)!=256);return}function Kf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+16|0;q=v;r=v+12|0;s=v+8|0;if(!f){l=v;return}t=21576;t=ei(c[t>>2]|0,c[t+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;u=y;c[5393]=f;h=c[5407]&c[5408];if(h){switch(a[21566]|0){case 3:{if(!(c[5399]&8))f=0;else f=~c[5410];break}case 1:{f=(c[5399]&2|0)==0?~c[5410]:-1;break}default:f=-1}f=f&h;if(f){g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Lf(g|-2147483648,0);c[5393]=(c[5393]|0)+-1}else i=12}else i=12;a:do if((i|0)==12){c[5397]=-1;c[5322]=0;c[5323]=0;c[5324]=c[5289];f=0;h=0;b:while(1){if(f>>>0<(c[5323]|0)>>>0)f=e[f+2>>1]<<16|e[f>>1];else{i=(c[5324]|0)+h|0;c[5289]=i;if((c[5393]|0)<1){i=40;break}h=c[5407]&c[5408];if(h|0){switch(a[21566]|0){case 3:{if(!(c[5399]&8))f=0;else f=~c[5410];break}case 1:{f=(c[5399]&2|0)==0?~c[5410]:-1;break}default:f=-1}f=f&h;if(f|0){i=21;break}}f=i>>>12&255;if((c[25780+(f<<3)>>2]|0)==(i&-4096|0)){f=(c[25780+(f<<3)+4>>2]|0)+i|0;h=f;c[s>>2]=h}else{if(Mf(s,i)|0){i=39;break}f=c[s>>2]|0;h=f}c[5322]=f;p=4094-(i&4095)|0;c[5323]=h+p;c[5324]=i-f;f=e[h>>1]|0;if((p|0)<=0){if((f&3|0)==3){h=i+2|0;i=h>>>12&255;if((c[25780+(i<<3)>>2]|0)==(h&-4096|0)){h=(c[25780+(i<<3)+4>>2]|0)+h|0;c[q>>2]=h}else{if(Mf(q,h)|0){i=35;break}h=c[q>>2]|0}f=e[h>>1]<<16|f}}else f=e[h+2>>1]<<16|f}h=(c[5393]|0)+-1|0;c[5393]=h;j=f>>>7;p=j&31;k=f>>>15&31;m=f>>>20;o=m&31;c:do switch(f&127){case 124:case 120:case 116:case 112:case 108:case 104:case 100:case 96:case 92:case 88:case 84:case 80:case 76:case 72:case 68:case 64:case 60:case 56:case 52:case 48:case 44:case 40:case 36:case 32:case 28:case 24:case 20:case 16:case 12:case 8:case 4:case 0:{h=f>>>2;k=h&7|8;d:do switch(f>>>13&7){case 0:{h=j&48|f>>>1&960|f>>>4&4|h&8;if(!h){i=494;break b}c[21160+(k<<2)>>2]=(c[5292]|0)+h;break}case 1:{if(!(a[21567]|0)){i=494;break b}f=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f<<1&192)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4089|0)){h=(c[21684+(h<<3)+4>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Nf(21152,q,f,3)|0){i=52;break b}h=q;f=c[h>>2]|0;h=c[h+4>>2]|0}p=21304+(k<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 2:{f=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=58;break b}f=c[q>>2]|0}c[21160+(k<<2)>>2]=f;break}case 3:{if(!(a[21567]|0)){i=494;break b}f=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=65;break b}f=c[q>>2]|0}p=21304+(k<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 5:{if(!(a[21567]|0)){i=494;break b}j=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f<<1&192)|0;h=21304+(k<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;if((c[23732+(i<<3)>>2]|0)!=(j&-4089|0))if(!(Of(21152,j,f,h,3)|0))break d;else{i=496;break b}else{p=(c[23732+(i<<3)+4>>2]|0)+j|0;c[p>>2]=f;c[p+4>>2]=h;break d}}case 6:{i=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;f=c[21160+(k<<2)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break d;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break d}}case 7:{if(!(a[21567]|0)){i=494;break b}i=(c[21160+((j&7|8)<<2)>>2]|0)+(j&56|f>>>4&4|f<<1&64)|0;f=c[21304+(k<<3)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break d;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break d}}default:{i=494;break b}}while(0);f=(c[5322]|0)+2|0;c[5322]=f;h=f;break}case 125:case 121:case 117:case 113:case 109:case 105:case 101:case 97:case 93:case 89:case 85:case 81:case 77:case 73:case 69:case 65:case 61:case 57:case 53:case 49:case 45:case 41:case 37:case 33:case 29:case 25:case 21:case 17:case 13:case 9:case 5:case 1:{e:do switch(f>>>13&7){case 0:{h=21160+(p<<2)|0;if(p|0)c[h>>2]=(c[h>>2]|0)+((j&32|f>>>2&31)<<26>>26);break}case 1:{h=f>>>1;p=(c[5324]|0)+(c[5322]|0)|0;c[5291]=p+2;h=p+((h&2048|j&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}case 2:{if(p|0)c[21160+(p<<2)>>2]=(j&32|f>>>2&31)<<26>>26;break}case 3:{switch(j&31){case 0:break e;case 2:break;default:{c[21160+(p<<2)>>2]=(f<<19&-2147483648|f<<24&2080374784)>>14;break e}}h=f>>>3&512|f>>>2&16|f<<1&64|f<<4&384|f<<3&32;if(!h){i=494;break b}c[5292]=(c[5292]|0)+(h<<22>>22);break}case 4:{i=f>>>10;k=j&7|8;switch(i&3){case 1:case 0:{p=j&32;j=p|f>>>2&31;if(p|0){i=494;break b}h=21160+(k<<2)|0;i=c[h>>2]|0;if(!(f&3072)){c[h>>2]=i>>>j;break e}else{c[h>>2]=i>>j;break e}}case 2:{p=21160+(k<<2)|0;c[p>>2]=c[p>>2]&(j&32|f>>>2&31)<<26>>26;break e}case 3:{h=f>>>2&7|8;switch((f>>>5&3|i&4)&7){case 0:{p=21160+(k<<2)|0;c[p>>2]=(c[p>>2]|0)-(c[21160+(h<<2)>>2]|0);break e}case 1:{p=21160+(k<<2)|0;c[p>>2]=c[21160+(h<<2)>>2]^c[p>>2];break e}case 2:{p=21160+(k<<2)|0;c[p>>2]=c[21160+(h<<2)>>2]|c[p>>2];break e}case 3:{p=21160+(k<<2)|0;c[p>>2]=c[21160+(h<<2)>>2]&c[p>>2];break e}default:{i=494;break b}}}default:{i=105;break b}}}case 5:{h=f>>>1;h=(c[5322]|0)+((h&2048|j&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}case 6:{if(!(c[21160+((j&7|8)<<2)>>2]|0)){h=(c[5322]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}break}case 7:{if(c[21160+((j&7|8)<<2)>>2]|0){h=(c[5322]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}break}default:{i=490;break b}}while(0);f=(c[5322]|0)+2|0;c[5322]=f;h=f;break}case 126:case 122:case 118:case 114:case 110:case 106:case 102:case 98:case 94:case 90:case 86:case 82:case 78:case 74:case 70:case 66:case 62:case 58:case 54:case 50:case 46:case 42:case 38:case 34:case 30:case 26:case 22:case 18:case 14:case 10:case 6:case 2:{h=f>>>2;k=h&31;f:do switch(f>>>13&7){case 0:{h=j&32;if(h|0){i=494;break b}f=21160+(p<<2)|0;if(p|0)c[f>>2]=c[f>>2]<<(h|k);break}case 1:{if(!(a[21567]|0)){i=494;break b}f=(c[5292]|0)+(j&32|h&24|f<<4&448)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4089|0)){h=(c[21684+(h<<3)+4>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Nf(21152,q,f,3)|0){i=117;break b}h=q;f=c[h>>2]|0;h=c[h+4>>2]|0}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 2:{f=(c[5292]|0)+(j&32|h&28|f<<4&192)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=124;break b}f=c[q>>2]|0}if(p|0)c[21160+(p<<2)>>2]=f;break}case 3:{if(!(a[21567]|0)){i=494;break b}f=(c[5292]|0)+(j&32|h&28|f<<4&192)|0;h=f>>>12&255;if((c[21684+(h<<3)>>2]|0)==(f&-4093|0))f=c[(c[21684+(h<<3)+4>>2]|0)+f>>2]|0;else{if(Nf(21152,q,f,2)|0){i=131;break b}f=c[q>>2]|0}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 4:{h=(k|0)==0;i=(p|0)==0;if(!(f&4096))if(h){if(i){i=494;break b}h=c[21160+(p<<2)>>2]&-2;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}else{if(i)break f;c[21160+(p<<2)>>2]=c[21160+(k<<2)>>2];break f}else if(h){if(i){i=140;break b}f=(c[5322]|0)+2+(c[5324]|0)|0;h=c[21160+(p<<2)>>2]&-2;c[5289]=h;c[5291]=f;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}else{f=21160+(p<<2)|0;if(i)break f;c[f>>2]=(c[21160+(k<<2)>>2]|0)+(c[f>>2]|0);break f}}case 5:{if(!(a[21567]|0)){i=494;break b}j=(c[5292]|0)+(j&56|f>>>1&448)|0;h=21304+(k<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;if((c[23732+(i<<3)>>2]|0)!=(j&-4089|0))if(!(Of(21152,j,f,h,3)|0))break f;else{i=496;break b}else{p=(c[23732+(i<<3)+4>>2]|0)+j|0;c[p>>2]=f;c[p+4>>2]=h;break f}}case 6:{i=(c[5292]|0)+(j&60|f>>>1&192)|0;f=c[21160+(k<<2)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break f;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break f}}case 7:{if(!(a[21567]|0)){i=494;break b}i=(c[5292]|0)+(j&60|f>>>1&192)|0;f=c[21304+(k<<3)>>2]|0;h=i>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,f,0,2)|0))break f;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+i>>2]=f;break f}}default:{i=491;break b}}while(0);f=(c[5322]|0)+2|0;c[5322]=f;h=f;break}case 55:{if(p|0)c[21160+(p<<2)>>2]=f&-4096;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 23:{if(p|0)c[21160+(p<<2)>>2]=(c[5322]|0)+(f&-4096)+(c[5324]|0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 111:{if(p|0)c[21160+(p<<2)>>2]=(c[5322]|0)+4+(c[5324]|0);h=(c[5322]|0)+((m&2046|f&1044480|f>>>11&1048576|f>>>9&2048)<<11>>11)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break}case 103:{h=c[5322]|0;i=c[5324]|0;f=(c[21160+(k<<2)>>2]|0)+(f>>20)&-2;c[5289]=f;if(p|0)c[21160+(p<<2)>>2]=h+4+i;c[5322]=0;c[5323]=0;c[5324]=f;h=0;f=0;break}case 99:{switch(f>>>13&3){case 0:{h=(c[21160+(k<<2)>>2]|0)==(c[21160+(o<<2)>>2]|0);break}case 2:{h=(c[21160+(k<<2)>>2]|0)<(c[21160+(o<<2)>>2]|0);break}case 3:{h=(c[21160+(k<<2)>>2]|0)>>>0<(c[21160+(o<<2)>>2]|0)>>>0;break}default:{i=494;break b}}if((f&4096|0)!=0^h){h=(c[5322]|0)+((f>>>19&4096|m&2016|j&30|f<<4&2048)<<19>>19)+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}else{f=(c[5322]|0)+4|0;c[5322]=f;h=f;break c}}case 3:{h=(c[21160+(k<<2)>>2]|0)+(f>>20)|0;g:do switch(f>>>12&7){case 0:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4096|0))f=a[(c[21684+(f<<3)+4>>2]|0)+h>>0]|0;else{if(Nf(21152,q,h,0)|0){i=181;break b}f=c[q>>2]&255}f=f<<24>>24;break}case 1:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4095|0))f=b[(c[21684+(f<<3)+4>>2]|0)+h>>1]|0;else{if(Nf(21152,q,h,1)|0){i=187;break b}f=c[q>>2]&65535}f=f<<16>>16;break}case 2:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4093|0)){f=c[(c[21684+(f<<3)+4>>2]|0)+h>>2]|0;break g}if(Nf(21152,q,h,2)|0){i=192;break b}f=c[q>>2]|0;break}case 4:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4096|0))f=a[(c[21684+(f<<3)+4>>2]|0)+h>>0]|0;else{if(Nf(21152,q,h,0)|0){i=198;break b}f=c[q>>2]&255}f=f&255;break}case 5:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4095|0))f=b[(c[21684+(f<<3)+4>>2]|0)+h>>1]|0;else{if(Nf(21152,q,h,1)|0){i=204;break b}f=c[q>>2]&65535}f=f&65535;break}default:{i=494;break b}}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 35:{i=(c[21160+(k<<2)>>2]|0)+((p|m&4064)<<20>>20)|0;h=c[21160+(o<<2)>>2]|0;h:do switch(f>>>12&7){case 0:{f=i>>>12&255;if((c[23732+(f<<3)>>2]|0)!=(i&-4096|0))if(!(Of(21152,i,h&255,0,0)|0))break h;else{i=496;break b}else{a[(c[23732+(f<<3)+4>>2]|0)+i>>0]=h;break h}}case 1:{f=i>>>12&255;if((c[23732+(f<<3)>>2]|0)!=(i&-4095|0))if(!(Of(21152,i,h&65535,0,1)|0))break h;else{i=496;break b}else{b[(c[23732+(f<<3)+4>>2]|0)+i>>1]=h;break h}}case 2:{f=i>>>12&255;if((c[23732+(f<<3)>>2]|0)!=(i&-4093|0))if(!(Of(21152,i,h,0,2)|0))break h;else{i=496;break b}else{c[(c[23732+(f<<3)+4>>2]|0)+i>>2]=h;break h}}default:{i=494;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 19:{h=f>>20;i:do switch(f>>>12&7){case 0:{f=(c[21160+(k<<2)>>2]|0)+h|0;break}case 1:{if(h>>>0>31){i=494;break b}f=c[21160+(k<<2)>>2]<<(h&31);break}case 2:{f=(c[21160+(k<<2)>>2]|0)<(h|0)&1;break}case 3:{f=(c[21160+(k<<2)>>2]|0)>>>0<h>>>0&1;break}case 4:{f=c[21160+(k<<2)>>2]^h;break}case 5:{if(h&-1056|0){i=494;break b}i=c[21160+(k<<2)>>2]|0;h=h&31;if(!(f&1073741824)){f=i>>>h;break i}else{f=i>>h;break i}}case 6:{f=c[21160+(k<<2)>>2]|h;break}default:f=c[21160+(k<<2)>>2]&h}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 51:{i=c[21160+(k<<2)>>2]|0;h=c[21160+(o<<2)>>2]|0;c[r>>2]=h;j:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{f=N(h,i)|0;break j}case 1:{ki(h|0,((h|0)<0)<<31>>31|0,i|0,((i|0)<0)<<31>>31|0)|0;f=y;break j}case 2:{ki(h|0,0,i|0,((i|0)<0)<<31>>31|0)|0;f=y;break j}case 3:{ki(h|0,0,i|0,0)|0;f=y;break j}case 4:{if(!h){f=-1;break j}if((i|0)==-2147483648&(h|0)==-1){f=-2147483648;break j}f=(i|0)/(h|0)|0;break j}case 5:{if(!h){f=-1;break j}f=(i>>>0)/(h>>>0)|0;break j}case 6:{if(!h){f=i;break j}if((i|0)==-2147483648&(h|0)==-1){f=0;break j}f=(i|0)%(h|0)|0;break j}case 7:{if(!h){f=i;break j}f=(i>>>0)%(h>>>0)|0;break j}default:{i=492;break b}}else{if(f&-1107296256|0){i=494;break b}do switch((f>>>12&7|f>>>27&8)&15){case 0:{f=h+i|0;break j}case 8:{f=i-h|0;break j}case 1:{f=i<<(h&31);break j}case 2:{f=(i|0)<(h|0)&1;break j}case 3:{f=i>>>0<h>>>0&1;break j}case 4:{f=h^i;break j}case 5:{f=i>>>(h&31);break j}case 13:{f=i>>(h&31);break j}case 6:{f=h|i;break j}case 7:{f=h&i;break j}default:{i=494;break b}}while(0)}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 115:{if(!(f&16384))i=c[21160+(k<<2)>>2]|0;else i=k;j=f&12288;k:do switch(f>>>12&3){case 1:{o=21576;c[o>>2]=fi(t|0,u|0,h|0,((h|0)<0)<<31>>31|0)|0;c[o+4>>2]=y;if(Pf(r,m,1)|0){i=494;break b}h=Qf(m,i)|0;if((h|0)<0){i=494;break b}if(p|0)c[21160+(p<<2)>>2]=c[r>>2];if((h|0)>0){f=(c[5322]|0)+4+(c[5324]|0)|0;c[5289]=f;if((h|0)!=2)break a;c[5322]=0;c[5323]=0;c[5324]=f;h=0;f=0;break c}break}case 3:case 2:{o=21576;c[o>>2]=fi(t|0,u|0,h|0,((h|0)<0)<<31>>31|0)|0;c[o+4>>2]=y;h=(k|0)!=0;if(Pf(r,m,h&1)|0){i=494;break b}k=c[r>>2]|0;if(h){h=Qf(m,(j|0)==8192?k|i:k&~i)|0;if((h|0)<0){i=494;break b}}else h=0;if(p|0)c[21160+(p<<2)>>2]=k;if((h|0)>0){f=(c[5322]|0)+4+(c[5324]|0)|0;c[5289]=f;if((h|0)!=2)break a;c[5322]=0;c[5323]=0;c[5324]=f;h=0;f=0;break c}break}case 0:{switch(m&4095){case 0:{i=285;break b}case 1:{i=287;break b}case 258:{i=289;break b}case 770:{i=295;break b}case 261:{if((f&32640|0)!=0|(a[21566]|0)==0){i=494;break b}if(!(c[5407]&c[5408])){i=303;break b}else break k}default:{}}if((f&-33521792|0)!=301989888|(a[21566]|0)==0){i=494;break b}if(!k){f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256)}else{f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256)}h=(c[5322]|0)+4+(c[5324]|0)|0;c[5289]=h;c[5322]=0;c[5323]=0;c[5324]=h;h=0;f=0;break c}default:{i=493;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 15:{switch(f>>>12&7){case 0:{if(f&-267387008|0){i=494;break b}break}case 1:{if((f|0)!=4111){i=494;break b}break}default:{i=494;break b}}f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 47:{if((f&28672|0)!=8192){i=494;break b}n=c[21160+(k<<2)>>2]|0;i=f>>>27&255;l:do switch(i&31){case 2:{if(o|0){i=494;break b}f=n>>>12&255;if((c[21684+(f<<3)>>2]|0)==(n&-4093|0))f=c[(c[21684+(f<<3)+4>>2]|0)+n>>2]|0;else{if(Nf(21152,q,n,2)|0){i=323;break b}f=c[q>>2]|0}c[5419]=n;break}case 3:{if((c[5419]|0)==(n|0)){f=c[21160+(o<<2)>>2]|0;h=n>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(n&-4093|0))if(!(Of(21152,n,f,0,2)|0)){f=0;break l}else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+n>>2]=f;f=0;break l}}else f=1;break}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{k=n>>>12&255;m=n&-4093;if((c[21684+(k<<3)>>2]|0)==(m|0))j=c[(c[21684+(k<<3)+4>>2]|0)+n>>2]|0;else{if(Nf(21152,q,n,2)|0){i=333;break b}j=c[q>>2]|0}h=c[21160+(o<<2)>>2]|0;c[r>>2]=h;switch(i&31){case 1:{f=h;break}case 0:{f=h+j|0;c[r>>2]=f;break}case 4:{f=h^j;c[r>>2]=f;break}case 12:{f=h&j;c[r>>2]=f;break}case 8:{f=h|j;c[r>>2]=f;break}case 16:{if((j|0)<(h|0)){c[r>>2]=j;f=j}else f=h;break}case 20:{if((j|0)>(h|0)){c[r>>2]=j;f=j}else f=h;break}case 24:{if(j>>>0<h>>>0){c[r>>2]=j;f=j}else f=h;break}case 28:{if(j>>>0>h>>>0){c[r>>2]=j;f=j}else f=h;break}default:{i=494;break b}}if((c[23732+(k<<3)>>2]|0)!=(m|0))if(!(Of(21152,n,f,0,2)|0)){f=j;break l}else{i=496;break b}else{c[(c[23732+(k<<3)+4>>2]|0)+n>>2]=f;f=j;break l}}default:{i=494;break b}}while(0);if(p|0)c[21160+(p<<2)>>2]=f;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 7:{if(!(a[21567]|0)){i=494;break b}h=(c[21160+(k<<2)>>2]|0)+(f>>20)|0;m:do switch(f>>>12&7){case 2:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4093|0))f=c[(c[21684+(f<<3)+4>>2]|0)+h>>2]|0;else{if(Nf(21152,q,h,2)|0){i=360;break b}f=c[q>>2]|0}h=-1;break}case 3:{f=h>>>12&255;if((c[21684+(f<<3)>>2]|0)==(h&-4089|0)){h=(c[21684+(f<<3)+4>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break m}if(Nf(21152,q,h,3)|0){i=365;break b}h=q;f=c[h>>2]|0;h=c[h+4>>2]|0;break}default:{i=494;break b}}while(0);p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 39:{if(!(a[21567]|0)){i=494;break b}j=(c[21160+(k<<2)>>2]|0)+((p|m&4064)<<20>>20)|0;n:do switch(f>>>12&7){case 2:{f=c[21304+(o<<3)>>2]|0;h=j>>>12&255;if((c[23732+(h<<3)>>2]|0)!=(j&-4093|0))if(!(Of(21152,j,f,0,2)|0))break n;else{i=496;break b}else{c[(c[23732+(h<<3)+4>>2]|0)+j>>2]=f;break n}}case 3:{h=21304+(o<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;if((c[23732+(i<<3)>>2]|0)!=(j&-4089|0))if(!(Of(21152,j,f,h,3)|0))break n;else{i=496;break b}else{p=(c[23732+(i<<3)+4>>2]|0)+j|0;c[p>>2]=f;c[p+4>>2]=h;break n}}default:{i=494;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 67:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]|0,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 71:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]^-2147483648,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 75:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]^-2147483648,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]|0,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]^-2147483648,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 79:{if(!(a[21567]|0)){i=494;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21564]|0:h>>>0>4?-1:h;if((h|0)<0){i=494;break b}switch(f>>>25&3){case 0:{f=Gb(c[21304+(k<<3)>>2]^-2147483648,c[21304+(o<<3)>>2]|0,c[21304+(i<<3)>>2]^-2147483648,h,21560)|0;h=-1;break}case 1:{n=21304+(k<<3)|0;o=21304+(o<<3)|0;f=21304+(i<<3)|0;f=Yb(c[n>>2]|0,c[n+4>>2]^-2147483648,c[o>>2]|0,c[o+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}case 83:{if(!(a[21567]|0)){i=494;break b}h=f>>>12;i=h&7;do switch(f>>>25&127){case 0:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Cb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 4:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Eb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 8:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Fb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 12:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Hb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 44:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((o|0)!=0|(h|0)<0){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=Ib(c[21304+(k<<3)>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 16:{switch(h&7){case 0:{h=21304+(o<<3)|0;f=c[h>>2]&-2147483648|c[21304+(k<<3)>>2]&2147483647;h=c[h+4>>2]|0;break}case 1:{h=21304+(o<<3)|0;f=(c[h>>2]&-2147483648|c[21304+(k<<3)>>2]&2147483647)^-2147483648;h=~c[h+4>>2];break}case 2:{h=21304+(k<<3)|0;o=21304+(o<<3)|0;f=c[o>>2]&-2147483648^c[h>>2];h=c[o+4>>2]^c[h+4>>2];break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 20:{switch(h&7){case 0:{f=Jb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560,2)|0;break}case 1:{f=Kb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560,2)|0;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 96:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=Pb(c[21304+(k<<3)>>2]|0,h,21560)|0;break}case 1:{f=Rb(c[21304+(k<<3)>>2]|0,h,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 80:{switch(h&7){case 0:{f=Mb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560)|0;break}case 1:{f=Nb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560)|0;break}case 2:{f=Lb(c[21304+(k<<3)>>2]|0,c[21304+(o<<3)>>2]|0,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 104:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=Sb(c[21160+(k<<2)>>2]|0,h,21560)|0;break}case 1:{f=Tb(c[21160+(k<<2)>>2]|0,h,21560)|0;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=-1;a[21567]=3;break}case 32:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if(!((o|0)==1&(h|0)>-1)){i=494;break b}o=21304+(k<<3)|0;p=21304+(p<<3)|0;c[p>>2]=gc(c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=-1;a[21567]=3;break}case 112:{if(o|0){i=494;break b}switch(h&7){case 0:{f=c[21304+(k<<3)>>2]|0;break}case 1:{f=Ob(c[21304+(k<<3)>>2]|0)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 120:{if(o|i|0){i=494;break b}o=c[21160+(k<<2)>>2]|0;p=21304+(p<<3)|0;c[p>>2]=o;c[p+4>>2]=((o|0)<0)<<31>>31;a[21567]=3;break}case 1:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Ub(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 5:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Wb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 9:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Xb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 13:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}n=21304+(k<<3)|0;o=21304+(o<<3)|0;p=21304+(p<<3)|0;c[p>>2]=Zb(c[n>>2]|0,c[n+4>>2]|0,c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 45:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((o|0)!=0|(h|0)<0){i=494;break b}o=21304+(k<<3)|0;p=21304+(p<<3)|0;c[p>>2]=_b(c[o>>2]|0,c[o+4>>2]|0,h,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 17:{switch(h&7){case 0:{f=21304+(k<<3)|0;h=c[f>>2]|0;f=c[21304+(o<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647;break}case 1:{f=21304+(k<<3)|0;h=c[f>>2]|0;f=(c[21304+(o<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647)^-2147483648;break}case 2:{f=21304+(k<<3)|0;h=c[f>>2]|0;f=c[21304+(o<<3)+4>>2]&-2147483648^c[f+4>>2];break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=h;c[p+4>>2]=f;a[21567]=3;break}case 21:{switch(h&7){case 0:{h=21304+(k<<3)|0;f=21304+(o<<3)|0;f=$b(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560,2)|0;h=y;break}case 1:{h=21304+(k<<3)|0;f=21304+(o<<3)|0;f=ac(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560,2)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 97:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=21304+(k<<3)|0;f=hc(c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;break}case 1:{f=21304+(k<<3)|0;f=jc(c[f>>2]|0,c[f+4>>2]|0,h,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 81:{switch(h&7){case 0:{n=21304+(k<<3)|0;f=21304+(o<<3)|0;f=cc(c[n>>2]|0,c[n+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560)|0;break}case 1:{n=21304+(k<<3)|0;f=21304+(o<<3)|0;f=dc(c[n>>2]|0,c[n+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560)|0;break}case 2:{n=21304+(k<<3)|0;f=21304+(o<<3)|0;f=bc(c[n>>2]|0,c[n+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21560)|0;break}default:{i=494;break b}}if(p|0)c[21160+(p<<2)>>2]=f;break}case 105:{h=(i|0)==7?d[21564]|0:i>>>0>4?-1:i;if((h|0)<0){i=494;break b}switch(m&31){case 0:{f=kc(c[21160+(k<<2)>>2]|0,h,21560)|0;h=y;break}case 1:{f=lc(c[21160+(k<<2)>>2]|0,h,21560)|0;h=y;break}default:{i=494;break b}}p=21304+(p<<3)|0;c[p>>2]=f;c[p+4>>2]=h;a[21567]=3;break}case 33:{if(!((o|0)==0&((i|0)==7|i>>>0<5))){i=494;break b}p=21304+(p<<3)|0;c[p>>2]=fc(c[21304+(k<<3)>>2]|0,21560)|0;c[p+4>>2]=y;a[21567]=3;break}case 113:{if(!((o|0)==0&(i|0)==1)){i=494;break b}f=21304+(k<<3)|0;f=ec(c[f>>2]|0,c[f+4>>2]|0)|0;if(p|0)c[21160+(p<<2)>>2]=f;break}default:{i=494;break b}}while(0);f=(c[5322]|0)+4|0;c[5322]=f;h=f;break}default:{i=494;break b}}while(0)}switch(i|0){case 21:{g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Lf(g|-2147483648,0);c[5393]=(c[5393]|0)+-1;i=40;break}case 35:{i=39;break}case 52:{i=496;break}case 58:{i=496;break}case 65:{i=496;break}case 105:break;case 117:{i=496;break}case 124:{i=496;break}case 131:{i=496;break}case 140:{c[5397]=3;g=3;i=495;break}case 181:{i=496;break}case 187:{i=496;break}case 192:{i=496;break}case 198:{i=496;break}case 204:{i=496;break}case 285:{if(!(f&1048448)){g=(d[21566]|0)+8|0;c[5397]=g;i=495}else i=494;break}case 287:{if(!(f&1048448)){c[5397]=3;g=3;i=495}else i=494;break}case 289:{g=a[21566]|0;if((f&1048448|0)!=0|g<<24>>24==0)i=494;else{c[5289]=(c[5324]|0)+(c[5322]|0);s=c[5399]|0;f=s>>>8&1;c[5399]=(s>>>5&1)<<f&-289|(1<<f^-289)&s|32;if((f|0)!=(g&255|0)){g=0;do{c[21684+(g<<3)>>2]=-1;c[23732+(g<<3)>>2]=-1;c[25780+(g<<3)>>2]=-1;g=g+1|0}while((g|0)!=256);a[21566]=f}c[5289]=c[5414];break a}break}case 295:{g=a[21566]|0;if((f&1048448|0)!=0|(g&255)<3)i=494;else{c[5289]=(c[5324]|0)+(c[5322]|0);s=c[5399]|0;f=s>>>11&3;c[5399]=(s>>>7&1)<<f&-6273|(1<<f^-6273)&s|128;if((f|0)!=(g&255|0)){g=0;do{c[21684+(g<<3)>>2]=-1;c[23732+(g<<3)>>2]=-1;c[25780+(g<<3)>>2]=-1;g=g+1|0}while((g|0)!=256);a[21566]=f}c[5289]=c[5402];break a}break}case 303:{c[5396]=1;c[5289]=(c[5322]|0)+4+(c[5324]|0);break a}case 323:{i=496;break}case 333:{i=496;break}case 360:{i=496;break}case 365:{i=496;break}case 490:break;case 491:break;case 492:break;case 493:break}if((i|0)==39)i=496;else if((i|0)==40)break;else if((i|0)==494){c[5397]=2;c[5398]=f;g=2;i=495}if((i|0)==495)c[5289]=(c[5324]|0)+(c[5322]|0);else if((i|0)==496){g=c[5397]|0;c[5289]=(c[5324]|0)+(c[5322]|0);if((g|0)<=-1)break}c[5393]=(c[5393]|0)+-1;Lf(g,c[5398]|0)}while(0);s=c[5393]|0;t=fi(t|0,u|0,s|0,((s|0)<0)<<31>>31|0)|0;u=21576;c[u>>2]=t;c[u+4>>2]=y;l=v;return}function Lf(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;h=a[21566]|0;do if((h&255)<2)if((b|0)<0){g=(c[5410]|0)>>>(b&31)&1;f=b&2147483647;i=6;break}else{f=b&2147483647;g=(c[5409]|0)>>>b&1;i=7;break}else{f=b&2147483647;if((b|0)<0){g=0;i=6}}while(0);if((i|0)==6){f=1<<(d[21565]|0)+-1|f;i=7}if((i|0)==7)if(g){c[5415]=f;c[5414]=c[5289];c[5416]=e;e=c[5399]|0;i=h&255;c[5399]=e&-291|i<<8|e>>>i<<5&32;if(h<<24>>24==1){i=21648;i=c[i>>2]|0;c[5289]=i;return}f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256);a[21566]=1;i=21648;i=c[i>>2]|0;c[5289]=i;return}c[5403]=f;c[5402]=c[5289];c[5404]=e;e=c[5399]|0;i=h&255;c[5399]=e&-6281|i<<11|e>>>i<<7&128;if(h<<24>>24==3){i=21600;i=c[i>>2]|0;c[5289]=i;return}f=0;do{c[21684+(f<<3)>>2]=-1;c[23732+(f<<3)>>2]=-1;c[25780+(f<<3)>>2]=-1;f=f+1|0}while((f|0)!=256);a[21566]=3;i=21600;i=c[i>>2]|0;c[5289]=i;return}function Mf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=l;l=l+16|0;d=f;if(Rf(21152,d,b,2)|0){c[5398]=b;c[5397]=12;b=-1;l=f;return b|0}d=c[d>>2]|0;e=ff(c[5420]|0,d,0)|0;if(e|0?c[e+32>>2]|0:0){g=b>>>12&255;e=(c[e+40>>2]|0)+(d-(c[e+8>>2]|0))|0;c[25780+(g<<3)>>2]=b&-4096;c[25780+(g<<3)+4>>2]=e-b;c[a>>2]=e;b=0;l=f;return b|0}c[5398]=b;c[5397]=1;g=-1;l=f;return g|0}function Nf(b,f,g,h){b=b|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;i=q+8|0;m=1<<h;o=m+-1&g;a:do if(!o){if(Rf(b,i,g,0)|0){c[b+440>>2]=g;c[b+436>>2]=13;f=-1;l=q;return f|0}i=c[i>>2]|0;k=ff(c[b+528>>2]|0,i,0)|0;if(!k){f=0;l=q;return f|0}if(!(c[k+32>>2]|0)){j=i-(c[k+8>>2]|0)|0;i=c[k+76>>2]|0;if(i&m|0){n=Xa[c[k+68>>2]&31](c[k+64>>2]|0,j,h)|0;j=0;break}if(!((h|0)==3&(i&4|0)!=0)){n=0;j=0;break}b=k+68|0;p=k+64|0;n=Xa[c[b>>2]&31](c[p>>2]|0,j,2)|0;j=Xa[c[b>>2]&31](c[p>>2]|0,j+4|0,2)|0;break}p=g>>>12&255;i=(c[k+40>>2]|0)+(i-(c[k+8>>2]|0))|0;c[b+532+(p<<3)>>2]=g&-4096;c[b+532+(p<<3)+4>>2]=i-g;switch(h|0){case 0:{n=d[i>>0]|0;j=0;break a}case 1:{n=e[i>>1]|0;j=0;break a}case 2:{n=c[i>>2]|0;j=0;break a}case 3:{j=i;n=c[j>>2]|0;j=c[j+4>>2]|0;break a}default:ra()}}else switch(h|0){case 1:{i=g>>>12&255;do if((c[b+532+(i<<3)>>2]|0)==(g&-4096|0))k=a[(c[b+532+(i<<3)+4>>2]|0)+g>>0]|0;else{i=Nf(b,p,g,0)|0;if(!i){k=c[p>>2]&255;break}f=i;l=q;return f|0}while(0);i=g+1|0;j=i>>>12&255;do if((c[b+532+(j<<3)>>2]|0)==(i&-4096|0))i=a[(c[b+532+(j<<3)+4>>2]|0)+i>>0]|0;else{i=Nf(b,p,i,0)|0;if(!i){i=c[p>>2]&255;break}f=i;l=q;return f|0}while(0);n=(i&255)<<8|k&255;j=0;break a}case 2:{j=g-o|0;i=j>>>12&255;do if((c[b+532+(i<<3)>>2]|0)==(j&-4093|0))m=c[(c[b+532+(i<<3)+4>>2]|0)+j>>2]|0;else{i=Nf(b,p,j,2)|0;if(!i){m=c[p>>2]|0;break}f=i;l=q;return f|0}while(0);i=j+4|0;j=i>>>12&255;do if((c[b+532+(j<<3)>>2]|0)!=(i&-4093|0)){i=Nf(b,p,i,2)|0;if(!i){k=c[p>>2]|0;i=0;break}else{k=0;break}}else{k=c[(c[b+532+(j<<3)+4>>2]|0)+i>>2]|0;i=0}while(0);j=o<<3;if(!i){n=k<<32-j|m>>>j;j=0;break a}l=q;return i|0}case 3:{j=g-o|0;i=j>>>12&255;do if((c[b+532+(i<<3)>>2]|0)==(j&-4089|0)){m=(c[b+532+(i<<3)+4>>2]|0)+j|0;k=c[m>>2]|0;m=c[m+4>>2]|0}else{i=Nf(b,p,j,3)|0;if(!i){m=p;k=c[m>>2]|0;m=c[m+4>>2]|0;break}f=i;l=q;return f|0}while(0);i=j+8|0;j=i>>>12&255;do if((c[b+532+(j<<3)>>2]|0)!=(i&-4089|0)){i=Nf(b,p,i,3)|0;if(!i){n=p;i=0;j=c[n>>2]|0;n=c[n+4>>2]|0;break}else{j=0;n=0;break}}else{n=(c[b+532+(j<<3)+4>>2]|0)+i|0;i=0;j=c[n>>2]|0;n=c[n+4>>2]|0}while(0);p=o<<3;k=ni(k|0,m|0,p|0)|0;m=y;j=oi(j|0,n|0,64-p|0)|0;if(!i){n=j|k;j=y|m;break a}l=q;return i|0}default:ra()}while(0);c[f>>2]=n;c[f+4>>2]=j;f=0;l=q;return f|0} +function wh(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function xh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;ri(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function yh(a,b){a=a|0;b=b|0;return zh(a,b,(Pg(a)|0)+1|0)|0}function zh(b,c,d){b=b|0;c=c|0;d=d|0;a:do if(!d)d=0;else{c=c&255;while(1){d=d+-1|0;if((a[b+d>>0]|0)==c<<24>>24)break;if(!d){d=0;break a}}d=b+d|0}while(0);return d|0}function Ah(a){a=a|0;var b=0,c=0;b=(Pg(a)|0)+1|0;c=Ag(b)|0;if(!c)a=0;else a=ri(c|0,a|0,b|0)|0;return a|0}function Bh(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=Tg(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=Ch(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=Dh(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=Eh(b,c)|0;break}else{b=Fh(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function Ch(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c>>0]|0)<<8|(d[c+1>>0]|0);c=b+1|0;e=a[c>>0]|0;a:do if(!(e<<24>>24))c=0;else{e=(d[b>>0]|0)<<8|e&255;while(1){b=e&65535;if((b|0)==(f|0))break;c=c+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){c=0;break a}else e=b<<8|e&255}c=c+-1|0}while(0);return c|0}function Dh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=(b|c&255)<<8;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-2|0)|0}function Eh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);e=b+3|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|c&255;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=b<<8|c&255;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-3|0)|0}function Fh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+1056|0;v=x+1024|0;w=x;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;c[v+24>>2]=0;c[v+28>>2]=0;f=a[e>>0]|0;a:do if(f<<24>>24){q=0;do{if(!(a[b+q>>0]|0)){f=0;break a}u=f&255;t=v+(u>>>5<<2)|0;c[t>>2]=c[t>>2]|1<<(u&31);q=q+1|0;c[w+(u<<2)>>2]=q;f=a[e+q>>0]|0}while(f<<24>>24!=0);n=q>>>0>1;if(n){k=1;j=1;m=0;i=-1;o=1;while(1){f=a[e+(j+i)>>0]|0;g=a[e+o>>0]|0;do if(f<<24>>24==g<<24>>24)if((j|0)==(k|0)){h=k;f=1;g=k+m|0;break}else{h=k;f=j+1|0;g=m;break}else if((f&255)>(g&255)){h=o-i|0;f=1;g=o;break}else{h=1;f=1;g=m+1|0;i=m;break}while(0);o=f+g|0;if(o>>>0>=q>>>0)break;else{k=h;j=f;m=g}}if(n){n=1;m=1;o=0;g=-1;p=1;while(1){f=a[e+(m+g)>>0]|0;j=a[e+p>>0]|0;do if(f<<24>>24==j<<24>>24)if((m|0)==(n|0)){f=n;j=1;k=n+o|0;break}else{f=n;j=m+1|0;k=o;break}else if((f&255)<(j&255)){f=p-g|0;j=1;k=p;break}else{f=1;j=1;k=o+1|0;g=o;break}while(0);p=j+k|0;if(p>>>0>=q>>>0){u=q;j=25;break}else{n=f;m=j;o=k}}}else{u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=0;f=1;g=-1;j=25}while(0);b:do if((j|0)==25){s=(g+1|0)>>>0>(i+1|0)>>>0;f=s?f:h;s=s?g:i;t=s+1|0;if(!(Gh(e,e+f|0,t)|0)){n=u-f|0;r=n;m=f}else{n=u-s+-1|0;n=(s>>>0>n>>>0?s:n)+1|0;r=0;m=n;n=u-n|0}o=u|63;p=u+-1|0;q=(r|0)!=0;f=b;k=0;g=b;while(1){h=f;do if((g-h|0)>>>0<u>>>0){i=Ug(g,0,o)|0;if(i)if((i-h|0)>>>0<u>>>0){f=0;break b}else break;else{i=g+o|0;break}}else i=g;while(0);g=d[f+p>>0]|0;c:do if(!(1<<(g&31)&c[v+(g>>>5<<2)>>2])){h=0;g=u}else{g=u-(c[w+(g<<2)>>2]|0)|0;if(g|0){h=0;g=q&(k|0)!=0&g>>>0<m>>>0?n:g;break}j=t>>>0>k>>>0;g=j?t:k;h=a[e+g>>0]|0;d:do if(h<<24>>24){while(1){if(h<<24>>24!=(a[f+g>>0]|0))break;g=g+1|0;h=a[e+g>>0]|0;if(!(h<<24>>24))break d}h=0;g=g-s|0;break c}while(0);if(!j)break b;g=t;while(1){g=g+-1|0;if((a[e+g>>0]|0)!=(a[f+g>>0]|0)){h=r;g=m;break c}if(g>>>0<=k>>>0)break b}}while(0);f=f+g|0;k=h;g=i}}while(0);l=x;return f|0}function Gh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function Hh(a,b,c){a=a|0;b=b|0;c=c|0;c=Kh(a,b,c,-1,0)|0;return c|0}function Ih(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=Jh(a,b,f)|0;l=e;return d|0}function Jh(a,b,c){a=a|0;b=b|0;c=c|0;return Xg(a,2147483647,b,c)|0}function Kh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;Lh(h,0);d=Mh(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function Lh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=e+b;else c[a+100>>2]=d;return}function Mh(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(Jg()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0}while((Oh(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=Nh(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0;if((i|32|0)!=120)if(j){o=8;n=47;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0;if((d[12689+i>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){Lh(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{o=16;n=47}}else{e=j?10:e;if(e>>>0>(d[12689+i>>0]|0)>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;Lh(b,0);c[(Jg()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;do{i=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;e=j+-48|0}while(e>>>0<10&i>>>0<429496729);if(e>>>0<10){m=0;do{f=ki(i|0,m|0,10,0)|0;k=y;l=((e|0)<0)<<31>>31;o=~l;if(k>>>0>o>>>0|(k|0)==(o|0)&f>>>0>~e>>>0){f=10;e=m;n=76;break c}i=ei(f|0,k|0,e|0,l|0)|0;m=y;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;e=j+-48|0}while(e>>>0<10&(m>>>0<429496729|(m|0)==429496729&i>>>0<2576980378));if(e>>>0>9){j=p;e=m}else{f=10;e=m;n=76}}else{j=p;e=0}}else{j=p;e=0;i=0}}else{o=e;n=47}while(0);d:do if((n|0)==47){if(!(o+-1&o)){n=a[19072+((o*23|0)>>>5&7)>>0]|0;f=a[12689+i>>0]|0;e=f&255;if(o>>>0>e>>>0){i=0;do{i=e|i<<n;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;f=a[12689+j>>0]|0;e=f&255}while(i>>>0<134217728&o>>>0>e>>>0);k=e;e=0}else{j=i;k=e;e=0;i=0}l=ni(-1,-1,n|0)|0;m=y;if(o>>>0<=k>>>0|(m>>>0<e>>>0|(m|0)==(e|0)&l>>>0<i>>>0)){f=o;n=76;break}while(1){i=oi(i|0,e|0,n|0)|0;e=y;i=i|f&255;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Nh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0|(e>>>0>m>>>0|(e|0)==(m|0)&i>>>0>l>>>0)){f=o;n=76;break d}}}e=a[12689+i>>0]|0;f=e&255;if(o>>>0>f>>>0){i=0;do{i=f+(N(i,o)|0)|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Nh(b)|0;e=a[12689+j>>0]|0;f=e&255}while(i>>>0<119304647&o>>>0>f>>>0);k=e;e=0}else{j=i;k=e;i=0;e=0}if(o>>>0>f>>>0){m=li(-1,-1,o|0,0)|0;n=y;f=k;while(1){if(e>>>0>n>>>0|(e|0)==(n|0)&i>>>0>m>>>0){f=o;n=76;break d}k=ki(i|0,e|0,o|0,0)|0;l=y;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=o;n=76;break d}i=ei(k|0,l|0,f|0,0)|0;e=y;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Nh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0){f=o;n=76;break}}}else{f=o;n=76}}while(0);if((n|0)==76)if(f>>>0>(d[12689+j>>0]|0)>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Nh(b)|0}while(f>>>0>(d[12689+i>>0]|0)>>>0);c[(Jg()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else j=p;if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0<h>>>0|(e|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(Jg()|0)>>2]=34;g=ei(g|0,h|0,-1,-1)|0;h=y;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(Jg()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=fi(i^j|0,e^g|0,j|0,g|0)|0;h=y}while(0);y=h;return g|0}function Nh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=Ph(b)|0;if((e|0)>=0){f=c[f>>2]|0;i=c[b+8>>2]|0;if(f){h=c[b+4>>2]|0;f=f-(c[b+108>>2]|0)|0;g=i;if((i-h|0)<(f|0))j=9;else c[b+100>>2]=h+(f+-1)}else{g=i;j=9}if((j|0)==9)c[b+100>>2]=i;f=b+4|0;if(!g)f=c[f>>2]|0;else{f=c[f>>2]|0;b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((e|0)!=(d[f>>0]|0|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function Oh(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function Ph(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((Qh(a)|0)==0?(Xa[c[a+32>>2]&31](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function Qh(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Xa[c[b+36>>2]&31](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;c=Kh(a,b,c,-1,-1)|0;return c|0}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;c=Kh(a,b,c,-2147483648,0)|0;return c|0}function Th(a,b){a=a|0;b=b|0;var c=0;c=Pg(a)|0;return ((Uh(a,1,c,b)|0)!=(c|0))<<31>>31|0}function Uh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=N(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(_g(e)|0)==0;a=vh(a,f,e)|0;if(!g)$g(e)}else a=vh(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function Vh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(wh(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0<h>>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((Xa[c[b+36>>2]&31](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function Wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=Yg(a,b,f)|0;l=e;return d|0}function Xh(a,b){a=a|0;b=b|0;return Yg(c[3293]|0,a,b)|0}function Yh(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=Yg(c[3293]|0,a,e)|0;l=d;return b|0}function Zh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[d+76>>2]|0)>=0?(_g(d)|0)!=0:0){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(i=d+20|0,j=c[i>>2]|0,j>>>0<(c[d+16>>2]|0)>>>0):0){c[i>>2]=j+1;a[j>>0]=f}else e=Vh(d,b)|0;$g(d)}else k=3;do if((k|0)==3){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=f;break}e=Vh(d,b)|0}while(0);return e|0}function _h(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[3293]|0;if((c[f+76>>2]|0)>-1)g=_g(f)|0;else g=0;do if((Th(b,f)|0)<0)b=-1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(Vh(f,10)|0)>>31}while(0);if(g|0)$g(f);return b|0}function $h(){ka(28464);return}function ai(){return 28448}function bi(){return 28456}function ci(){return 28460}function di(){}function ei(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function fi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (y=d,a-c>>>0|0)|0}function gi(a){a=a|0;return (a?31-(Q(a^a-1)|0)|0:32)|0}function hi(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (y=n,f)|0}else{if(!g){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (y=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (y=n,f)|0}g=h-1|0;if(g&h|0){i=(Q(h|0)|0)+33-(Q(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (y=o,p)|0}else{p=gi(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (y=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (y=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (y=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((gi(i|0)|0)>>>0);return (y=o,p)|0}g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (y=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (y=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=ei(m|0,l|0,-1,-1)|0;d=y;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;fi(k|0,d|0,e|0,n|0)|0;p=y;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=fi(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=y;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (y=o,p)|0}function ii(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=fi(j^a|0,i^b|0,j|0,i|0)|0;g=y;a=f^j;b=e^i;return fi((hi(h,g,fi(f^c|0,e^d|0,f|0,e|0)|0,y,0)|0)^a|0,y^b|0,a|0,b|0)|0}function ji(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function ki(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=ji(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function li(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return hi(a,b,c,d,0)|0}function mi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=(b|0)<0?-1:0;return b>>c-32|0}function ni(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function oi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}y=a<<c-32;return 0}function pi(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function qi(a,b,c){a=a|0;b=b|0;c=c|0;b=Q(b)|0;if((b|0)==32)b=b+(Q(a)|0)|0;y=0;return b|0}function ri(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return za(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function si(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function ti(a){a=a|0;var b=0,d=0;d=c[i>>2]|0;b=d+a|0;if((a|0)>0&(b|0)<(d|0)|(b|0)<0){V()|0;la(12);return -1}c[i>>2]=b;if((b|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=d;la(12);return -1}return d|0}function ui(a,b){a=a|0;b=b|0;return Va[a&15](b|0)|0}function vi(a,b,c){a=a|0;b=b|0;c=c|0;return Wa[a&3](b|0,c|0)|0}function wi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xa[a&31](b|0,c|0,d|0)|0}function xi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Ya[a&3](b|0,c|0,d|0,e|0)|0}function yi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Za[a&7](b|0,c|0,d|0,e|0,f|0)|0}function zi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return _a[a&15](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Ai(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return $a[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function Bi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return ab[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Ci(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;return bb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0,n|0,o|0,p|0,q|0)|0}function Di(a,b){a=a|0;b=b|0;cb[a&15](b|0)}function Ei(a,b,c){a=a|0;b=b|0;c=c|0;db[a&15](b|0,c|0)}function Fi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;eb[a&15](b|0,c|0,d|0)}function Gi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fb[a&31](b|0,c|0,d|0,e|0)}function Hi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;gb[a&7](b|0,c|0,d|0,e|0,f|0)}function Ii(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;hb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function Ji(a){a=a|0;R(0);return 0}function Ki(a,b){a=a|0;b=b|0;R(1);return 0}function Li(a,b,c){a=a|0;b=b|0;c=c|0;R(2);return 0}function Mi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(3);return 0}function Ni(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(4);return 0}function Oi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(5);return 0}function Pi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;R(6);return 0}function Qi(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;R(7);return 0}function Ri(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;R(8);return 0}function Si(a){a=a|0;R(9)}function Ti(a,b){a=a|0;b=b|0;R(10)}function Ui(a,b,c){a=a|0;b=b|0;c=c|0;R(11)}function Vi(a,b,c){a=a|0;b=b|0;c=c|0;ua(a|0,b|0,c|0)}function Wi(a,b,c){a=a|0;b=b|0;c=c|0;Qa(a|0,b|0,c|0)}function Xi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(12)}function Yi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(13)}function Zi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(14)} + +// EMSCRIPTEN_END_FUNCS +var Va=[Ji,Af,Df,Gf,Hf,If,Uf,Yf,Fg,Gc,Te,Ji,Ji,Ji,Ji,Ji];var Wa=[Ki,Wf,cf,Ki];var Xa=[Li,Gg,Hg,Lg,xh,Bb,pc,qc,tc,vc,ld,wd,xd,yd,Id,ce,ag,cg,fg,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li];var Ya=[Mi,rd,ud,Mi];var Za=[Ni,nc,Fc,Oc,Tc,Wc,vd,Ni];var _a=[Oi,gd,hd,id,jd,od,pd,qd,sd,af,Oi,Oi,Oi,Oi,Oi,Oi];var $a=[Pi,kd,Ue,Ve];var ab=[Qi,td];var bb=[Ri,md];var cb=[Si,Bf,Tf,Vf,wb,zb,Ab,xb,Uc,dd,Si,Si,Si,Si,Si,Si];var db=[Ti,Cf,Ef,Ff,Xf,Bc,Ic,ed,fd,nd,bf,Ti,Ti,Ti,Ti,Ti];var eb=[Ui,Jf,_f,Vi,Wi,Hc,ye,Ae,$f,eg,sg,vg,Ui,Ui,Ui,Ui];var fb=[Xi,rc,sc,uc,Zc,Jd,Qd,Vd,Wd,de,We,Ye,Ze,bg,dg,gg,tg,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi,Xi];var gb=[Yi,Zf,Cd,Md,Od,df,Yi,Yi];var hb=[Zi,yb];return{___divdi3:ii,___emscripten_environ_constructor:$h,___muldi3:ki,___udivdi3:li,__get_daylight:bi,__get_timezone:ci,__get_tzname:ai,_bitshift64Ashr:mi,_bitshift64Lshr:ni,_bitshift64Shl:oi,_console_queue_char:pb,_display_key_event:qb,_display_mouse_event:rb,_display_wheel_event:sb,_free:Bg,_fs_import_file:Td,_i64Add:ei,_i64Subtract:fi,_llvm_bswap_i32:pi,_llvm_ctlz_i64:qi,_malloc:Ag,_memcpy:ri,_memset:si,_net_set_carrier:ub,_net_write_packet:tb,_sbrk:ti,_vm_start:vb,dynCall_ii:ui,dynCall_iii:vi,dynCall_iiii:wi,dynCall_iiiii:xi,dynCall_iiiiii:yi,dynCall_iiiiiii:zi,dynCall_iiiiiiii:Ai,dynCall_iiiiiiiii:Bi,dynCall_iiiiiiiiiiiiiiiii:Ci,dynCall_vi:Di,dynCall_vii:Ei,dynCall_viii:Fi,dynCall_viiii:Gi,dynCall_viiiii:Hi,dynCall_viiiiii:Ii,establishStackSpace:lb,getTempRet0:ob,runPostSets:di,setTempRet0:nb,setThrew:mb,stackAlloc:ib,stackRestore:kb,stackSave:jb}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=asm["___emscripten_environ_constructor"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var __get_daylight=Module["__get_daylight"]=asm["__get_daylight"];var __get_timezone=Module["__get_timezone"]=asm["__get_timezone"];var __get_tzname=Module["__get_tzname"]=asm["__get_tzname"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _console_queue_char=Module["_console_queue_char"]=asm["_console_queue_char"];var _display_key_event=Module["_display_key_event"]=asm["_display_key_event"];var _display_mouse_event=Module["_display_mouse_event"]=asm["_display_mouse_event"];var _display_wheel_event=Module["_display_wheel_event"]=asm["_display_wheel_event"];var _free=Module["_free"]=asm["_free"];var _fs_import_file=Module["_fs_import_file"]=asm["_fs_import_file"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _llvm_ctlz_i64=Module["_llvm_ctlz_i64"]=asm["_llvm_ctlz_i64"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memset=Module["_memset"]=asm["_memset"];var _net_set_carrier=Module["_net_set_carrier"]=asm["_net_set_carrier"];var _net_write_packet=Module["_net_write_packet"]=asm["_net_write_packet"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _vm_start=Module["_vm_start"]=asm["_vm_start"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=asm["dynCall_iiiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=asm["dynCall_iiiiiiiiiiiiiiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + + diff --git a/jslinux-2019-12-21/riscvemu64-wasm.js b/jslinux-2019-12-21/riscvemu64-wasm.js new file mode 100644 index 0000000..7975229 --- /dev/null +++ b/jslinux-2019-12-21/riscvemu64-wasm.js @@ -0,0 +1,4 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;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;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);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};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}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}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}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){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(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 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";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?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>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)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;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:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;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];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";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;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 UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;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){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){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<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,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;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;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 allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}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__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="riscvemu64-wasm.wast";var wasmBinaryFile="riscvemu64-wasm.wasm";var asmjsCodeFile="riscvemu64-wasm.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("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);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;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)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+35840;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=35840;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}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!")}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 SYSCALLS={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}),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 ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;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{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{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 _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}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};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,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/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){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)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}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{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("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=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;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,1e3/fps);else _emscripten_set_main_loop_timing(1,1);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++}),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);_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}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("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"]=[];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}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){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){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);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;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);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);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&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});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&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){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{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}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)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);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){err("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){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){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(){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()}}),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){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;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}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);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(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);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_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_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()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}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}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("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)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=184;Module["wasmMaxTableSize"]=184;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _console_queue_char=Module["_console_queue_char"]=(function(){return Module["asm"]["_console_queue_char"].apply(null,arguments)});var _display_key_event=Module["_display_key_event"]=(function(){return Module["asm"]["_display_key_event"].apply(null,arguments)});var _display_mouse_event=Module["_display_mouse_event"]=(function(){return Module["asm"]["_display_mouse_event"].apply(null,arguments)});var _display_wheel_event=Module["_display_wheel_event"]=(function(){return Module["asm"]["_display_wheel_event"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _fs_import_file=Module["_fs_import_file"]=(function(){return Module["asm"]["_fs_import_file"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _net_set_carrier=Module["_net_set_carrier"]=(function(){return Module["asm"]["_net_set_carrier"].apply(null,arguments)});var _net_write_packet=Module["_net_write_packet"]=(function(){return Module["asm"]["_net_write_packet"].apply(null,arguments)});var _vm_start=Module["_vm_start"]=(function(){return Module["asm"]["_vm_start"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiijjjjj=Module["dynCall_iiiiiiijjjjj"]=(function(){return Module["asm"]["dynCall_iiiiiiijjjjj"].apply(null,arguments)});var dynCall_iiijii=Module["dynCall_iiijii"]=(function(){return Module["asm"]["dynCall_iiijii"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiji=Module["dynCall_viiji"]=(function(){return Module["asm"]["dynCall_viiji"].apply(null,arguments)});Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + diff --git a/jslinux-2019-12-21/riscvemu64-wasm.wasm b/jslinux-2019-12-21/riscvemu64-wasm.wasm Binary files differnew file mode 100644 index 0000000..81613ec --- /dev/null +++ b/jslinux-2019-12-21/riscvemu64-wasm.wasm diff --git a/jslinux-2019-12-21/riscvemu64.js b/jslinux-2019-12-21/riscvemu64.js new file mode 100644 index 0000000..7b86901 --- /dev/null +++ b/jslinux-2019-12-21/riscvemu64.js @@ -0,0 +1,20 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;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;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);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};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}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}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}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){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(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 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";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?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>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)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;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:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;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];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";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;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 UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;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){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){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<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){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){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;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 allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) 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"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}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__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+34832;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});memoryInitializer="data:application/octet-stream;base64,AAAAAAAAAABjY2NjfHx8fHd3d3d7e3t78vLy8mtra2tvb29vxcXFxTAwMDABAQEBZ2dnZysrKyv+/v7+19fX16urq6t2dnZ2ysrKyoKCgoLJycnJfX19ffr6+vpZWVlZR0dHR/Dw8PCtra2t1NTU1KKioqKvr6+vnJycnKSkpKRycnJywMDAwLe3t7f9/f39k5OTkyYmJiY2NjY2Pz8/P/f39/fMzMzMNDQ0NKWlpaXl5eXl8fHx8XFxcXHY2NjYMTExMRUVFRUEBAQEx8fHxyMjIyPDw8PDGBgYGJaWlpYFBQUFmpqamgcHBwcSEhISgICAgOLi4uLr6+vrJycnJ7KysrJ1dXV1CQkJCYODg4MsLCwsGhoaGhsbGxtubm5uWlpaWqCgoKBSUlJSOzs7O9bW1tazs7OzKSkpKePj4+MvLy8vhISEhFNTU1PR0dHRAAAAAO3t7e0gICAg/Pz8/LGxsbFbW1tbampqasvLy8u+vr6+OTk5OUpKSkpMTExMWFhYWM/Pz8/Q0NDQ7+/v76qqqqr7+/v7Q0NDQ01NTU0zMzMzhYWFhUVFRUX5+fn5AgICAn9/f39QUFBQPDw8PJ+fn5+oqKioUVFRUaOjo6NAQEBAj4+Pj5KSkpKdnZ2dODg4OPX19fW8vLy8tra2ttra2tohISEhEBAQEP/////z8/Pz0tLS0s3Nzc0MDAwMExMTE+zs7OxfX19fl5eXl0REREQXFxcXxMTExKenp6d+fn5+PT09PWRkZGRdXV1dGRkZGXNzc3NgYGBggYGBgU9PT0/c3NzcIiIiIioqKiqQkJCQiIiIiEZGRkbu7u7uuLi4uBQUFBTe3t7eXl5eXgsLCwvb29vb4ODg4DIyMjI6Ojo6CgoKCklJSUkGBgYGJCQkJFxcXFzCwsLC09PT06ysrKxiYmJikZGRkZWVlZXk5OTkeXl5eefn5+fIyMjINzc3N21tbW2NjY2N1dXV1U5OTk6pqampbGxsbFZWVlb09PT06urq6mVlZWV6enp6rq6urggICAi6urq6eHh4eCUlJSUuLi4uHBwcHKampqa0tLS0xsbGxujo6Ojd3d3ddHR0dB8fHx9LS0tLvb29vYuLi4uKioqKcHBwcD4+Pj61tbW1ZmZmZkhISEgDAwMD9vb29g4ODg5hYWFhNTU1NVdXV1e5ubm5hoaGhsHBwcEdHR0dnp6enuHh4eH4+Pj4mJiYmBERERFpaWlp2dnZ2Y6Ojo6UlJSUm5ubmx4eHh6Hh4eH6enp6c7Ozs5VVVVVKCgoKN/f39+MjIyMoaGhoYmJiYkNDQ0Nv7+/v+bm5uZCQkJCaGhoaEFBQUGZmZmZLS0tLQ8PDw+wsLCwVFRUVLu7u7sWFhYWAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAbAAAANgAAAAAAAAAAUKf0UVNlQX7DpBcall4nOstrqzvxRZ0fq1j6rJMD40tV+jAg9m12rZF2zIglTAL1/NflT9fLKsWARDUmj6NitUlasd5nG7olmA7qReHA/l0CdS/DEvBMgaOXRo3G+dNr51+PA5WckhXrem2/2llSlS2DvtTTIXRYKWngSUTIyY5qicJ1eHmO9Gs+WJndcbkntk/hvhetiPBmrCDJtDrOfRhK32OCMRrlYDNRl0V/U2Lgd2SxhK5ruxyggf6UKwj5WGhIcBn9RY+HbN6Ut/h7UiPTc6viAktyV48f4yqrVWYHKOuyA8K1L5p7xYalCDfT8ocoMLKlvyO6agMCXIIW7Sscz4qStHmn8PIH86HiaU7N9Npl1b4FBh9iNNGK/qbEnVMuNKBV86Iy4YoFdev2pDnsgwuq72BABp9xXlEQbr35iiE+PQbdlq4FPt1GveZNtY1UkQVdxHFv1AYE/xVQYCT7mBmX6b3WzENAiXee2We9QuiwiIuJBzhbGefb7sh5Rwp8oekPQnzJHoT4AAAAAIOGgAlI7SsyrHARHk5yWmz7/w79VjiFDx7Vrj0nOS02ZNkPCiGmXGjRVFubOi42JLFnCgwP51eT0pbutJ6RmxtPxcCAoiDcYWlLd1oWGhIcCrqT4uUqoMBD4CI8HRcbEgsNCQ6tx4vyuai2LcipHhSFGfFXTAd1r7vdme79YH+jnyYB97z1clzFO2ZENH77W3YpQ4vcxiPLaPzttmPx5LjK3DHXEIVjQkAilxMgEcaEfSRKhfg9u9IRMvmubaEpx0svnh3zMLLc7FKGDdDjwXdsFrMrmblwqfpIlBEiZOlHxIz8qBo/8KDYLH1W75AzIsdOSYfB0TjZ/qLKjDYL1JjPgfWmKN56pSaOt9qkv60/5J06LA2SeFCbzF9qYkZ+VMITjfbouNiQXvc5LvWvw4K+gF2ffJPQaakt1W+zEiXPO5msyKd9GBBuY5zoe7s72wl4Js30GFluAbea7KiaT4NlbpXmfub/qgjPvCHm6BXv2Zvnus42b0rUCZ/q1nywKa+ypDExIz8qMJSlxsBmojU3vE50psqC/LDQkOAV2KczSpgE8ffa7EEOUM1/L/aRF43WTXZNsO9DVE2qzN8EluTjtdGeG4hqTLgfLMF/UWVGBOpenV01jAFzdIf6LkEL+1odZ7NS0tuSM1YQ6RNH1m2MYdeaegyhN44U+FmJPBPr7iepzjXJYbft5RzhPLFHelnf0pw/c/JVec4UGL83x3PqzfdTW6r9XxRvPd+G20R4gfOvyj7EaLksNCQ4X0CjwnLDHRYMJeK8i0k8KEGVDf9xAag53rMMCJzktNiQwVZkYYTLe3C2MtV0XGxIQle40Kf0UVBlQX5TpBcaw14nOpZrqzvLRZ0f8Vj6rKsD40uT+jAgVW12rfZ2zIiRTAL1JdflT/zLKsXXRDUmgKNitY9asd5JG7olZw7qRZjA/l3hdS/DAvBMgRKXRo2j+dNrxl+PA+eckhWVem2/61lSldqDvtQtIXRY02ngSSnIyY5EicJ1anmO9Hg+WJlrcbkn3U/hvratiPAXrCDJZjrOfbRK32MYMRrlgjNRl2B/U2JFd2Sx4K5ru4Sggf4cKwj5lGhIcFj9RY8ZbN6Uh/h7UrfTc6sjAkty4o8f41erVWYqKOuyB8K1LwN7xYaaCDfTpYcoMPKlvyOyagMCuoIW7Vwcz4ortHmnkvIH8/DiaU6h9Nplzb4FBtViNNEf/qbEilMuNJ1V86Kg4YoFMuv2pHXsgws572BAqp9xXgYQbr1RiiE++Qbdlj0FPt2uveZNRo1UkbVdxHEF1AYEbxVQYP/7mBkk6b3Wl0NAicye2Wd3QuiwvYuJB4hbGec47sh52wp8oUcPQnzpHoT4yQAAAACGgAmD7SsySHARHqxyWmxO/w79+ziFD1bVrj0eOS02J9kPCmSmXGghVFub0S42JDpnCgyx51eTD5butNKRmxuexcCATyDcYaJLd1ppGhIcFrqT4goqoMDl4CI8QxcbEh0NCQ4Lx4vyrai2LbmpHhTIGfFXhQd1r0zdme67YH+j/SYB95/1cly8O2ZExX77WzQpQ4t2xiPL3Pzttmjx5Lhj3DHXyoVjQhAilxNAEcaEICRKhX09u9L4MvmuEaEpx20vnh1LMLLc81KGDezjwXfQFrMrbLlwqZlIlBH6ZOlHIoz8qMQ/8KAaLH1W2JAzIu9OSYfH0TjZwaLKjP4L1Jg2gfWmz956pSiOt9omv60/pJ06LOSSeFANzF9qm0Z+VGITjfbCuNiQ6Pc5Ll6vw4L1gF2fvpPQaXwt1W+pEiXPs5msyDt9GBCnY5zobrs723t4Js0JGFlu9Lea7AGaT4OobpXmZeb/qn7PvCEI6BXv5pvnutk2b0rOCZ/q1HywKdaypDGvIz8qMZSlxjBmojXAvE50N8qC/KbQkOCw2KczFZgE8Ura7EH3UM1/DvaRFy/WTXaNsO9DTU2qzFQEluTftdGe44hqTBsfLMG4UWVGf+penQQ1jAFddIf6c0EL+y4dZ7Na0tuSUlYQ6TNH1m0TYdeajAyhN3oU+FmOPBPriSepzu7JYbc15Rzh7bFHejzf0pxZc/JVP84UGHk3x3O/zfdT6qr9X1tvPd8U20R4hvOvyoHEaLk+NCQ4LECjwl/DHRZyJeK8DEk8KIuVDf9BAag5cbMMCN7ktNicwVZkkITLe2G2MtVwXGxIdFe40EL0UVCnQX5TZRcaw6QnOpZeqzvLa50f8UX6rKtY40uTAzAgVfp2rfZtzIiRdgL1JUzlT/zXKsXXyzUmgERitY+jsd5JWrolZxvqRZgO/l3hwC/DAnVMgRLwRo2jl9NrxvmPA+dfkhWVnG2/63pSldpZvtQtg3RY0yHgSSlpyY5EyMJ1aomO9Hh5WJlrPrkn3XHhvrZPiPAXrSDJZqzOfbQ632MYShrlgjFRl2AzU2JFf2Sx4Hdru4Sugf4coAj5lCtIcFhoRY8Z/d6Uh2x7Urf4c6sj00ty4gIf41ePVWYqq+uyByi1LwPCxYaaezfTpQgoMPKHvyOypQMCumoW7VyCz4orHHmnkrQH8/DyaU6h4tplzfQFBtW+NNEfYqbEiv4uNJ1T86KgVYoFMuH2pHXrgws57GBAqu9xXgafbr1RECE++Yrdlj0GPt2uBeZNRr1UkbWNxHEFXQYEb9RQYP8VmBkk+73Wl+lAicxD2Wd3nuiwvUKJB4iLGec4W8h52+58oUcKQnzpD4T4yR4AAAAAgAmDhisySO0RHqxwWmxOcg79+/+FD1Y4rj0e1S02JzkPCmTZXGghplub0VQ2JDouCgyxZ1eTD+futNKWmxuekcCAT8XcYaIgd1ppSxIcFhqT4gq6oMDlKiI8Q+AbEh0XCQ4LDYvyrce2LbmoHhTIqfFXhRl1r0wHme673X+j/WAB958mcly89WZExTv7WzR+Q4t2KSPL3Mbttmj85Lhj8THXytxjQhCFlxNAIsaEIBFKhX0ku9L4PfmuETIpx22hnh1LL7Lc8zCGDexSwXfQ47MrbBZwqZm5lBH6SOlHImT8qMSM8KAaP31W2CwzIu+QSYfHTjjZwdHKjP6i1Jg2C/Wmz4F6pSjet9omjq0/pL86LOSdeFANkl9qm8x+VGJGjfbCE9iQ6Lg5Ll73w4L1r12fvoDQaXyT1W+pLSXPsxKsyDuZGBCnfZzobmM723u7Js0JeFlu9Bia7AG3T4OompXmZW7/qn7mvCEIzxXv5ujnutmbb0rONp/q1AmwKdZ8pDGvsj8qMSOlxjCUojXAZk50N7yC/KbKkOCw0KczFdgE8UqY7EH32s1/DlCRFy/2TXaN1u9DTbCqzFRNluTfBNGe47VqTBuILMG4H2VGf1FenQTqjAFdNYf6c3QL+y5BZ7NaHduSUtIQ6TNW1m0TR9eajGGhN3oM+FmOFBPriTypzu4nYbc1yRzh7eVHejyx0pxZ3/JVP3MUGHnOx3O/N/dT6s39X1uqPd8Ub0R4htuvyoHzaLk+xCQ4LDSjwl9AHRZyw+K8DCU8KItJDf9Blag5cQEMCN6ztNic5FZkkMHLe2GEMtVwtmxIdFy40EJXUVCn9H5TZUEaw6QXOpZeJzvLa6sf8UWdrKtY+kuTA+MgVfowrfZtdoiRdsz1JUwCT/zX5cXXyyomgEQ1tY+jYt5JWrElZxu6RZgO6l3hwP7DAnUvgRLwTI2jl0ZrxvnTA+dfjxWVnJK/63ptldpZUtQtg75Y0yF0SSlp4I5EyMl1aonC9Hh5jplrPlgn3XG5vrZP4fAXrYjJZqwgfbQ6zmMYSt/lgjEal2AzUWJFf1Ox4Hdku4Sua/4coIH5lCsIcFhoSI8Z/UWUh2zeUrf4e6sj03Ny4gJL41ePH2Yqq1WyByjrLwPCtYaae8XTpQg3MPKHKCOypb8CumoD7VyCFoorHM+nkrR58/DyB06h4mllzfTaBtW+BdEfYjTEiv6mNJ1TLqKgVfMFMuGKpHXr9gs57INAqu9gXgafcb1REG4++Yohlj0G3d2uBT5NRr3mkbWNVHEFXcQEb9QGYP8VUBkk+5jWl+m9icxDQGd3ntmwvULoB4iLiec4Wxl52+7IoUcKfHzpD0L4yR6EAAAAAAmDhoAySO0rHqxwEWxOclr9+/8OD1Y4hT0e1a42JzktCmTZD2ghplyb0VRbJDouNgyxZwqTD+dXtNKW7huekZuAT8XAYaIg3FppS3ccFhoS4gq6k8DlKqA8Q+AiEh0XGw4LDQnyrceLLbmothTIqR5XhRnxr0wHde673Zmj/WB/958mAVy89XJExTtmWzR++4t2KUPL3MYjtmj87bhj8eTXytwxQhCFYxNAIpeEIBHGhX0kStL4PbuuETL5x22hKR1LL57c8zCyDexShnfQ48ErbBazqZm5cBH6SJRHImTpqMSM/KAaP/BW2Cx9Iu+QM4fHTknZwdE4jP6iypg2C9Smz4H1pSjeetomjrc/pL+tLOSdOlANknhqm8xfVGJGfvbCE42Q6LjYLl73OYL1r8OfvoBdaXyT0G+pLdXPsxIlyDuZrBCnfRjobmOc23u7O80JeCZu9BhZ7AG3moOomk/mZW6Vqn7m/yEIz7zv5ugVutmb50rONm/q1AmfKdZ8sDGvsqQqMSM/xjCUpTXAZqJ0N7xO/KbKguCw0JAzFdin8UqYBEH32ux/DlDNFy/2kXaN1k1DTbDvzFRNquTfBJae47XRTBuIasG4HyxGf1FlnQTqXgFdNYz6c3SH+y5BC7NaHWeSUtLb6TNWEG0TR9aajGHXN3oMoVmOFPjriTwTzu4nqbc1yWHh7eUcejyxR5xZ39JVP3PyGHnOFHO/N8dT6s33X1uq/d8Ubz14httEyoHzr7k+xGg4LDQkwl9AoxZywx28DCXiKItJPP9BlQ05cQGoCN6zDNic5LRkkMFWe2GEy9VwtjJIdFxs0EJXuKVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fOfSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/MzINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaWNw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkAAAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+fJeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAgGv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxHPT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5FxcuF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwkHBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQet/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8VFSo1ru7bToWFixjY8alfHz4hHd37pl7e/aN8vL/DWtr1r1vb96xxcWRVDAwYFABAQIDZ2fOqSsrVn3+/ucZ19e1YqurTeZ2duyaysqPRYKCH53JyYlAfX36h/r67xVZWbLrR0eOyfDw+wutrUHs1NSzZ6KiX/2vr0XqnJwjv6SkU/dycuSWwMCbW7e3dcL9/eEck5M9riYmTGo2NmxaPz9+Qff39QLMzINPNDRoXKWlUfTl5dE08fH5CHFx4pPY2KtzMTFiUxUVKj8EBAgMx8eVUiMjRmXDw51eGBgwKJaWN6EFBQoPmpovtQcHDgkSEiQ2gIAbm+Li3z3r680mJydOabKyf811deqfCQkSG4ODHZ4sLFh0Gho0LhsbNi1ubtyyWlq07qCgW/tSUqT2Ozt2TdbWt2Gzs33OKSlSe+Pj3T4vL15xhIQTl1NTpvXR0bloAAAAAO3twSwgIEBg/PzjH7GxechbW7btamrUvsvLjUa+vmfZOTlyS0pKlN5MTJjUWFiw6M/PhUrQ0Ltr7+/FKqqqT+X7++0WQ0OGxU1NmtczM2ZVhYURlEVFis/5+ekQAgIEBn9//oFQUKDwPDx4RJ+fJbqoqEvjUVGi86OjXf5AQIDAj48FipKSP62dnSG8ODhwSPX18QS8vGPftrZ3wdrar3UhIUJjEBAgMP//5Rrz8/0O0tK/bc3NgUwMDBgUExMmNezswy9fX77hl5c1okREiMwXFy45xMSTV6enVfJ+fvyCPT16R2RkyKxdXbrnGRkyK3Nz5pVgYMCggYEZmE9PntHc3KN/IiJEZioqVH6QkDuriIgLg0ZGjMru7scpuLhr0xQUKDze3qd5Xl684gsLFh3b26124ODbOzIyZFY6OnROCgoUHklJktsGBgwKJCRIbFxcuOTCwp9d09O9bqysQ+9iYsSmkZE5qJWVMaTk5NM3eXnyi+fn1TLIyItDNzduWW1t2reNjQGM1dWxZE5OnNKpqUngbGzYtFZWrPr09PMH6urPJWVlyq96evSOrq5H6QgIEBi6um/VeHjwiCUlSm8uLlxyHBw4JKamV/G0tHPHxsaXUejoyyPd3aF8dHTonB8fPiFLS5bdvb1h3IuLDYaKig+FcHDgkD4+fEK1tXHEZmbMqkhIkNgDAwYF9vb3AQ4OHBJhYcKjNTVqX1dXrvm5uWnQhoYXkcHBmVgdHTonnp4nueHh2Tj4+OsTmJgrsxERIjNpadK72dmpcI6OB4mUlDOnm5stth4ePCKHhxWS6enJIM7Oh0lVVar/KChQeN/fpXqMjAOPoaFZ+ImJCYANDRoXv79l2ubm1zFCQoTGaGjQuEFBgsOZmSmwLS1adw8PHhGwsHvLVFSo/Lu7bdYWFiw6Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6FsalY2P4hHx87pl3d/aNe3v/DfLy1r1ra96xb2+RVMXFYFAwMAIDAQHOqWdnVn0rK+cZ/v61YtfXTearq+yadnaPRcrKH52CgolAycn6h3197xX6+rLrWVmOyUdH+wvw8EHsra2zZ9TUX/2iokXqr68jv5ycU/ekpOSWcnKbW8DAdcK3t+Ec/f09rpOTTGomJmxaNjZ+QT8/9QL394NPzMxoXDQ0UfSlpdE05eX5CPHx4pNxcatz2NhiUzExKj8VFQgMBASVUsfHRmUjI51ew8MwKBgYN6GWlgoPBQUvtZqaDgkHByQ2EhIbm4CA3z3i4s0m6+tOaScnf82ysuqfdXUSGwkJHZ6Dg1h0LCw0LhoaNi0bG9yybm607lpaW/ugoKT2UlJ2TTs7t2HW1n3Os7NSeykp3T7j415xLy8Tl4SEpvVTU7lo0dEAAAAAwSzt7UBgICDjH/z8ecixsbbtW1vUvmpqjUbLy2fZvr5ySzk5lN5KSpjUTEyw6FhYhUrPz7tr0NDFKu/vT+Wqqu0W+/uGxUNDmtdNTWZVMzMRlIWFis9FRekQ+fkEBgIC/oF/f6DwUFB4RDw8Jbqfn0vjqKii81FRXf6jo4DAQEAFio+PP62SkiG8nZ1wSDg48QT19WPfvLx3wba2r3Xa2kJjISEgMBAQ5Rr///0O8/O/bdLSgUzNzRgUDAwmNRMTwy/s7L7hX181opeXiMxERC45FxeTV8TEVfKnp/yCfn56Rz09yKxkZLrnXV0yKxkZ5pVzc8CgYGAZmIGBntFPT6N/3NxEZiIiVH4qKjurkJALg4iIjMpGRscp7u5r07i4KDwUFKd53t684l5eFh0LC61229vbO+DgZFYyMnROOjoUHgoKkttJSQwKBgZIbCQkuORcXJ9dwsK9btPTQ++srMSmYmI5qJGRMaSVldM35OTyi3l51TLn54tDyMhuWTc32rdtbQGMjY2xZNXVnNJOTkngqanYtGxsrPpWVvMH9PTPJerqyq9lZfSOenpH6a6uEBgICG/VurrwiHh4Sm8lJVxyLi44JBwcV/GmpnPHtLSXUcbGyyPo6KF83d3onHR0PiEfH5bdS0th3L29DYaLiw+FiorgkHBwfEI+PnHEtbXMqmZmkNhISAYFAwP3Afb2HBIODsKjYWFqXzU1rvlXV2nQubkXkYaGmVjBwTonHR0nuZ6e2Tjh4esT+Pgrs5iYIjMREdK7aWmpcNnZB4mOjjOnlJQttpubPCIeHhWSh4fJIOnph0nOzqr/VVVQeCgopXrf3wOPjIxZ+KGhCYCJiRoXDQ1l2r+/1zHm5oTGQkLQuGhogsNBQSmwmZlady0tHhEPD3vLsLCo/FRUbda7uyw6FhZSUlJSCQkJCWpqamrV1dXVMDAwMDY2NjalpaWlODg4OL+/v79AQEBAo6Ojo56enp6BgYGB8/Pz89fX19f7+/v7fHx8fOPj4+M5OTk5goKCgpubm5svLy8v/////4eHh4c0NDQ0jo6OjkNDQ0NERERExMTExN7e3t7p6enpy8vLy1RUVFR7e3t7lJSUlDIyMjKmpqamwsLCwiMjIyM9PT097u7u7kxMTEyVlZWVCwsLC0JCQkL6+vr6w8PDw05OTk4ICAgILi4uLqGhoaFmZmZmKCgoKNnZ2dkkJCQksrKysnZ2dnZbW1tboqKioklJSUltbW1ti4uLi9HR0dElJSUlcnJycvj4+Pj29vb2ZGRkZIaGhoZoaGhomJiYmBYWFhbU1NTUpKSkpFxcXFzMzMzMXV1dXWVlZWW2tra2kpKSkmxsbGxwcHBwSEhISFBQUFD9/f397e3t7bm5ubna2traXl5eXhUVFRVGRkZGV1dXV6enp6eNjY2NnZ2dnYSEhISQkJCQ2NjY2Kurq6sAAAAAjIyMjLy8vLzT09PTCgoKCvf39/fk5OTkWFhYWAUFBQW4uLi4s7Ozs0VFRUUGBgYG0NDQ0CwsLCweHh4ej4+Pj8rKyso/Pz8/Dw8PDwICAgLBwcHBr6+vr729vb0DAwMDAQEBARMTExOKioqKa2trazo6OjqRkZGREREREUFBQUFPT09PZ2dnZ9zc3Nzq6urql5eXl/Ly8vLPz8/Pzs7OzvDw8PC0tLS05ubm5nNzc3OWlpaWrKysrHR0dHQiIiIi5+fn562tra01NTU1hYWFheLi4uL5+fn5Nzc3N+jo6OgcHBwcdXV1dd/f399ubm5uR0dHR/Hx8fEaGhoacXFxcR0dHR0pKSkpxcXFxYmJiYlvb29vt7e3t2JiYmIODg4OqqqqqhgYGBi+vr6+GxsbG/z8/PxWVlZWPj4+PktLS0vGxsbG0tLS0nl5eXkgICAgmpqamtvb29vAwMDA/v7+/nh4eHjNzc3NWlpaWvT09PQfHx8f3d3d3aioqKgzMzMziIiIiAcHBwfHx8fHMTExMbGxsbESEhISEBAQEFlZWVknJycngICAgOzs7OxfX19fYGBgYFFRUVF/f39/qampqRkZGRm1tbW1SkpKSg0NDQ0tLS0t5eXl5Xp6enqfn5+fk5OTk8nJycmcnJyc7+/v76CgoKDg4ODgOzs7O01NTU2urq6uKioqKvX19fWwsLCwyMjIyOvr6+u7u7u7PDw8PIODg4NTU1NTmZmZmWFhYWEXFxcXKysrKwQEBAR+fn5+urq6und3d3fW1tbWJiYmJuHh4eFpaWlpFBQUFGNjY2NVVVVVISEhIQwMDAx9fX19EQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAETCQsLAAAJBgsAAAsABhEAAAAREREAAAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAADAAAAAAJDAAAAAAADAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAANAAAABA0AAAAACQ4AAAAAAA4AAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAADwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAASEhIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAKAAAAAAoAAAAACQsAAAAAAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGVCEiGQ0BAgMRSxwMEAQLHRIeJ2hub3BxYiAFBg8TFBUaCBYHKCQXGAkKDhsfJSODgn0mKis8PT4/Q0dKTVhZWltcXV5fYGFjZGVmZ2lqa2xyc3R5ent8AAAAAAAAAAAASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AAAAAAAD/////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAOg9AADSPQAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAFAAAAAQAAAPJDAAACAAAABgAAAAMAAAABAAAABAAAAAcAAAABAAAAAgAAAPgyAAAFAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAWIAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDMAAAUAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAAAmE4AAAAEAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAr/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMyHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAtPmZzX2NvdW50ID09IDEAanNlbXUuYwBpbml0X3ZtX2ZzAHAtPmRyaXZlX2NvdW50ID09IDEAaW5pdF92bV9kcml2ZQBwLT5ldGhfY291bnQgPT0gMQBpbml0X3ZtAHNoaWZ0ID49IDAALi9zb2Z0ZnBfdGVtcGxhdGUuaABub3JtYWxpemVfc2YzMgBub3JtYWxpemUyX3NmMzIAbm9ybWFsaXplX3NmNjQAbm9ybWFsaXplMl9zZjY0AGExIDwgYgBkaXZyZW1fdTY0AHZpcnRpb18lMDR4AHdyaXRlX3NpemUgPj0gMQB2aXJ0aW8uYwB2aXJ0aW9fYmxvY2tfcmVjdl9yZXF1ZXN0AHZpcnRpb190YWJsZXQAdmlydGlvX21vdXNlAHZpcnRpb19rZXlib2FyZAB3d2RkZGRkZHcAd3cAd3N3d3cAUXcAd3NzdwBRAHdzd3d3dwB3AHMAd2QAZFF3d3dkZGRkZGRkZGRkZGRkZGQAd3d3d3dkZGRkZAB3ZHcAd2J3ZGR3cwBiAHdiZGR3cwBiZGR3cwB3d3MAd3N3dwB3c3dzAHdzdwB3cwA5UDIwMDAuTAB3d3NzdwBoAHd3aAA5cDogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlkPSVkCgBidWYgKyAxIDw9IGJ1Zl9lbmQAbWFyc2hhbGwAYnVmICsgMiA8PSBidWZfZW5kAGJ1ZiArIDQgPD0gYnVmX2VuZABidWYgKyA4IDw9IGJ1Zl9lbmQAbGVuIDw9IDY1NTM1AGJ1ZiArIDIgKyBsZW4gPD0gYnVmX2VuZABidWYgKyAxMyA8PSBidWZfZW5kAG4tPnR5cGUgPT0gRlRfRElSAGZzX25ldC5jAGlub2RlX2Rpcl9hZGQALi4Abi0+cmVmY291bnQgPj0gMQBpbm9kZV9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA9PSAwAGZsdXNoX2RpcgBuLT5yZWZjb3VudCA9PSAwAGlub2RlX2ZyZWUAbi0+b3Blbl9jb3VudCA9PSAwAGZzLT5mc19ibG9ja3MgPj0gMABmcy0+aW5vZGVfY2FjaGVfc2l6ZSA+PSAwAG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0FESU5HAGZzX3dnZXRfc2V0X2Vycm9yAGxpc3RfZW1wdHkoJm4tPnUuZGlyLmRlX2xpc3QpAGZzLT5pbm9kZV9jb3VudCA+PSAwAGJ1LT5yZWZfY291bnQgPj0gMQBmc19iYXNlX3VybF9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA+PSAwAGlub2RlX2RpcmVudF9kZWxldGVfbm9fZGVjcmVmAHhocgAhZnMtPmZzX2F0dGFjaChmcywgJnJvb3RfZmQsICZxaWQsIHVpZCwgIiIsICIiKQBmc19jbWRfeGhyAG4tPnR5cGUgPT0gRlRfUkVHICYmIG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0NBTABzZXRfYmFzZV91cmwAcmVzZXRfYmFzZV91cmwAZnNfaXNfbmV0KGZzMSkAZnNfbmV0X3Jlc2V0X2Jhc2VfdXJsAHNldF91cmwAZXhwb3J0X2ZpbGUAcGJrZGYyAHNldF9pbXBvcnRfZGlyAHVua25vd24gY29tbWFuZDogJyVzJwoAZnNfd3JpdGUAZnNfdHJ1bmNhdGUAZnNfbmV0X3NldF91cmwAZnNfbmV0X3NldF9iYXNlX3VybABuLT5vcGVuX2NvdW50ID49IDEAaW5vZGVfZGVjX29wZW4Abi0+dS5yZWcuc3RhdGUgPT0gUkVHX1NUQVRFX1VOTE9BREVEAGZzX29wZW5fd2dldABuLT51LnJlZy5zdGF0ZSA9PSBSRUdfU1RBVEVfTE9BREVEAGZzX3RyaW1fY2FjaGUAZnNfd2dldF9zZXRfbG9hZGVkAGxpc3RfZW1wdHkoJmZzLT5pbm9kZV9jYWNoZV9saXN0KQBmc19tZW1fZW5kAC90bXAAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAwLCAiIiwgIiIpAGZzX2NyZWF0ZV9jbWQALmZzY21kACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCByb290X2ZkLCBGU0NNRF9OQU1FLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjY2LCAwKQAhZnMtPmZzX2F0dGFjaChmcywgJnMtPnJvb3RfZmQsICZxaWQsIDAsICIiLCAiIikAZnNfaW5pdGlhbF9zeW5jAGhlYWQ/bm9jYWNoZT0lbGxkAC5oZWFkACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBoZWFkX2ZkLCAiLmhlYWQiLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjQ0LCAwKQBjb3VsZCBub3QgbG9hZCAnaGVhZCcgZmlsZSAoSFRUUCBlcnJvcj0lZCkAaW52YWxpZCBoZWFkIHZlcnNpb24AUm9vdElEAGV4cGVjdGVkIFJvb3RJRCB0YWcARlNNYXhTaXplAGZzX25ldF9zZXRfZnNfbWF4X3NpemUAZmlsZXMALwAuZmlsZWxpc3QudHh0ACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBuZXdfZmlsZWxpc3RfZmQsICIuZmlsZWxpc3QudHh0IiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDY0NCwgMCkAaGVhZF9sb2FkZWQAY291bGQgbm90IGxvYWQgZmlsZSBsaXN0IChIVFRQIGVycm9yPSVkKQBlcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgbGlzdAAucHJlbG9hZDIvcHJlbG9hZC50eHQALnByZWxvYWQAaW52YWxpZCBmaWxlbmFtZQoAaW52YWxpZCBwcmVsb2FkIGZpbGU6ICclcycKAGZpbGVuYW1lIHdpdGhvdXQgdGFyZ2V0OiAlcwoAaW52YWxpZCBzaXplCgBpbnZhbGlkIGZpbGUgaWQKAGludmFsaWQgbW9kZQoAaW52YWxpZCB1aWQKAGludmFsaWQgZ2lkCgBpbnZhbGlkIG1ham9yCgBpbnZhbGlkIG1pbm9yCgBpbnZhbGlkIG10aW1lCgBpbnZhbGlkIHN5bWxpbmsgbmFtZQoARXJyb3I6IABmc19pc19uZXQoZnMpAGZzX25ldF9zZXRfcHdkAC5mc2NtZF9wd2QAIWZzLT5mc19jcmVhdGUoZnMsICZxaWQsIHJvb3RfZmQsICIuZnNjbWRfcHdkIiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDYwMCwgMCkAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAxMDAwLCAiIiwgIiIpAGZzX2ltcG9ydF9maWxlAFBPU1QAR0VUAHNhbHRfbGVuIDw9IFNBTFRfTEVOX01BWABmc193Z2V0LmMAcGJrZGYyX2htYWNfc2hhMjU2APui6QElMDE2bGx4AAoKAFZlcnNpb24AaHR0cDoAaHR0cHM6AGZpbGU6AGlycV9udW0gPCA0AHBjaS5jAHBjaV9kZXZpY2VfZ2V0X2lycQBiYXJfbnVtIDwgUENJX05VTV9SRUdJT05TAHBjaV9yZWdpc3Rlcl9iYXIAKHNpemUgJiAoc2l6ZSAtIDEpKSA9PSAwAHNpemUgPj0gNAByLT5zaXplID09IDAAdW5leHBlY3RlZCBlbmQgb2YgZmlsZQBJbnZhbGlkIHByb3BlcnR5IG5hbWUAJzonIGV4cGVjdGVkAGV4cGVjdGluZyAnLCcgb3IgJ30nAGV4cGVjdGluZyAnLCcgb3IgJ10nAG51bGwAdHJ1ZQBmYWxzZQB1bmtub3duIGlkZW50aWZpZXI6ICclcycAdW5leHBlY3RlZCBjaGFyYWN0ZXIAdW50ZXJtaW5hdGVkIHN0cmluZwBpbnZhbGlnIGhleCBkaWdpdAB1bmtub3duIGVzY2FwZSBjb2RlAHN0cmluZyB0b28gbG9uZwB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgYXQgdGhlIGVuZABDb3VsZCBub3QgbG9hZCBibG9jayBkZXZpY2UgZmlsZSAoZXJyPSVkKQoAYmxvY2tfc2l6ZQBpbnZhbGlkIGJsb2NrX3NpemUKAG5fYmxvY2sAaW52YWxpZCBuX2Jsb2NrCgBwcmVmZXRjaF9ncm91cF9sZW4AcHJlZmV0Y2hfZ3JvdXBfbGVuIGlzIHRvbyBsYXJnZQBwcmVmZXRjaABleHBlY3RpbmcgYW4gYXJyYXkKAGV4cGVjdGluZyBhbiBpbnRlZ2VyCgAlc2JsayUwOXUuYmluACVzZ3JwJTA5dS5iaW4AQ291bGQgbm90IGxvYWQgZ3JvdXAgJXUKAHNpemUgPT0gYmxvY2tfYnl0ZXMgKiByZXEtPm5fYmxvY2tfbnVtAGJsb2NrX25ldC5jAGJmX3ByZWZldGNoX2dyb3VwX29ubG9hZABiLT5zdGF0ZSA9PSBDQkxPQ0tfTE9BRElORwBiZl91cGRhdGVfYmxvY2sAQ291bGQgbm90IGxvYWQgYmxvY2sgJXUKAHNpemUgPT0gYmYtPmJsb2NrX3NpemUgKiA1MTIAYmZfcmVhZF9vbmxvYWQAcy0+bl9waHlzX21lbV9yYW5nZSA8IFBIWVNfTUVNX1JBTkdFX01BWABpb21lbS5jAHJlZ2lzdGVyX3JhbV9lbnRyeQAoc2l6ZSAmIChERVZSQU1fUEFHRV9TSVpFIC0gMSkpID09IDAgJiYgc2l6ZSAhPSAwAENvdWxkIG5vdCBhbGxvY2F0ZSBWTSBtZW1vcnkKAGNwdV9yZWdpc3Rlcl9kZXZpY2UAc2l6ZSA8PSAweGZmZmZmZmZmAHJpc2N2MzIscmlzY3Y2NCxyaXNjdjEyOAByaXNjdjMyAHJpc2N2NjQAcmlzY3YxMjgAdW5zdXBwb3J0ZWQgbWFjaGluZTogJXMKAHVuc3VwcG9ydGVkIG1heF94bGVuPSVkCgBzaW1wbGVmYgB1bnN1cHBvcnRlZCBkaXNwbGF5IGRldmljZTogJXMKAHZpcnRpbwB1bnN1cHBvcnRlZCBpbnB1dCBkZXZpY2U6ICVzCgBObyBiaW9zIGZvdW5kAEJJT1MgdG9vIGJpZwoAa2VybmVsIHRvbyBiaWcAaW5pdHJkIHRvbyBiaWcAI2FkZHJlc3MtY2VsbHMAI3NpemUtY2VsbHMAY29tcGF0aWJsZQB1Y2JiYXIscmlzY3ZlbXUtYmFyX2RldgBtb2RlbAB1Y2JiYXIscmlzY3ZlbXUtYmFyZQBjcHVzAHRpbWViYXNlLWZyZXF1ZW5jeQBjcHUAZGV2aWNlX3R5cGUAcmVnAHN0YXR1cwBva2F5AHJpc2N2AHJ2JWQAcmlzY3YsaXNhAHJpc2N2LHN2MzIAcmlzY3Ysc3Y0OABtbXUtdHlwZQBjbG9jay1mcmVxdWVuY3kAaW50ZXJydXB0LWNvbnRyb2xsZXIAI2ludGVycnVwdC1jZWxscwByaXNjdixjcHUtaW50YwBwaGFuZGxlAG1lbW9yeQBodGlmAHVjYixodGlmMAB1Y2JiYXIscmlzY3ZlbXUtYmFyLXNvYwBzaW1wbGUtYnVzAHJhbmdlcwBjbGludAByaXNjdixjbGludDAAaW50ZXJydXB0cy1leHRlbmRlZABwbGljAHJpc2N2LHBsaWMwAHJpc2N2LG5kZXYAdmlydGlvLG1taW8AZnJhbWVidWZmZXIAc2ltcGxlLWZyYW1lYnVmZmVyAHN0cmlkZQBmb3JtYXQAYThyOGc4YjgAY2hvc2VuAGJvb3RhcmdzAHJpc2N2LGtlcm5lbC1zdGFydAByaXNjdixrZXJuZWwtZW5kAGxpbnV4LGluaXRyZC1zdGFydABsaW51eCxpbml0cmQtZW5kAHMtPm9wZW5fbm9kZV9jb3VudCA9PSAwAHJpc2N2X21hY2hpbmUuYwBmZHRfb3V0cHV0ACVzQCVsbHgAc2l6ZV9sb2cyID09IDIAaHRpZl93cml0ZQAKUG93ZXIgb2ZmLgBIVElGOiB1bnN1cHBvcnRlZCB0b2hvc3Q9MHglMDE2bGx4CgBodGlmX3JlYWQAcGxpY193cml0ZQBwbGljX3JlYWQAY2xpbnRfd3JpdGUAY2xpbnRfcmVhZABleHBlY3RpbmcgJyVzJyBwcm9wZXJ0eQoAJXM6IGludGVnZXIgZXhwZWN0ZWQKAEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlsZQoAZXJyb3I6ICVzCgB2ZXJzaW9uAFRoZSBlbXVsYXRvciBpcyB0b28gb2xkIHRvIHJ1biB0aGlzIFZNOiBwbGVhc2UgdXBncmFkZQoAVGhlIFZNIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gb2xkIGZvciB0aGlzIGVtdWxhdG9yIHZlcnNpb246IHBsZWFzZSB1cGdyYWRlIHRoZSBWTSBjb25maWd1cmF0aW9uIGZpbGUKAG1hY2hpbmUAJXM6IHN0cmluZyBleHBlY3RlZAoAVW5rbm93biBtYWNoaW5lIG5hbWU6ICVzCgBtZW1vcnlfc2l6ZQBiaW9zAGtlcm5lbABpbml0cmQAY21kbGluZQBUWgBVVEMlYyUwMmQ6JTAyZABkcml2ZSVkAFRvbyBtYW55IGRyaXZlcwoAZmlsZQBkZXZpY2UAZnMlZABUb28gbWFueSBmaWxlc3lzdGVtcwoAdGFnAC9kZXYvcm9vdAAvZGV2L3Jvb3QlZABldGglZABUb28gbWFueSBldGhlcm5ldCBpbnRlcmZhY2VzCgBkcml2ZXIAdGFwAGlmbmFtZQBkaXNwbGF5MAB3aWR0aABoZWlnaHQAdmdhX2Jpb3MAaW5wdXRfZGV2aWNlAGFjY2VsAG5vbmUAYXV0bwB1bnN1cHBvcnRlZCAnYWNjZWwnIGNvbmZpZzogJXMKAHJ0Y19sb2NhbF90aW1lACVzOiBib29sZWFuIGV4cGVjdGVkCgAtKyAgIDBYMHgAKG51bGwpAC0wWCswWCAwWC0weCsweCAweABpbmYASU5GAG5hbgBOQU4ALgAAAQIEBwMGBQ==";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}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!")}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 SYSCALLS={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}),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 ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{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 _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}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};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,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/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){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)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}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{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("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=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;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,1e3/fps);else _emscripten_set_main_loop_timing(1,1);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++}),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);_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}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("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"]=[];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}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){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){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);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;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);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);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&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});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&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){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{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}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)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);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){err("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){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){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(){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()}}),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){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;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}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);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(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);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_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_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()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}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}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("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)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16){var sp=stackSave();try{return Module["dynCall_iiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["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_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_iiiiiiiiiiiiiiiii":invoke_iiiiiiiiiiiiiiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"__exit":__exit,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_emscripten_set_main_loop":_emscripten_set_main_loop,"_emscripten_set_main_loop_timing":_emscripten_set_main_loop_timing,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_get_new_handle":_file_buffer_get_new_handle,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"_tzset":_tzset,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM +var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) { +"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iii;var Y=env.invoke_iiii;var Z=env.invoke_iiiii;var _=env.invoke_iiiiii;var $=env.invoke_iiiiiii;var aa=env.invoke_iiiiiiii;var ba=env.invoke_iiiiiiiii;var ca=env.invoke_iiiiiiiiiiiiiiiii;var da=env.invoke_vi;var ea=env.invoke_vii;var fa=env.invoke_viii;var ga=env.invoke_viiii;var ha=env.invoke_viiiii;var ia=env.invoke_viiiiii;var ja=env.___assert_fail;var ka=env.___buildEnvironment;var la=env.___setErrNo;var ma=env.___syscall140;var na=env.___syscall146;var oa=env.___syscall54;var pa=env.___syscall6;var qa=env.__exit;var ra=env._abort;var sa=env._clock_gettime;var ta=env._console_get_size;var ua=env._console_write;var va=env._emscripten_async_call;var wa=env._emscripten_async_wget3_data;var xa=env._emscripten_get_now;var ya=env._emscripten_get_now_is_monotonic;var za=env._emscripten_memcpy_big;var Aa=env._emscripten_random;var Ba=env._emscripten_set_main_loop;var Ca=env._emscripten_set_main_loop_timing;var Da=env._exit;var Ea=env._fb_refresh;var Fa=env._file_buffer_get_new_handle;var Ga=env._file_buffer_init;var Ha=env._file_buffer_read;var Ia=env._file_buffer_reset;var Ja=env._file_buffer_resize;var Ka=env._file_buffer_set;var La=env._file_buffer_write;var Ma=env._fs_export_file;var Na=env._fs_wget_update_downloading;var Oa=env._gettimeofday;var Pa=env._localtime_r;var Qa=env._net_recv_packet;var Ra=env._time;var Sa=env._tzset;var Ta=env.flush_NO_FILESYSTEM;var Ua=0.0; +// EMSCRIPTEN_START_FUNCS +function ib(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function jb(){return l|0}function kb(a){a=a|0;l=a}function lb(a,b){a=a|0;b=b|0;l=a;m=b}function mb(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function nb(a){a=a|0;y=a}function ob(){return y|0}function pb(b){b=b|0;var d=0,e=0;d=c[8544]|0;if(d>>>0>=1024)return;e=c[8545]|0;a[19088+e>>0]=b;b=e+1|0;c[8545]=(b|0)==1024?0:b;c[8544]=d+1;return}function qb(a,b){a=a|0;b=b|0;var d=0;d=c[8546]|0;if(!d)return;eb[c[(c[d>>2]|0)+32>>2]&15](d,a,b&65535);return}function rb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[8546]|0;if(!e)return;Va[c[(c[e>>2]|0)+24>>2]&15](e)|0;g=c[8547]|0;h=g+-1|0;e=c[8548]|0;f=e+-1|0;a=(((h|0)>(a|0)?a:h)<<15|0)/(g|0)|0;e=(((f|0)>(b|0)?b:f)<<15|0)/(e|0)|0;c[8549]=a;c[8550]=e;c[8551]=d;b=c[8546]|0;gb[c[(c[b>>2]|0)+28>>2]&7](b,a,e,0,d);return}function sb(a){a=a|0;var b=0;b=c[8546]|0;if(!b)return;gb[c[(c[b>>2]|0)+28>>2]&7](b,c[8549]|0,c[8550]|0,a,c[8551]|0);return}function tb(a,b){a=a|0;b=b|0;var d=0;d=c[(c[8546]|0)+4>>2]|0;if(!d)return;eb[c[d+24>>2]&15](d,a,b);return}function ub(a){a=a|0;var b=0;c[8552]=a;b=c[8546]|0;if(!b)return;b=c[b+4>>2]|0;if(!b)return;db[c[b+28>>2]&15](b,a);return}function vb(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=vf(20)|0;c[i+4>>2]=b;c[i+8>>2]=Lh(d)|0;if(e|0)c[i+16>>2]=Lh(e)|0;c[8547]=f;c[8548]=g;c[i+12>>2]=h;h=vf(248)|0;c[i>>2]=h;Kg(h);Bg(c[i>>2]|0,a,4,i);return}function wb(a){a=a|0;var b=0,d=0,e=0;e=c[a>>2]|0;b=c[e+164>>2]|0;if((b|0)>0){if((b|0)!=1)ja(13668,13685,207,13693);d=Vd(c[e+108>>2]|0,5,a)|0;c[e+112>>2]=d;b=c[a+16>>2]|0;if(!b)return;ae(d,b);return}b=c[e+96>>2]|0;if((b|0)<=0){Ab(a);return}if((b|0)!=1)ja(13704,13685,224,13724);c[e+56>>2]=af(c[e+52>>2]|0,131072,6,a)|0;return}function xb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+144|0;d=h;e=h+132|0;f=h+128|0;g=a+8|0;b=c[g>>2]|0;if(b|0?Tc(b)|0:0){b=Uc(c[g>>2]|0)|0;i=c[a+12>>2]|0;b=Xa[c[i+8>>2]&31](c[i>>2]|0,d,(b|0)<128?b:128)|0;if((b|0)>0)Vc(c[g>>2]|0,d,b)|0;if(c[8553]|0){ta(e|0,f|0);Wc(c[g>>2]|0,c[e>>2]|0,c[f>>2]|0);c[8553]=0}}b=c[a+16>>2]|0;if(b|0)eb[c[b+24>>2]&15](b,1,0);if(!(Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0)){b=0;while(1){db[c[(c[a>>2]|0)+20>>2]&15](a,2e5);d=Wa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0;if(b>>>0>13|(d|0)!=0)break;else b=b+1|0}if(!d){va(7,a|0,0);l=h;return}}va(7,a|0,10);l=h;return}function yb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[a+8>>2]|0;Ea(b|0,(c[a+12>>2]|0)+(N(h,e)|0)+(d<<2)|0,d|0,e|0,f|0,g|0,h|0);return}function zb(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;d=c[b+96>>2]|0;if((d|0)<=0){Ab(a);return}if((d|0)!=1)ja(13704,13685,224,13724);c[b+56>>2]=af(c[b+52>>2]|0,131072,6,a)|0;return}function Ab(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b>>2]|0;c[g+24>>2]=1;d=c[b+4>>2]<<20;h=g+16|0;c[h>>2]=d;c[h+4>>2]=((d|0)<0)<<31>>31;h=b+8|0;d=c[h>>2]|0;if(d|0?a[d>>0]|0:0)Hg(c[b>>2]|0,d);e=c[8547]|0;d=c[8548]|0;if((e|0)>0&(d|0)>0){f=g+32|0;if(!(c[f>>2]|0)){c[f>>2]=Lh(17494)|0;e=c[8547]|0;d=c[8548]|0}c[g+36>>2]=e;c[g+40>>2]=d}else{c[8553]=1;f=vf(12)|0;c[f+4>>2]=3;c[f+8>>2]=5;c[g+44>>2]=f}e=g+180|0;d=c[e>>2]|0;do if((d|0)>0)if(c[b+12>>2]|0)if((d|0)==1){f=vf(32)|0;a[f>>0]=2;a[f+1>>0]=~~(+Aa()*256.0);a[f+2>>0]=~~(+Aa()*256.0);a[f+3>>0]=~~(+Aa()*256.0);a[f+4>>0]=~~(+Aa()*256.0);a[f+5>>0]=~~(+Aa()*256.0);c[f+8>>2]=4;c[f+12>>2]=0;c[g+176>>2]=f;break}else ja(13738,13685,269,13756);else{d=0;do{Mg(c[g+168+(d*12|0)+4>>2]|0);Mg(c[g+168+(d*12|0)>>2]|0);d=d+1|0}while((d|0)<(c[e>>2]|0));c[e>>2]=0;break}while(0);f=Jg(g)|0;c[8546]=f;Ig(c[b>>2]|0);d=c[f+4>>2]|0;if(d|0)db[c[d+28>>2]&15](d,c[8552]|0);Mg(c[b>>2]|0);Mg(c[h>>2]|0);d=b+16|0;e=c[d>>2]|0;if(!e){Mg(b);va(7,f|0,0);return}Fi(e|0,0,_g(e)|0)|0;Mg(c[d>>2]|0);Mg(b);va(7,f|0,0);return}function Bb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[8544]|0;a=(e|0)>(d|0)?d:e;c[8544]=e-a;if(!a){b=0;return b|0}e=0;d=c[8554]|0;do{f=1024-d|0;f=(a|0)<(f|0)?a:f;Ei(b+e|0,19088+d|0,f|0)|0;a=a-f|0;e=f+e|0;f=f+d|0;d=(f|0)==1024?0:f}while((a|0)!=0);c[8554]=d;f=e;return f|0}function Cb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=(a&2147483647)>>>0<(b&2147483647)>>>0;i=f?a:b;b=f?b:a;f=b>>>31;k=i>>>31;g=b>>>23;j=i>>>23&255;a=b<<3&67108856;h=i<<3&67108856;switch((g&255)<<24>>24){case -1:{if(!a){if((f|0)==(k|0)|(j|0)!=255){e=b;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(b&4194304|0?(i&8388607|0)==0|(i&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{i=a;g=1;break}default:{i=a|67108864;g=g&255}}b=(j|0)==0;a=b?h:h|67108864;b=g-(b?1:j)|0;do if(b)if((b|0)>31){a=(a|0)!=0&1;break}else{a=a>>>b|((1<<b)+134217727&a|0)!=0;break}while(0);if((f|0)==(k|0))a=a+i|0;else{a=i-a|0;f=(a|0)==0?(d|0)==2&1:f}b=Q(a|0)|0;if(!b)ja(13764,13775,183,13795);e=Db(f,g+4+(1-b)|0,a<<b+-1,d,e)|0;return e|0}function Db(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;switch(e|0){case 4:case 0:{j=64;break}case 1:{j=0;break}default:j=(e&1|0)==(a|0)?0:127}if((b|0)<1){h=(b|0)!=0|(j+d|0)>-1;b=1-b|0;do if(b)if((b|0)>31){d=(d|0)!=0&1;break}else{d=d>>>b|((1<<b)+-1&d|0)!=0;break}while(0);g=d&127;if(h&(g|0)!=0){i=c[f>>2]|2;c[f>>2]=i;h=d;b=1;d=i;i=14}else{b=1;i=12}}else{g=d&127;i=12}if((i|0)==12)if(!g)g=0;else{h=d;d=c[f>>2]|0;i=14}if((i|0)==14){c[f>>2]=d|1;d=h}d=(d+j|0)>>>7;d=(e|0)==0&(g|0)==64?d&33554430:d;g=(d>>>24)+b|0;if(d>>>0<8388608){f=0;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}b=(j|0)==0;if((g|0)<=254){f=g;j=d;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}c[f>>2]=c[f>>2]|5;f=b?254:255;j=b?8388607:0;a=a<<31;f=f<<23;j=j&8388607;a=j|a;f=a|f;return f|0}function Eb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Cb(a,b^-2147483648,c,d)|0}function Fb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=b^a;n=m>>>31;h=a>>>23&255;g=b>>>23&255;i=a&8388607;l=b&8388607;j=(h|0)==255;k=(g|0)==255;if(j|k){f=(i|0)!=0;if(!((a&2139095040|0)==2139095040&f)?(l|0)==0|(b&2139095040|0)!=2139095040:0){if(!(j&(g|l|0)==0)?!((h|i|0)==0&k):0){e=m&-2147483648|2139095040;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}if(!((a&2143289344|0)==2139095040&f)?(l|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}do if(!h){if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break}e=m&-2147483648;return e|0}else a=i|8388608;while(0);do if(!g){if(l|0){g=Q(l|0)|0;f=l<<g+-8;g=9-g|0;break}e=m&-2147483648;return e|0}else f=l|8388608;while(0);f=vi(f<<8|0,0,a<<7|0,0)|0;f=(f|0)!=0|y;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);e=Db(n,h+-126+g+(1-a)|0,f<<a+-1,d,e)|0;return e|0}function Gb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=d>>>31;o=b^a;j=o>>>31;i=a>>>23&255;h=b>>>23&255;g=d>>>23&255;k=a&8388607;q=b&8388607;r=d&8388607;l=(i|0)==255;m=(h|0)==255;p=l|m;n=(g|0)==255;if(p|n){g=(k|0)!=0;if((!((a&2139095040|0)==2139095040&g)?(q|0)==0|(b&2139095040|0)!=2139095040:0)?(r|0)==0|(d&2139095040|0)!=2139095040:0){if((!(l&(h|q|0)==0)?!((i|k|0)==0&m):0)?(j|0)==(s|0)|p&n^1:0)if(n){f=d&-2147483648|2139095040;return f|0}else{f=o&-2147483648|2139095040;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}if((!((a&2143289344|0)==2139095040&g)?(q|0)==0|(b&2143289344|0)!=2139095040:0)?(r|0)==0|(d&2143289344|0)!=2139095040:0){f=2143289344;return f|0}c[f>>2]=c[f>>2]|16;f=2143289344;return f|0}do if(!i)if(!k){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{i=Q(k|0)|0;b=k<<i+-8;i=9-i|0;break}else b=k|8388608;while(0);do if(!h)if(!q){t=g|r;t=(t|0)==0;s=(s|0)==(j|0);f=(e|0)==2;f=f&1;f=s?j:f;f=f<<31;f=t?f:d;return f|0}else{h=Q(q|0)|0;a=q<<h+-8;h=9-h|0;break}else a=q|8388608;while(0);q=vi(a<<7|0,0,b<<7|0,0)|0;m=y;n=m>>>0<536870912;d=Bi(m|0,0,1)|0;b=q<<(n&1);m=n?q>>>31|d:m;n=h+i+(n?-126:-125)|0;do if(!g){if(r|0){g=Q(r|0)|0;h=r<<g+-8;g=9-g|0;break}g=m|(b|0)!=0;t=Q(g|0)|0;a=t+-1|0;if(!t)ja(13764,13775,183,13795);f=Db(j,n-a|0,g<<a,e,f)|0;return f|0}else h=r|8388608;while(0);a=g+1|0;h=h<<6;if((n|0)>(a|0)){l=s;k=0;g=h;o=n;i=m}else{r=(n|0)!=(a|0)|m>>>0<h>>>0;l=r?j:s;k=r?b:0;g=r?m:h;j=r?s:j;o=r?a:n;i=r?h:m;b=r?0:b;a=r?n:a}h=o-a|0;a:do if((h|0)>63){a=(k|g|0)!=0&1;g=0}else{if((h|0)>32){a=h+-32|0;a=g>>>a|((1<<a)+-1&g|0)!=0;g=0;break}switch(h|0){case 0:{a=k;break a}case 32:{a=g|(k|0)!=0;g=0;break a}default:{a=g<<32-h|k>>>h|((1<<h)+-1&k|0)!=0;g=g>>>h;break a}}}while(0);if((j|0)==(l|0)){s=a+b|0;b=g+i+(s>>>0<a>>>0&1)|0;i=s}else{s=b-a|0;r=i-g+((s>>>0>b>>>0)<<31>>31)|0;b=r;i=s;j=(r|s|0)==0?(e|0)==2&1:j}if(!b){a=Q(i|0)|0;h=a+31|0;g=o-h|0;if((a+32|0)>>>0<33){a=32;t=50}else a=i<<a+-1}else{a=Q(b|0)|0;h=a+-1|0;if(!a)ja(13764,13775,201,13810);g=o-h|0;if(!h)a=b|(i|0)!=0;else t=50}if((t|0)==50)a=i>>>(33-a|0)|b<<h|(i<<h|0)!=0;f=Db(j,g,a,e,f)|0;return f|0}function Hb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=b^a;m=l>>>31;g=a>>>23&255;f=b>>>23;h=f&255;k=a&8388607;i=b&8388607;if((g|0)==255){f=(k|0)==0;if(f)if((i|0)==0|(b&2139095040|0)!=2139095040)if((h|0)==255){c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}else{e=l&-2147483648|2139095040;return e|0}else j=5;else if(f|(a&2143289344|0)!=2139095040)j=5;if((j|0)==5?(i|0)==0|(b&2143289344|0)!=2139095040:0){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}a:do switch((f&255)<<24>>24){case -1:{if(!i){e=l&-2147483648;return e|0}if(!((a&2143289344|0)==2139095040&(k|0)!=0|(b&2143289344|0)==2139095040)){e=2143289344;return e|0}c[e>>2]=c[e>>2]|16;e=2143289344;return e|0}case 0:{if(i|0){h=Q(i|0)|0;a=i<<h+-8;h=9-h|0;break a}f=c[e>>2]|0;if(!(g|k)){c[e>>2]=f|16;e=2143289344;return e|0}else{c[e>>2]=f|8;e=l&-2147483648|2139095040;return e|0}}default:a=i|8388608}while(0);do if(!g){if(k|0){f=Q(k|0)|0;g=9-f|0;f=k<<f+-8;break}e=l&-2147483648;return e|0}else f=k|8388608;while(0);l=a<<2;a=xi(0,f|0,l|0,0)|0;l=vi(a|0,y|0,l|0,0)|0;f=qi(0,f|0,l|0,y|0)|0;a=((f|0)!=0|(y|0)!=0)&1|a;f=Q(a|0)|0;if(!f)ja(13764,13775,183,13795);e=Db(m,127-h+g+(1-f)|0,a<<f+-1,d,e)|0;return e|0}function Ib(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=a>>>31;f=a>>>23&255;g=a&8388607;do if((f|0)==255){if(!g){if(e)break;return a|0}if((a&2143289344|0)!=2139095040){d=2143289344;return d|0}c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}else{if(e|0){if(f|g)break;return a|0}do if(!f)if(!g){d=0;return d|0}else{e=Q(g|0)|0;a=9-e|0;e=g<<e+-8;break}else{a=f;e=g|8388608}while(0);i=a+-127|0;h=(i&1|0)==0;i=((h?i:a+-128|0)>>1)+127|0;a=e<<((h^1)&1)<<5;if(!a)a=0;else{e=Bi(1,0,(65-(Q(a+-1|0)|0)|0)>>>1|0)|0;f=y;while(1){g=xi(0,a|0,e|0,f|0)|0;g=pi(g|0,y|0,e|0,f|0)|0;g=Ai(g|0,y|0,1)|0;h=y;if(h>>>0<f>>>0|(h|0)==(f|0)&g>>>0<e>>>0){e=g;f=h}else break}h=vi(e|0,f|0,e|0,f|0)|0;a=(0!=(h|0)|(a|0)!=(y|0))&1|e}e=Q(a|0)|0;if(!e)ja(13764,13775,183,13795);d=Db(0,i+(1-e)|0,a<<e+-1,b,d)|0;return d|0}while(0);c[d>>2]=c[d>>2]|16;d=2143289344;return d|0}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?b:a;return b|0}else{b=(f|0)==0?b:a;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Kb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=(a&8388607|0)!=0;h=(a&2139095040|0)==2139095040&g;if(!h?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;if((f|0)==(b>>>31|0)){b=(f|0)==(a>>>0<b>>>0|0)?a:b;return b|0}else{b=(f|0)==0?a:b;return b|0}}if(!((a&2143289344|0)==2139095040&g)?(f=b&8388607,(f|0)==0|(b&2143289344|0)!=2139095040):0){if(!e){b=2143289344;return b|0}}else i=5;do if((i|0)==5){c[d>>2]=c[d>>2]|16;if(e>>>0<2){b=2143289344;return b|0}else{f=b&8388607;break}}while(0);return (h?((f|0)==0|(b&2139095040|0)!=2139095040?b:2143289344):a)|0}function Lb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=(a&8388607|0)!=0;if(!((a&2139095040|0)==2139095040&e)?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0)return ((a|0)==(b|0)|((b|a)&2147483647|0)==0)&1|0;if(!((a&2143289344|0)==2139095040&e)?(b&8388607|0)==0|(b&2143289344|0)!=2139095040:0)return 0;c[d>>2]=c[d>>2]|16;return 0}function Mb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d|((b|a)&2147483647|0)==0;break}if(d){d=a>>>0>=b>>>0;break}else{d=a>>>0<=b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Nb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;do if((a&8388607|0)==0|(a&2139095040|0)!=2139095040?(b&8388607|0)==0|(b&2139095040|0)!=2139095040:0){f=a>>>31;d=(f|0)!=0;if((f|0)!=(b>>>31|0)){d=d&((b|a)&2147483647|0)!=0;break}if(d){d=a>>>0>b>>>0;break}else{d=a>>>0<b>>>0;break}}else e=3;while(0);if((e|0)==3){c[d>>2]=c[d>>2]|16;d=0}return d&1|0}function Ob(a){a=a|0;var b=0,c=0;b=a>>>31;c=a&8388607;a:do switch((a>>>23&255)<<24>>24){case -1:if(!c){a=(b|0)==0?128:1;break a}else{a=(a>>>14&256)+256|0;break a}case 0:{a=(b|0)!=0;if(!c){a=a?8:16;break a}else{a=a?4:32;break a}}default:a=(b|0)==0?64:2}while(0);return a|0}function Pb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,0)|0}function Qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;g=a>>>23&255;h=a&8388607;j=(h|0)!=0&(g|0)==255?0:a>>>31;a=(g|0)==0;g=a?-149:g+-150|0;a=a?h:h|8388608;h=a<<7;i=(e|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)>-1)if((g|0)<9?(f=a<<g,f>>>0<=i>>>0):0)a=14;else a=4;else{f=0-g|0;if((g|0)<-31)f=(a|0)!=0&1;else f=h>>>f|((1<<f)+2147483647&h|0)!=0;switch(b|0){case 4:case 0:{a=64;break}case 1:{a=0;break}default:a=(j|0)==(b&1|0)?0:127}e=f&127;f=(a+f|0)>>>7;f=(b|0)==0&(e|0)==64?f&33554430:f;if(f>>>0<=i>>>0)if(!e)a=14;else{c[d>>2]=c[d>>2]|1;a=14}else a=4}if((a|0)==4){c[d>>2]=c[d>>2]|16;j=i;return j|0}else if((a|0)==14){j=(j|0)==0?f:0-f|0;return j|0}return 0}function Rb(a,b,c){a=a|0;b=b|0;c=c|0;return Qb(a,b,c,1)|0}function Sb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-31|0;f=(e|0)>31;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=Q(g|0)|0;d=h+-1|0;if(!h)ja(13764,13775,183,13795);else return Db(a>>>31,(f?e+126|0:157)-d|0,g<<d,b,c)|0;return 0}function Tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-31|0;f=(e|0)>31;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=Q(d|0)|0;a=g+-1|0;if(!g)ja(13764,13775,183,13795);else return Db(0,(f?e+126|0:157)-a|0,d<<a,b,c)|0;return 0}function Ub(a,b,c){a=a|0;b=b|0;c=c|0;c=Vb(a,b,c,0)|0;return c|0}function Vb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;h=a>>>23&255;i=a&8388607;k=(i|0)!=0&(h|0)==255?0:a>>>31;a=(h|0)==0;h=a?-149:h+-150|0;a=a?i:i|8388608;i=a<<7;if(!e){j=qi(0,-2147483648,k^1|0,0)|0;e=y}else{j=pi(k|0,0,-1,-1)|0;e=y}if((h|0)>-1)if((h|0)<41?(g=Bi(a|0,0,h|0)|0,f=y,!(f>>>0>e>>>0|(f|0)==(e|0)&g>>>0>j>>>0)):0)a=17;else a=7;else{f=0-h|0;if((h|0)<-31)f=(a|0)!=0&1;else f=i>>>f|((1<<f)+2147483647&i|0)!=0;switch(b|0){case 4:case 0:{g=64;break}case 1:{g=0;break}default:g=(k|0)==(b&1|0)?0:127}a=f&127;g=(g+f|0)>>>7;g=(b|0)==0&(a|0)==64?g&33554430:g;if(!(e>>>0<0|(e|0)==0&j>>>0<g>>>0))if(!a){f=0;a=17}else{c[d>>2]=c[d>>2]|1;f=0;a=17}else a=7}if((a|0)==7){c[d>>2]=c[d>>2]|16;d=e;k=j;y=d;return k|0}else if((a|0)==17){j=(k|0)==0;k=qi(0,0,g|0,f|0)|0;d=j?f:y;k=j?g:k;y=d;return k|0}return 0}function Wb(a,b,c){a=a|0;b=b|0;c=c|0;c=Vb(a,b,c,1)|0;return c|0}function Xb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=(b|0)<0;e=qi(0,0,a|0,b|0)|0;e=f?e:a;f=f?y:b;g=Ai(a|0,b|0,63)|0;a=Di(e|0,f|0,0)|0;a=64-a|0;if((a|0)>31){b=a+-31|0;i=Bi(1,0,b|0)|0;i=pi(i|0,y|0,-1,-1)|0;h=y&f;f=Ai(e|0,f|0,b|0)|0;b=a+126|0;e=((i&e|0)!=0|(h|0)!=0)&1|f}else b=157;i=Q(e|0)|0;a=i+-1|0;if(!i)ja(13764,13775,183,13795);else return Db(g,b-a|0,e<<a,c,d)|0;return 0}function Yb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=Di(a|0,b|0,0)|0;e=64-e|0;if((e|0)>31){h=e+-31|0;g=Bi(1,0,h|0)|0;g=pi(g|0,y|0,-1,-1)|0;f=y&b;b=Ai(a|0,b|0,h|0)|0;e=e+126|0;a=((g&a|0)!=0|(f|0)!=0)&1|b}else e=157;h=Q(a|0)|0;b=h+-1|0;if(!h)ja(13764,13775,183,13795);else return Db(0,e-b|0,a<<b,c,d)|0;return 0}function Zb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=b&2147483647;o=e&2147483647;o=k>>>0<o>>>0|(k|0)==(o|0)&a>>>0<d>>>0;k=o?a:d;l=o?b:e;i=o?d:a;d=o?e:b;a=Ai(i|0,d|0,63)|0;o=Ai(k|0,l|0,63)|0;b=Ai(i|0,d|0,52)|0;n=Ai(k|0,l|0,52)|0;n=n&2047;e=Bi(i|0,d|0,3)|0;e=e&-8;h=y&8388607;j=Bi(k|0,l|0,3)|0;j=j&-8;m=y&8388607;switch(b&2047){case 2047:{if((e|0)==0&(h|0)==0){if((a|0)==(o|0)|(n|0)!=2047){f=d;g=i;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}if(!(0==0&(d&524288|0)==0)?(k|0)==0&(l&1048575|0)==0|(0!=0|(l&2146959360|0)!=2146435072):0){f=2146959360;g=0;y=f;return g|0}c[g>>2]=c[g>>2]|16;f=2146959360;g=0;y=f;return g|0}case 0:{k=1;i=e;break}default:{k=b&2047;i=e;h=h|8388608}}b=(n|0)==0;e=b?j:j;d=b?m:m|8388608;b=k-(b?1:n)|0;do if(b)if((b|0)>63){b=((e|0)!=0|(d|0)!=0)&1;d=0;break}else{m=Bi(1,0,b|0)|0;m=pi(m|0,y|0,-1,16777215)|0;n=y;b=Ai(e|0,d|0,b|0)|0;b=b|((m&e|0)!=0|(n&d|0)!=0)&1;d=y;break}else b=e;while(0);if((a|0)==(o|0)){d=pi(b|0,d|0,i|0,h|0)|0;b=y}else{d=qi(i|0,h|0,b|0,d|0)|0;b=y;a=(d|0)==0&(b|0)==0?(f|0)==2&1:a}e=Di(d|0,b|0,0)|0;if((e|0)<=0)ja(13764,13775,183,13826);o=Bi(d|0,b|0,e+-1|0)|0;g=_b(a,k+7+(1-e)|0,o,y,f,g)|0;f=y;y=f;return g|0}function _b(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;switch(f|0){case 4:case 0:{l=512;break}case 1:{l=0;break}default:l=(f&1|0)==(a|0)?0:1023}if((b|0)<1){i=pi(l|0,0,d|0,e|0)|0;h=y;i=(b|0)!=0|((h|0)>-1|(h|0)==-1&i>>>0>4294967295);h=1-b|0;do if(h)if((h|0)>63){d=((d|0)!=0|(e|0)!=0)&1;e=0;break}else{j=Bi(1,0,h|0)|0;j=pi(j|0,y|0,-1,-1)|0;k=y;b=Ai(d|0,e|0,h|0)|0;d=b|((j&d|0)!=0|(k&e|0)!=0)&1;e=y;break}while(0);h=d&1023;if(i&(h|0)!=0){j=c[g>>2]|2;c[g>>2]=j;i=1;b=0;k=14}else{i=1;b=0;k=12}}else{h=d&1023;i=b;b=((b|0)<0)<<31>>31;k=12}if((k|0)==12)if(!h)h=0;else{j=c[g>>2]|0;k=14}if((k|0)==14)c[g>>2]=j|1;k=pi(d|0,e|0,l|0,0)|0;k=Ai(k|0,y|0,10)|0;d=y;f=(f|0)==0&(h|0)==512;h=f?k&-2:k;d=f?d&4194303:d;f=Ai(h|0,d|0,53)|0;b=pi(f|0,y|0,i|0,b|0)|0;if(!(d>>>0<1048576|(d|0)==1048576&h>>>0<0)){e=(l|0)==0;if((b|0)>2046){c[g>>2]=c[g>>2]|5;b=e?2046:2047;d=e?1048575:0;h=e?-1:0}}else b=0;g=Bi(a|0,0,63)|0;l=y;a=Bi(b|0,0,52)|0;y=d&1048575|l|y;return h|g|a|0}function $b(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;f=Zb(a,b,c,d^-2147483648,e,f)|0;return f|0}function ac(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=e^b;q=Ai(d^a|0,o|0,63)|0;j=Ai(a|0,b|0,52)|0;j=j&2047;i=Ai(d|0,e|0,52)|0;i=i&2047;n=b&1048575;p=e&1048575;k=(j|0)==2047;l=(i|0)==2047;if(k|l){h=(a|0)!=0|(n|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&h)?(m=(d|0)==0&(p|0)==0,m|(0!=0|(e&2146435072|0)!=2146435072)):0){if(!(m&(k&(i|0)==0))?!((a|0)==0&(n|0)==0&((j|0)==0&l)):0){q=o&-2147483648|2146435072;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&h)?(d|0)==0&(p|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){q=2146959360;g=0;y=q;return g|0}c[g>>2]=c[g>>2]|16;q=2146959360;g=0;y=q;return g|0}do if(!j){if(!((a|0)==0&(n|0)==0)){j=Di(a|0,n|0,0)|0;a=Bi(a|0,n|0,j+-11|0)|0;j=12-j|0;b=y;break}q=o&-2147483648;g=0;y=q;return g|0}else b=n|1048576;while(0);do if(!i){if(!((d|0)==0&(p|0)==0)){i=Di(d|0,p|0,0)|0;d=Bi(d|0,p|0,i+-11|0)|0;i=12-i|0;h=y;break}q=o&-2147483648;g=0;y=q;return g|0}else h=p|1048576;while(0);p=Bi(a|0,b|0,10)|0;e=Bi(d|0,h|0,11)|0;o=Ai(a|0,b|0,22)|0;h=Ai(d|0,h|0,21)|0;p=p&-1024;d=e&-2048;b=vi(d|0,0,p|0,0)|0;e=y;p=vi(h|0,0,p|0,0)|0;n=y;d=vi(d|0,0,o|0,0)|0;m=y;o=vi(h|0,0,o|0,0)|0;h=y;p=pi(e|0,0,p&-1024|0,0)|0;d=pi(p|0,y|0,d&-2048|0,0)|0;p=y;n=pi(m|0,0,n|0,0)|0;n=pi(n|0,y|0,o|0,0)|0;p=pi(n|0,y|0,p|0,0)|0;pi(0,y&7|0,o|0,h|0)|0;h=y;d=p|((b&-2097152|0)!=0|(d|0)!=0)&1;b=Di(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);p=Bi(d|0,h|0,b+-1|0)|0;g=_b(q,j+-1022+i+(1-b)|0,p,y,f,g)|0;q=y;y=q;return g|0}function bc(a,b,d,e,f,g,h,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=Ai(f|0,g|0,63)|0;m=e^b;n=Ai(d^a|0,m|0,63)|0;o=Ai(a|0,b|0,52)|0;o=o&2047;l=Ai(d|0,e|0,52)|0;l=l&2047;k=Ai(f|0,g|0,52)|0;k=k&2047;u=b&1048575;v=e&1048575;w=g&1048575;p=(o|0)==2047;q=(l|0)==2047;t=p|q;r=(k|0)==2047;if(t|r){j=(a|0)!=0|(u|0)!=0;if((!(0==0&(b&2146435072|0)==2146435072&j)?(s=(d|0)==0&(v|0)==0,s|(0!=0|(e&2146435072|0)!=2146435072)):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146435072|0)!=2146435072):0){if((!(s&(p&(l|0)==0))?!((a|0)==0&(u|0)==0&((o|0)==0&q)):0)?(n|0)==(x|0)|t&r^1:0)if(r){h=g&-2147483648|2146435072;i=0;y=h;return i|0}else{h=m&-2147483648|2146435072;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}if((!(0==0&(b&2146959360|0)==2146435072&j)?(d|0)==0&(v|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)?(f|0)==0&(w|0)==0|(0!=0|(g&2146959360|0)!=2146435072):0){h=2146959360;i=0;y=h;return i|0}c[i>>2]=c[i>>2]|16;h=2146959360;i=0;y=h;return i|0}do if(!o)if((a|0)==0&(u|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=Bi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{o=Di(a|0,u|0,0)|0;a=Bi(a|0,u|0,o+-11|0)|0;o=12-o|0;b=y;break}else b=u|1048576;while(0);do if(!l)if((d|0)==0&(v|0)==0){z=(k|0)==0;v=(f|0)==0;i=(w|0)==0;i=v&i;z=i&z;x=(x|0)==(n|0);i=(h|0)==2;i=i&1;i=x?n:i;i=Bi(i|0,0,63)|0;h=y;i=z?i:f;h=z?h:g;y=h;return i|0}else{l=Di(d|0,v|0,0)|0;d=Bi(d|0,v|0,l+-11|0)|0;l=12-l|0;j=y;break}else j=v|1048576;while(0);g=Bi(a|0,b|0,10)|0;q=Bi(d|0,j|0,10)|0;b=Ai(a|0,b|0,22)|0;e=Ai(d|0,j|0,22)|0;g=g&-1024;q=q&-1024;p=vi(q|0,0,g|0,0)|0;v=y;g=vi(e|0,0,g|0,0)|0;m=y;q=vi(q|0,0,b|0,0)|0;u=y;b=vi(e|0,0,b|0,0)|0;e=y;g=pi(v|0,0,g&-1024|0,0)|0;q=pi(g|0,y|0,q&-1024|0,0)|0;g=y;m=pi(u|0,0,m|0,0)|0;m=pi(m|0,y|0,b|0,0)|0;m=pi(m|0,y|0,g|0,0)|0;pi(0,y&7|0,b|0,e|0)|0;e=y;b=e>>>0<536870912|(e|0)==536870912&m>>>0<0;u=Bi(m|0,e|0,1)|0;v=y;g=Ai(q|0,g|0,31)|0;q=Bi(p&-1048576|0,q|0,b&1|0)|0;p=y;m=b?u|g&1:m;e=b?v:e;b=l+o+(b?-1022:-1021)|0;do if(!k){if(!((f|0)==0&(w|0)==0)){k=Di(f|0,w|0,0)|0;d=Bi(f|0,w|0,k+-11|0)|0;k=12-k|0;j=y;break}j=m|((q|0)!=0|(p|0)!=0)&1;z=Di(j|0,e|0,0)|0;k=z+-1|0;if((z|0)<=0)ja(13764,13775,183,13826);z=Bi(j|0,e|0,k|0)|0;i=_b(n,b-k|0,z,y,h,i)|0;h=y;y=h;return i|0}else{d=f;j=w|1048576}while(0);k=k+1|0;l=Bi(d|0,j|0,9)|0;o=y;if((b|0)>(k|0)){r=x;s=b;d=k;k=l;a=0;j=o;b=0;l=e}else{w=(b|0)!=(k|0)|(e>>>0<o>>>0|(e|0)==(o|0)&m>>>0<l>>>0);r=w?n:x;n=w?x:n;s=w?k:b;d=w?b:k;k=w?m:l;a=w?q:0;j=w?e:o;b=w?p:0;q=w?0:q;p=w?0:p;m=w?l:m;l=w?o:e}d=s-d|0;a:do if((d|0)>127){a=((a|k|0)!=0|(b|j|0)!=0)&1;b=0;k=0;j=0}else{if((d|0)>64){x=d+-64|0;b=Bi(1,0,x|0)|0;b=pi(b|0,y|0,-1,-1)|0;a=y;x=Ai(k|0,j|0,x|0)|0;a=x|((b&k|0)!=0|(a&j|0)!=0)&1;b=y;k=0;j=0;break}switch(d|0){case 0:break a;case 64:{a=k|((a|0)!=0|(b|0)!=0)&1;b=j;k=0;j=0;break a}default:{f=pi(Bi(1,0,d|0)|0,y|0,-1,-1)|0;w=y;g=Bi(k|0,j|0,64-d|0)|0;x=y;v=Ai(a|0,b|0,d|0)|0;x=x|y;a=g|v|((f&a|0)!=0|(w&b|0)!=0)&1;b=x;k=Ai(k|0,j|0,d|0)|0;j=y;break a}}}while(0);if((n|0)==(r|0)){w=pi(a|0,b|0,q|0,p|0)|0;x=y;j=pi(k|0,j|0,m|0,l|0)|0;a=pi(j|0,y|0,(x>>>0<b>>>0|(x|0)==(b|0)&w>>>0<a>>>0)&1|0,0)|0;j=y;l=w;m=x}else{w=qi(q|0,p|0,a|0,b|0)|0;x=y;j=qi(m|0,l|0,k|0,j|0)|0;a=(x>>>0>p>>>0|(x|0)==(p|0)&w>>>0>q>>>0)<<31>>31;a=pi(j|0,y|0,a|0,((a|0)<0)<<31>>31|0)|0;j=y;n=(a|w|0)==0&(j|x|0)==0?(h|0)==2&1:n;l=w;m=x}if((a|0)==0&(j|0)==0){k=Di(l|0,m|0,0)|0;b=k+63|0;d=s-b|0;if((k+64|0)>>>0<65){k=64;z=50}else{k=Bi(l|0,m|0,k+-1|0)|0;j=y}}else{k=Di(a|0,j|0,0)|0;b=k+-1|0;if((k|0)<=0)ja(13764,13775,201,13841);d=s-b|0;if(!b)k=a|((l|0)!=0|(m|0)!=0)&1;else z=50}if((z|0)==50){z=Bi(a|0,j|0,b|0)|0;j=y;x=Ai(l|0,m|0,65-k|0)|0;j=y|j;k=Bi(l|0,m|0,b|0)|0;k=x|z|((k|0)!=0|(y|0)!=0)&1}i=_b(n,d,k,j,h,i)|0;h=y;y=h;return i|0}function cc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;n=e^b;p=Ai(d^a|0,n|0,63)|0;l=Ai(a|0,b|0,52)|0;l=l&2047;h=Ai(d|0,e|0,52)|0;i=h&2047;m=b&1048575;k=e&1048575;if((l|0)==2047){h=(a|0)==0&(m|0)==0;if(h)if((d|0)==0&(k|0)==0|(0!=0|(e&2146435072|0)!=2146435072))if((i|0)==2047){c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}else{p=n&-2147483648|2146435072;g=0;y=p;return g|0}else j=5;else if(h|(0!=0|(b&2146959360|0)!=2146435072))j=5;if((j|0)==5?(d|0)==0&(k|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}a:do switch(h&2047){case 2047:{if((d|0)==0&(k|0)==0){p=n&-2147483648;g=0;y=p;return g|0}if(!(0==0&(b&2146959360|0)==2146435072&((a|0)!=0|(m|0)!=0)|0==0&(e&2146959360|0)==2146435072)){p=2146959360;g=0;y=p;return g|0}c[g>>2]=c[g>>2]|16;p=2146959360;g=0;y=p;return g|0}case 0:{if(!((d|0)==0&(k|0)==0)){o=Di(d|0,k|0,0)|0;d=Bi(d|0,k|0,o+-11|0)|0;o=12-o|0;i=y;break a}h=c[g>>2]|0;if((a|0)==0&(m|0)==0&(l|0)==0){c[g>>2]=h|16;p=2146959360;g=0;y=p;return g|0}else{c[g>>2]=h|8;p=n&-2147483648|2146435072;g=0;y=p;return g|0}}default:{o=i;i=k|1048576}}while(0);do if(!l){if(!((a|0)==0&(m|0)==0)){n=Di(a|0,m|0,0)|0;h=Bi(a|0,m|0,n+-11|0)|0;n=12-n|0;b=y;break}p=n&-2147483648;g=0;y=p;return g|0}else{n=l;b=m|1048576;h=a}while(0);k=Bi(d|0,i|0,2)|0;l=y;if(!(b>>>0<l>>>0|(b|0)==(l|0)&h>>>0<k>>>0))ja(13857,13775,571,13864);j=0;d=0;e=0;do{r=Bi(h|0,b|0,1)|0;q=y;m=Ai(d|0,e|0,63)|0;r=m|r;q=y|q;m=(b|0)>-1|(b|0)==-1&h>>>0>4294967295;a=q>>>0<l>>>0|(q|0)==(l|0)&r>>>0<k>>>0;i=m&a;h=qi(r|0,q|0,(i?0:k)|0,(i?0:l)|0)|0;b=y;i=Bi(d|0,e|0,1)|0;e=y;d=i|(m&a^1)&1;j=j+1|0}while((j|0)!=64);h=(h|0)==0&(b|0)==0;d=h?d:i|1;h=h?e:e;b=Di(d|0,h|0,0)|0;if((b|0)<=0)ja(13764,13775,183,13826);r=Bi(d|0,h|0,b+-1|0)|0;r=_b(p,1023-o+n+(1-b)|0,r,y,f,g)|0;q=y;y=q;return r|0}function dc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=Ai(a|0,b|0,63)|0;f=Ai(a|0,b|0,52)|0;f=f&2047;i=b&1048575;do if((f|0)==2047){if((a|0)==0&(i|0)==0){if(h)break;y=b;return a|0}if(!(0==0&(b&2146959360|0)==2146435072)){d=2146959360;e=0;y=d;return e|0}c[e>>2]=c[e>>2]|16;d=2146959360;e=0;y=d;return e|0}else{g=(f|0)==0;if(h|0){if(!((a|0)==0&(i|0)==0&g))break;y=b;return a|0}do if(g)if((a|0)==0&(i|0)==0){d=0;e=0;y=d;return e|0}else{f=Di(a|0,i|0,0)|0;a=Bi(a|0,i|0,f+-11|0)|0;f=12-f|0;b=y;break}else b=i|1048576;while(0);m=f+-1023|0;l=(m&1|0)==0;k=Bi(a|0,b|0,(l^1)&1|0)|0;m=((l?m:f+-1024|0)>>1)+1023|0;k=Bi(k|0,y|0,8)|0;l=y;do if(!((k|0)==0&(l|0)==0)){b=pi(k|0,l|0,-1,-1)|0;b=Di(b|0,y|0,1)|0;b=Bi(1,0,(129-b|0)>>>1|0)|0;a=y;if(!(a>>>0>l>>>0|(a|0)==(l|0)&b>>>0>k>>>0))ja(13857,13775,571,13864);while(1){f=0;g=k;h=l;i=0;j=0;do{t=Bi(g|0,h|0,1)|0;s=y;q=Ai(i|0,j|0,63)|0;t=q|t;s=y|s;q=(h|0)>-1|(h|0)==-1&g>>>0>4294967295;p=s>>>0<a>>>0|(s|0)==(a|0)&t>>>0<b>>>0;r=q&p;g=qi(t|0,s|0,(r?0:b)|0,(r?0:a)|0)|0;h=y;r=Bi(i|0,j|0,1)|0;j=y;i=r|(q&p^1)&1;f=f+1|0}while((f|0)!=64);g=pi(i|0,j|0,b|0,a|0)|0;g=Ai(g|0,y|0,1)|0;f=y;if(!(f>>>0<a>>>0|(f|0)==(a|0)&g>>>0<b>>>0)){f=21;break}if(f>>>0>l>>>0|(f|0)==(l|0)&g>>>0>k>>>0){a=f;b=g}else{f=17;break}}if((f|0)==17)ja(13857,13775,571,13864);else if((f|0)==21){t=vi(b|0,0,b|0,0)|0;o=y;n=vi(a|0,0,b|0,0)|0;q=y;r=vi(a|0,0,a|0,0)|0;s=y;n=Bi(n|0,q|0,1)|0;o=pi(n&-2|0,y&1|0,o|0,0)|0;n=y;q=Bi(q|0,0,1)|0;q=pi(q|0,y|0,r|0,0)|0;n=pi(q|0,y|0,n|0,0)|0;pi(0,y&7|0,r|0,s|0)|0;n=b|((t|0)!=0|(o|0)!=0|((n|0)!=(k|0)|(y|0)!=(l|0)))&1;o=a;break}}else{n=0;o=0}while(0);a=Di(n|0,o|0,0)|0;if((a|0)<=0)ja(13764,13775,183,13826);t=Bi(n|0,o|0,a+-1|0)|0;t=_b(0,m+(1-a)|0,t,y,d,e)|0;s=y;y=s;return t|0}while(0);c[e>>2]=c[e>>2]|16;s=2146959360;t=0;y=s;return t|0}function ec(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?e:b;e=g?d:a;y=b;return e|0}else{g=(h|0)==0;b=g?e:b;e=g?d:a;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function fc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;h=(a|0)!=0|(b&1048575|0)!=0;i=0==0&(b&2146435072|0)==2146435072&h;if(!i?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;if((h|0)==(g|0)){g=((b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0)&1|0)==(h|0);b=g?b:e;e=g?a:d;y=b;return e|0}else{g=(h|0)==0;b=g?b:e;e=g?a:d;y=b;return e|0}}if(!(0==0&(b&2146959360|0)==2146435072&h)?(j=e&1048575,(d|0)==0&(j|0)==0|(0!=0|(e&2146959360|0)!=2146435072)):0)if(!g){d=2146959360;e=0;y=d;return e|0}else{h=d;g=j;f=e&2146435072;j=0!=0;f=(f|0)!=2146435072;f=j|f;j=(h|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}c[f>>2]=c[f>>2]|16;if(g>>>0<2){d=2146959360;e=0;y=d;return e|0}j=d;g=e&1048575;f=e&2146435072;h=0!=0;f=(f|0)!=2146435072;f=h|f;j=(j|0)==0;g=(g|0)==0;g=j&g;f=g|f;g=f?d:0;d=f?e:2146959360;e=i?g:a;d=i?d:b;y=d;return e|0}function gc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=(a|0)!=0|(b&1048575|0)!=0;if(!(0==0&(b&2146435072|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0)return ((a|0)==(d|0)&(b|0)==(e|0)|(d|a|0)==0&((e|b)&2147483647|0)==0)&1|0;if(!(0==0&(b&2146959360|0)==2146435072&g)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146959360|0)!=2146435072):0)return 0;c[f>>2]=c[f>>2]|16;return 0}function hc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f|(d|a|0)==0&((e|b)&2147483647|0)==0;h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>=d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<=d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function ic(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((a|0)==0&(b&1048575|0)==0|(0!=0|(b&2146435072|0)!=2146435072)?(d|0)==0&(e&1048575|0)==0|(0!=0|(e&2146435072|0)!=2146435072):0){h=Ai(a|0,b|0,63)|0;g=Ai(d|0,e|0,63)|0;f=(h|0)!=0;if((h|0)!=(g|0)){h=f&((d|a|0)!=0|((e|b)&2147483647|0)!=0);h=h&1;return h|0}if(f){h=b>>>0>e>>>0|(b|0)==(e|0)&a>>>0>d>>>0;h=h&1;return h|0}else{h=b>>>0<e>>>0|(b|0)==(e|0)&a>>>0<d>>>0;h=h&1;return h|0}}c[f>>2]=c[f>>2]|16;h=0;h=h&1;return h|0}function jc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=Ai(a|0,b|0,63)|0;e=Ai(a|0,b|0,52)|0;d=b&1048575;switch(e&2047){case 2047:if((a|0)==0&(d|0)==0){e=(c|0)==0?128:1;return e|0}else{e=Ai(a|0,b|0,43)|0;e=(e&256)+256|0;return e|0}case 0:{b=(c|0)!=0;if((a|0)==0&(d|0)==0){e=b?8:16;return e|0}else{e=b?4:32;return e|0}}default:{e=(c|0)==0?64:2;return e|0}}return 0}function kc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;f=a>>>31;e=a>>>23;d=a&8388607;a:do switch((e&255)<<24>>24){case -1:{if(!d){f=Bi(f|0,0,63)|0;e=y|2146435072;y=e;return f|0}if((a&2143289344|0)!=2139095040){e=2146959360;f=0;y=e;return f|0}c[b>>2]=c[b>>2]|16;e=2146959360;f=0;y=e;return f|0}case 0:{if(d|0){a=Q(d|0)|0;d=d<<a+-8;a=9-a|0;break a}f=Bi(f|0,0,63)|0;e=y;y=e;return f|0}default:a=e&255}while(0);b=Bi(d|0,0,29)|0;e=y;f=Bi(f|0,0,63)|0;g=y;d=Bi(a+896|0,0,52)|0;e=y|g|e&1048575;f=d|f|b&-536870912;y=e;return f|0}function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=Ai(a|0,b|0,63)|0;g=y;h=Ai(a|0,b|0,52)|0;f=b&1048575;a:do switch(h&2047){case 2047:{if((a|0)==0&(f|0)==0){i=Bi(i|0,g|0,31)|0;i=i|2139095040;return i|0}if(!(0==0&(b&2146959360|0)==2146435072)){i=2143289344;return i|0}c[e>>2]=c[e>>2]|16;i=2143289344;return i|0}case 0:{if(!((a|0)==0&(f|0)==0)){b=Di(a|0,f|0,0)|0;b=12-b|0;break a}i=Bi(i|0,g|0,31)|0;return i|0}default:{b=h&2047;f=f|1048576}}while(0);f=Ai(a|0,f|0,22)|0;f=f|((a&4194303|0)!=0|0!=0)&1;a=Q(f|0)|0;if(!a)ja(13764,13775,183,13795);i=Db(i,b+-896+(1-a)|0,f<<a+-1,d,e)|0;return i|0}function mc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return nc(a,b,c,d,0)|0}function nc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=Ai(a|0,b|0,63)|0;g=Ai(a|0,b|0,52)|0;g=g&2047;b=b&1048575;j=((a|0)!=0|(b|0)!=0)&(g|0)==2047?0:j;i=(g|0)==0;g=i?-1074:g+-1075|0;b=Bi(a|0,b|0,10)|0;a=y;b=i?b:b;a=i?a:a|1073741824;i=(f|0)==0?-2147483648-(j^1)|0:j+-1|0;if((g|0)<=-1){if((g|0)<-63){b=((b|0)!=0|(a|0)!=0)&1;f=0}else{g=0-g|0;h=Bi(1,0,g|0)|0;h=pi(h|0,y|0,-1,2147483647)|0;f=y;g=Ai(b|0,a|0,g|0)|0;b=g|((h&b|0)!=0|(f&a|0)!=0)&1;f=y}switch(d|0){case 4:case 0:{a=512;g=0;break}case 1:{a=0;g=0;break}default:{g=(j|0)==(d&1|0);a=g?0:1023;g=g?0:0}}h=b&1023;b=pi(a|0,g|0,b|0,f|0)|0;b=Ai(b|0,y|0,10)|0;f=y;d=(d|0)==0&(h|0)==512;b=d?b&-2:b;d=d?f&4194303:f;if(!(d>>>0>0|(d|0)==0&b>>>0>i>>>0)){if(h|0)c[e>>2]=c[e>>2]|1;e=(j|0)==0?b:0-b|0;return e|0}}c[e>>2]=c[e>>2]|16;e=i;return e|0}function oc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return nc(a,b,c,d,1)|0}function pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;g=(a|0)<0?0-a|0:a;e=32-(Q(g|0)|0)|0;h=e+-63|0;f=(e|0)>63;g=f?g>>>h|((1<<h)+-1&g|0)!=0:g;h=Di(g|0,0,0)|0;d=h+-1|0;if((h|0)>0){h=Bi(g|0,0,d|0)|0;h=_b(a>>>31,(f?e+1022|0:1085)-d|0,h,y,b,c)|0;return h|0}else ja(13764,13775,183,13826);return 0}function qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=32-(Q(a|0)|0)|0;d=e+-63|0;f=(e|0)>63;d=f?a>>>d|((1<<d)+-1&a|0)!=0:a;g=Di(d|0,0,0)|0;a=g+-1|0;if((g|0)>0){g=Bi(d|0,0,a|0)|0;g=_b(0,(f?e+1022|0:1085)-a|0,g,y,b,c)|0;return g|0}else ja(13764,13775,183,13826);return 0}function rc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=sc(a,b,c,d,0)|0;return d|0}function sc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;m=Ai(a|0,b|0,63)|0;k=Ai(a|0,b|0,52)|0;k=k&2047;i=b&1048575;m=((a|0)!=0|(i|0)!=0)&(k|0)==2047?0:m;j=(k|0)==0;k=j?-1074:k+-1075|0;b=j?a:a;a=j?i:i|1048576;i=Bi(b|0,a|0,10)|0;j=y;if(!f){l=qi(0,-2147483648,m^1|0,0)|0;f=y}else{l=pi(m|0,0,-1,-1)|0;f=y}if((k|0)>-1)if((k|0)<12?(h=Bi(b|0,a|0,k|0)|0,g=y,!(g>>>0>f>>>0|(g|0)==(f|0)&h>>>0>l>>>0)):0)b=17;else b=7;else{if((k|0)<-63){g=((b|0)!=0|(a|0)!=0)&1;a=0}else{k=0-k|0;a=Bi(1,0,k|0)|0;a=pi(a|0,y|0,-1,2147483647)|0;g=y;k=Ai(i|0,j|0,k|0)|0;g=k|((a&i|0)!=0|(g&j|0)!=0)&1;a=y}switch(d|0){case 4:case 0:{h=512;b=0;break}case 1:{h=0;b=0;break}default:{b=(m|0)==(d&1|0);h=b?0:1023;b=b?0:0}}i=g&1023;h=pi(h|0,b|0,g|0,a|0)|0;h=Ai(h|0,y|0,10)|0;g=y;d=(d|0)==0&(i|0)==512;h=d?h&-2:h;g=d?g&4194303:g;if(!(g>>>0>f>>>0|(g|0)==(f|0)&h>>>0>l>>>0))if(!i)b=17;else{c[e>>2]=c[e>>2]|1;b=17}else b=7}if((b|0)==7){c[e>>2]=c[e>>2]|16;e=f;m=l;y=e;return m|0}else if((b|0)==17){l=(m|0)==0;m=qi(0,0,h|0,g|0)|0;e=l?g:y;m=l?h:m;y=e;return m|0}return 0}function tc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=sc(a,b,c,d,1)|0;return d|0}function uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=(b|0)<0;f=qi(0,0,a|0,b|0)|0;f=e?f:a;e=e?y:b;h=Ai(a|0,b|0,63)|0;b=Di(f|0,e|0,0)|0;a=64-b|0;if((a|0)>63){i=a+-63|0;g=Bi(1,0,i|0)|0;g=pi(g|0,y|0,-1,-1)|0;b=y&e;i=Ai(f|0,e|0,i|0)|0;e=y;f=i|((g&f|0)!=0|(b|0)!=0)&1;b=Di(f|0,e|0,0)|0;g=a+1022|0}else g=1085;a=b+-1|0;if((b|0)>0){i=Bi(f|0,e|0,a|0)|0;i=_b(h,g-a|0,i,y,c,d)|0;return i|0}else ja(13764,13775,183,13826);return 0}function vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=Di(a|0,b|0,0)|0;e=64-f|0;if((e|0)>63){h=e+-63|0;g=Bi(1,0,h|0)|0;g=pi(g|0,y|0,-1,-1)|0;f=y&b;h=Ai(a|0,b|0,h|0)|0;b=y;a=h|((g&a|0)!=0|(f|0)!=0)&1;f=Di(a|0,b|0,0)|0;g=e+1022|0}else g=1085;e=f+-1|0;if((f|0)>0){h=Bi(a|0,b|0,e|0)|0;h=_b(0,g-e|0,h,y,c,d)|0;return h|0}else ja(13764,13775,183,13826);return 0}function wc(b,d){b=b|0;d=d|0;var e=0,f=0;e=vf(572)|0;yc(e,b,2,8,1);c[e+544>>2]=d;b=Va[c[d>>2]&15](d)|0;d=y;a[e+288>>0]=b;a[e+289>>0]=b>>>8;a[e+290>>0]=b>>>16;a[e+291>>0]=b>>>24;a[e+292>>0]=d;f=Ai(b|0,d|0,40)|0;a[e+293>>0]=f;f=Ai(b|0,d|0,48)|0;a[e+294>>0]=f;d=Ai(b|0,d|0,56)|0;a[e+295>>0]=d;return e|0}function xc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;h=k;i=c[a+544>>2]|0;j=a+548|0;if(c[j>>2]|0){j=-1;l=k;return j|0}if((Kc(a,h,b,d,0,16,0)|0)<0){j=0;l=k;return j|0}m=c[h>>2]|0;g=a+552|0;c[g>>2]=m;c[g+12>>2]=b;c[g+16>>2]=d;switch(m|0){case 0:{b=Lg(f)|0;c[g+4>>2]=b;c[g+8>>2]=f;m=h+8|0;b=$a[c[i+4>>2]&3](i,c[m>>2]|0,c[m+4>>2]|0,b,(f+-1|0)/512|0,5,a)|0;if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Mc(a,b);m=0;l=k;return m|0}}case 1:{if((f|0)<=0)ja(13887,13903,1097,13912);f=e+-16|0;m=Lg(f)|0;Kc(a,m,b,d,16,f,0)|0;b=h+8|0;b=$a[c[i+8>>2]&3](i,c[b>>2]|0,c[b+4>>2]|0,m,(f|0)/512|0,5,a)|0;Mg(m);if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Mc(a,b);m=0;l=k;return m|0}}default:{m=0;l=k;return m|0}}return 0}function yc(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+64|0;m=n+32|0;k=n;Fi(d|0,0,544)|0;if(!(c[e>>2]|0)){k=c[e+4>>2]|0;c[d>>2]=k;c[d+12>>2]=c[e+16>>2];m=e+8|0;c[d+4>>2]=rf(k,c[m>>2]|0,c[m+4>>2]|0,4096,0,d,8,3,7)|0;c[d+16>>2]=9}else{switch(f|0){case 1:{i=4096;j=512;break}case 2:{i=4097;j=256;break}case 3:{i=4099;j=1920;break}case 9:{i=4169;j=2;break}case 18:{i=4178;j=2432;break}default:ra()}c[m>>2]=i&65535;fh(k,32,13875,m)|0;v=Je(c[e>>2]|0,k,-1,6900,i,0,j)|0;k=d+8|0;c[k>>2]=v;Qe(v,44,6900);Qe(c[k>>2]|0,46,f&65535);Pe(c[k>>2]|0,61,1);c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;v=m+2|0;a[v>>0]=16;u=m+3|0;a[u>>0]=1;t=m+4|0;a[t>>0]=4;s=m+8|0;r=m+9|0;q=m+10|0;p=m+11|0;o=m+12|0;i=m+13|0;c[s>>2]=0;a[s+4>>0]=0;a[i>>0]=16;j=m+14|0;a[j>>0]=0;e=m+15|0;a[e>>0]=0;Re(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=3;a[t>>0]=4;a[s>>0]=0;a[r>>0]=16;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Re(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=4;a[t>>0]=4;a[s>>0]=0;a[r>>0]=32;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Re(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;a[m>>0]=9;a[v>>0]=20;a[u>>0]=2;a[t>>0]=4;a[s>>0]=0;a[r>>0]=48;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;c[m+16>>2]=0;Re(c[k>>2]|0,m,20)|0;c[d+16>>2]=6;c[d+12>>2]=Le(c[k>>2]|0,0)|0;m=Me(c[k>>2]|0)|0;c[d>>2]=m;c[d+4>>2]=rf(m,0,0,16384,0,d,7,1,23)|0;Ne(c[k>>2]|0,4,16384,0,d,2)}c[d+264>>2]=f;c[d+268>>2]=65535;c[d+284>>2]=g;c[d+276>>2]=h;v=d+24|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[d+44>>2]=16;c[d+52>>2]=0;c[d+56>>2]=0;c[d+60>>2]=0;b[d+48>>1]=0;c[d+68>>2]=0;c[d+72>>2]=16;c[d+80>>2]=0;c[d+84>>2]=0;c[d+88>>2]=0;b[d+76>>1]=0;c[d+96>>2]=0;c[d+100>>2]=16;c[d+108>>2]=0;c[d+112>>2]=0;c[d+116>>2]=0;b[d+104>>1]=0;c[d+124>>2]=0;c[d+128>>2]=16;c[d+136>>2]=0;c[d+140>>2]=0;c[d+144>>2]=0;b[d+132>>1]=0;c[d+152>>2]=0;c[d+156>>2]=16;c[d+164>>2]=0;c[d+168>>2]=0;c[d+172>>2]=0;b[d+160>>1]=0;c[d+180>>2]=0;c[d+184>>2]=16;c[d+192>>2]=0;c[d+196>>2]=0;c[d+200>>2]=0;b[d+188>>1]=0;c[d+208>>2]=0;c[d+212>>2]=16;c[d+220>>2]=0;c[d+224>>2]=0;c[d+228>>2]=0;b[d+216>>1]=0;c[d+236>>2]=0;c[d+240>>2]=16;c[d+248>>2]=0;c[d+252>>2]=0;c[d+256>>2]=0;b[d+244>>1]=0;l=n;return}function zc(a,b,d){a=a|0;b=b|0;d=d|0;return Oe(c[a+8>>2]|0,b,0,d)|0}function Ac(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=b&4095;switch(b>>>12&1048575|0){case 0:switch(e|0){case 2:switch(b&4095){case 4:{b=c[a+32>>2]|0;switch(b|0){case 0:{a=c[a+272>>2]|0;return a|0}case 1:{a=b;return a|0}default:{a=0;return a|0}}}case 0:{a=c[a+32>>2]|0;return a|0}case 32:{a=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;return a|0}case 40:{a=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;return a|0}case 48:{a=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;return a|0}default:{a=0;return a|0}}case 1:{f=f+-18|0;switch(f>>>1|f<<31|0){case 0:{a=16;return a|0}case 2:{a=c[a+36>>2]|0;return a|0}case 3:{a=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;return a|0}case 5:{a=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;return a|0}default:{a=0;return a|0}}}default:{if(!((e|0)==0&(f|0)==20)){a=0;return a|0}a=c[a+28>>2]|0;return a|0}}case 1:{if(f|e|0){a=0;return a|0}e=a+24|0;f=c[e>>2]|0;c[e>>2]=0;a=c[a+12>>2]|0;eb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);a=f;return a|0}case 2:{switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=f>>>0){a=0;return a|0}a=d[a+288+f>>0]|0;return a|0}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0);return a|0}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0)|(d[a+2>>0]|0)<<16|(d[a+3>>0]|0)<<24;return a|0}default:ra()}break}default:{a=0;return a|0}}return 0}function Bc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0;g=d&4095;switch(d>>>12&1048575|0){case 0:switch(f|0){case 2:switch(g>>>3|d<<29|0){case 0:{c[a+32>>2]=e;return}case 4:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 5:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 6:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}default:return}case 1:switch(d&4095){case 22:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 24:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 28:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}default:return}default:{if(!((g|0)==20&(f|0)==0))return;c[a+28>>2]=e;if(e|0)return;g=c[a+12>>2]|0;eb[c[g>>2]&15](c[g+4>>2]|0,c[g+8>>2]|0,0);g=a+24|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}}case 2:{Gc(a,g,e,f);return}case 3:{if(e>>>0>=8)return;Hc(a,e);return}default:return}}function Cc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;sf(c[a+4>>2]|0,d,0,e);return}function Dc(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;a:do if(b>>>0<=255)if((e|0)==2)do switch(b|0){case 0:{f=1953655158;break a}case 4:{f=2;break a}case 8:{f=c[a+264>>2]|0;break a}case 12:{f=c[a+268>>2]|0;break a}case 16:{f=c[a+32>>2]|0;switch(f|0){case 1:break a;case 0:{f=c[a+272>>2]|0;break a}default:{f=0;break a}}}case 20:{f=c[a+32>>2]|0;break a}case 48:{f=c[a+36>>2]|0;break a}case 52:{f=16;break a}case 56:{f=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;break a}case 128:{f=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;break a}case 144:{f=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;break a}case 160:{f=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;break a}case 68:{f=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;break a}case 96:{f=c[a+24>>2]|0;break a}case 112:{f=c[a+28>>2]|0;break a}case 252:{f=0;break a}default:{f=0;break a}}while(0);else f=0;else{b=b+-256|0;switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=b>>>0){f=0;break a}f=d[a+288+b>>0]|0;break a}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0);break a}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;break a}default:ra()}}while(0);return f|0}function Ec(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;if(d>>>0>255){Gc(a,d+-256|0,e,f);return}if((f|0)!=2)return;do switch(d|0){case 20:{c[a+32>>2]=e;return}case 48:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 56:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 128:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 144:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 160:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}case 112:{c[a+28>>2]=e;if(e|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);f=a+24|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}case 68:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}case 80:{if(e>>>0>=8)return;Hc(a,e);return}case 100:{d=a+24|0;f=c[d>>2]&~e;c[d>>2]=f;if(f|0)return;f=c[a+12>>2]|0;eb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);return}default:return}while(0)}function Fc(a,b,d){a=a|0;b=b|0;d=d|0;return tf(c[a>>2]|0,b,0,d)|0}function Gc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;switch(f|0){case 0:{if((c[b+284>>2]|0)>>>0<=d>>>0)return;a[b+288+d>>0]=e;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 1:{if(((c[b+284>>2]|0)+-1|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=(e&65535)>>>8;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}case 2:{if(((c[b+284>>2]|0)+-3|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=e>>>8;a[d+2>>0]=e>>>16;a[d+3>>0]=e>>>24;d=c[b+280>>2]|0;if(!d)return;cb[d&15](b);return}default:return}}function Hc(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;k=p+4|0;m=p;if(c[a+40+(d*28|0)+24>>2]|0){l=p;return}o=a+40+(d*28|0)+16|0;f=(c[o>>2]|0)+2|0;if((f&1|0)==0?(e=Xa[c[a+16>>2]&31](a,f,0)|0,(e|0)!=0):0)f=b[e>>1]|0;else f=0;g=a+276|0;h=a+40+(d*28|0)+8|0;e=b[h>>1]|0;if(e<<16>>16==f<<16>>16){l=p;return}i=a+40+(d*28|0)+4|0;j=a+16|0;while(1){e=(c[o>>2]|0)+4+(((c[i>>2]|0)+65535&(e&65535))<<1)|0;if((e&1|0)==0?(n=Xa[c[j>>2]&31](a,e,0)|0,(n|0)!=0):0)e=b[n>>1]|0;else e=0;e=e&65535;if((Ic(a,k,m,d,e)|0)==0?(Za[c[g>>2]&7](a,d,e,c[k>>2]|0,c[m>>2]|0)|0)<0:0){e=13;break}e=(b[h>>1]|0)+1<<16>>16;b[h>>1]=e;if(e<<16>>16==f<<16>>16){e=13;break}}if((e|0)==13){l=p;return}}function Ic(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;Jc(a,p,g,h);o=p+12|0;j=e[o>>1]|0;a:do if(!(j&2)){i=p+8|0;k=p+14|0;h=0;do{h=(c[i>>2]|0)+h|0;if(!(j&1)){i=0;break a}Jc(a,p,g,e[k>>1]|0);m=b[o>>1]|0;j=m&65535}while(!(j&2|0));j=m&65535;n=6}else{h=0;n=6}while(0);b:do if((n|0)==6){k=p+8|0;m=p+14|0;i=0;while(1){i=(c[k>>2]|0)+i|0;if(!(j&1))break b;Jc(a,p,g,e[m>>1]|0);j=e[o>>1]|0;if(!(j&2)){h=-1;break}}l=q;return h|0}while(0);c[d>>2]=h;c[f>>2]=i;f=0;l=q;return f|0}function Jc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a+16|0;g=16;e=(c[a+40+(d*28|0)+12>>2]|0)+(e<<4)|0;while(1){d=4096-(e&4095)|0;d=(g|0)<(d|0)?g:d;f=Xa[c[h>>2]&31](a,e,0)|0;if(!f){b=4;break}Ei(b|0,f|0,d|0)|0;g=g-d|0;if((g|0)<=0){b=4;break}else{b=b+d|0;e=d+e|0}}if((b|0)==4)return}function Kc(a,d,f,g,h,i,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;y=z;if(!i){y=0;l=z;return y|0}x=a+40+(f*28|0)+12|0;w=a+16|0;m=y;n=16;g=(c[x>>2]|0)+(g<<4)|0;while(1){f=4096-(g&4095)|0;f=(n|0)<(f|0)?n:f;k=Xa[c[w>>2]&31](a,g,0)|0;if(!k)break;Ei(m|0,k|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{m=m+f|0;g=f+g|0}}u=(j|0)!=0;v=y+12|0;k=b[v>>1]|0;f=k&65535;g=f&2;a:do if(u)if(!g){j=y+14|0;while(1){if(!(f&1)){q=-1;break}g=y;k=16;m=((e[j>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;Ei(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}k=b[v>>1]|0;f=k&65535;g=f&2;if(g){t=2;break a}}l=z;return q|0}else t=2;else t=0;while(0);if((g|0)!=(t|0)){y=-1;l=z;return y|0}r=y+8|0;s=y+14|0;m=h;while(1){p=c[r>>2]|0;if(m>>>0<p>>>0){f=21;break}if(!(f&1)){q=-1;f=40;break}o=m-p|0;g=y;n=16;j=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(j&4095)|0;f=(n|0)<(f|0)?n:f;h=Xa[c[w>>2]&31](a,j,0)|0;if(!h)break;Ei(g|0,h|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{g=g+f|0;j=f+j|0}}g=b[v>>1]|0;f=g&65535;if((f&2|0)!=(t|0)){q=-1;f=40;break}else{m=o;k=g}}if((f|0)==21){n=d;g=i;f=k;b:while(1){q=n;d=g;do{o=p-m|0;o=(d|0)<(o|0)?d:o;k=m+(c[y>>2]|0)|0;g=(o|0)>0;c:do if(u){if(g){n=o;j=q;while(1){g=4096-(k&4095)|0;g=(n|0)<(g|0)?n:g;h=Xa[c[w>>2]&31](a,k,1)|0;if(!h)break c;Ei(h|0,j|0,g|0)|0;n=n-g|0;if((n|0)<=0)break;else{k=g+k|0;j=j+g|0}}}}else if(g){j=q;h=o;while(1){g=4096-(k&4095)|0;g=(h|0)<(g|0)?h:g;n=Xa[c[w>>2]&31](a,k,0)|0;if(!n)break c;Ei(j|0,n|0,g|0)|0;h=h-g|0;if((h|0)<=0)break;else{j=j+g|0;k=g+k|0}}}while(0);d=d-o|0;if(!d){q=0;f=40;break b}m=o+m|0;q=q+o|0}while((m|0)!=(p|0));if(!(f&1)){q=-1;f=40;break}g=y;k=16;m=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Xa[c[w>>2]&31](a,m,0)|0;if(!n)break;Ei(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}f=b[v>>1]|0;if((t|0)!=(f&2|0)){q=-1;f=40;break}n=q;g=d;m=0;p=c[r>>2]|0}if((f|0)==40){l=z;return q|0}}else if((f|0)==40){l=z;return q|0}return 0}function Lc(a,b){a=a|0;b=b|0;Mc(a,b);c[a+548>>2]=0;Hc(a,c[a+564>>2]|0);return}function Mc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;e=i;f=b+552|0;g=c[f+12>>2]|0;h=c[f+16>>2]|0;switch(c[f>>2]|0){case 0:{e=c[f+8>>2]|0;f=c[f+4>>2]|0;a[f+(e+-1)>>0]=d>>>31;Kc(b,f,g,h,0,e,1)|0;Mg(f);Nc(b,g,h,e);l=i;return}case 1:{a[e>>0]=d>>>31;Kc(b,e,g,h,0,1,1)|0;Nc(b,g,h,1);l=i;return}default:ra()}}function Nc(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=a+40+(d*28|0)+20|0;h=(c[j>>2]|0)+2|0;if(!(h&1)){i=a+16|0;g=Xa[c[i>>2]&31](a,h,0)|0;if(!g)g=0;else g=b[g>>1]|0;g=g&65535;h=Xa[c[i>>2]&31](a,h,1)|0;if(h)b[h>>1]=g+1}else g=0;g=(c[j>>2]|0)+4+(((c[a+40+(d*28|0)+4>>2]|0)+65535&g)<<3)|0;if((g&3|0)==0?(k=Xa[c[a+16>>2]&31](a,g,1)|0,k|0):0)c[k>>2]=e;g=g+4|0;if((g&3|0)==0?(l=Xa[c[a+16>>2]&31](a,g,1)|0,l|0):0)c[l>>2]=f;l=a+24|0;c[l>>2]=c[l>>2]|1;l=c[a+12>>2]|0;eb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}function Oc(d,e){d=d|0;e=e|0;var f=0;f=vf(552)|0;yc(f,d,1,8,2);c[f+272>>2]=32;c[f+64>>2]=1;c[f+544>>2]=e;d=f+288|0;c[d>>2]=c[e>>2];b[d+4>>1]=b[e+4>>1]|0;a[f+294>>0]=0;a[f+295>>0]=0;c[f+548>>2]=12;c[e+16>>2]=f;c[e+20>>2]=9;c[e+24>>2]=5;c[e+28>>2]=6;return f|0}function Pc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=c[a+544>>2]|0;if((b|0)!=1){l=h;return 0}f=a+548|0;if((Kc(a,h,1,d,0,c[f>>2]|0,0)|0)<0){l=h;return 0}f=c[f>>2]|0;b=e-f|0;e=Lg(b)|0;Kc(a,e,1,d,f,b,0)|0;eb[c[g+8>>2]&15](g,e,b);Mg(e);Nc(a,1,d,0);l=h;return 0}function Qc(a){a=a|0;var d=0,e=0;e=c[a+16>>2]|0;if(!(c[e+40>>2]|0)){e=0;return e|0}a=(c[e+56>>2]|0)+2|0;if((a&1|0)==0?(d=Xa[c[e+16>>2]&31](e,a,0)|0,(d|0)!=0):0)a=b[d>>1]|0;else a=0;e=(b[e+48>>1]|0)!=a<<16>>16&1;return e|0}function Rc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;m=o+8|0;j=o+4|0;n=o;k=c[a+16>>2]|0;if(!(c[k+40>>2]|0)){l=o;return}g=k+56|0;a=(c[g>>2]|0)+2|0;if((a&1|0)==0?(f=Xa[c[k+16>>2]&31](k,a,0)|0,(f|0)!=0):0)a=b[f>>1]|0;else a=0;i=k+48|0;f=b[i>>1]|0;if(f<<16>>16==a<<16>>16){l=o;return}a=(c[g>>2]|0)+4+(((c[k+44>>2]|0)+65535&(f&65535))<<1)|0;if((a&1|0)==0?(h=Xa[c[k+16>>2]&31](k,a,0)|0,(h|0)!=0):0)a=b[h>>1]|0;else a=0;h=a&65535;if(Ic(k,j,n,0,h)|0){l=o;return}a=k+548|0;f=c[a>>2]|0;g=f+e|0;if((g|0)>(c[n>>2]|0)){l=o;return}Fi(m|0,0,f|0)|0;Kc(k,m,0,h,0,f,1)|0;Kc(k,d,0,h,c[a>>2]|0,e,1)|0;Nc(k,0,h,g);b[i>>1]=(b[i>>1]|0)+1<<16>>16;l=o;return}function Sc(a,b){a=a|0;b=b|0;return}function Tc(a){a=a|0;var d=0,e=0;if(!(c[a+40>>2]|0)){a=0;return a|0}e=(c[a+56>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;a=(b[a+48>>1]|0)!=d<<16>>16&1;return a|0}function Uc(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j+4|0;i=j;if(!(c[a+40>>2]|0)){i=0;l=j;return i|0}f=a+56|0;e=(c[f>>2]|0)+2|0;if((e&1|0)==0?(d=Xa[c[a+16>>2]&31](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;e=b[a+48>>1]|0;if(e<<16>>16==d<<16>>16){i=0;l=j;return i|0}d=(c[f>>2]|0)+4+(((c[a+44>>2]|0)+65535&(e&65535))<<1)|0;if((d&1|0)==0?(g=Xa[c[a+16>>2]&31](a,d,0)|0,(g|0)!=0):0)d=b[g>>1]|0;else d=0;h=(Ic(a,h,i,0,d&65535)|0)==0;i=h?c[i>>2]|0:0;l=j;return i|0}function Vc(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(c[a+40>>2]|0)){e=0;return e|0}i=a+56|0;g=(c[i>>2]|0)+2|0;if((g&1|0)==0?(f=Xa[c[a+16>>2]&31](a,g,0)|0,(f|0)!=0):0)f=b[f>>1]|0;else f=0;h=a+48|0;g=b[h>>1]|0;if(g<<16>>16==f<<16>>16){e=0;return e|0}f=(c[i>>2]|0)+4+(((c[a+44>>2]|0)+65535&(g&65535))<<1)|0;if((f&1|0)==0?(j=Xa[c[a+16>>2]&31](a,f,0)|0,(j|0)!=0):0)f=b[j>>1]|0;else f=0;j=f&65535;Kc(a,d,0,j,0,e,1)|0;Nc(a,0,j,e);b[h>>1]=(b[h>>1]|0)+1<<16>>16;return e|0}function Wc(b,d,e){b=b|0;d=d|0;e=e|0;a[b+288>>0]=d;a[b+289>>0]=(d&65535)>>>8;a[b+290>>0]=e;a[b+291>>0]=(e&65535)>>>8;e=b+24|0;c[e>>2]=c[e>>2]|2;e=c[b+12>>2]|0;eb[c[e>>2]&15](c[e+4>>2]|0,c[e+8>>2]|0,1);return}function Xc(a,b){a=a|0;b=b|0;var d=0;d=vf(548)|0;yc(d,a,3,4,3);c[d+272>>2]=1;c[d+64>>2]=1;c[d+544>>2]=b;return d|0}function Yc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[a+544>>2]|0;if((b|0)!=1)return 0;b=Lg(e)|0;Kc(a,b,1,d,0,e,0)|0;eb[c[f+4>>2]&15](c[f>>2]|0,b,e);Mg(b);Nc(a,1,d,0);return 0}function Zc(a,b,d){a=a|0;b=b|0;d=d|0;if(c[a+544>>2]|0){a=-1;return a|0}b=_c(a,1,d,b)|0;if(b|0){a=b;return a|0}a=_c(a,0,0,0)|0;return a|0}function _c(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;if(!(c[d+40>>2]|0)){j=-1;l=k;return j|0}a[j>>0]=e;a[j+1>>0]=(e&65535)>>>8;a[j+2>>0]=f;a[j+3>>0]=(f&65535)>>>8;a[j+4>>0]=g;a[j+5>>0]=g>>>8;a[j+6>>0]=g>>>16;a[j+7>>0]=g>>>24;g=d+56|0;e=(c[g>>2]|0)+2|0;if((e&1|0)==0?(h=Xa[c[d+16>>2]&31](d,e,0)|0,(h|0)!=0):0)e=b[h>>1]|0;else e=0;h=d+48|0;f=b[h>>1]|0;if(f<<16>>16==e<<16>>16){j=-1;l=k;return j|0}e=(c[g>>2]|0)+4+(((c[d+44>>2]|0)+65535&(f&65535))<<1)|0;if((e&1|0)==0?(i=Xa[c[d+16>>2]&31](d,e,0)|0,(i|0)!=0):0)e=b[i>>1]|0;else e=0;i=e&65535;Kc(d,j,0,i,0,8,1)|0;Nc(d,0,i,8);b[h>>1]=(b[h>>1]|0)+1<<16>>16;j=0;l=k;return j|0}function $c(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[a+544>>2]|0;if((g+-1|0)>>>0>=2){i=-1;return i|0}if((g|0)==1){b=_c(a,2,0,b)|0;if(b|0){i=b;return i|0}b=_c(a,2,1,d)|0;if(b|0){i=b;return i|0}}else{b=_c(a,3,0,b)|0;if(b|0){i=b;return i|0}b=_c(a,3,1,d)|0;if(b|0){i=b;return i|0}}if(e|0?(h=_c(a,2,8,e)|0,h|0):0){i=h;return i|0}d=a+548|0;b=c[d>>2]|0;if((b|0)!=(f|0)){g=f&1;do if((g|0)!=(b&1|0)){b=_c(a,1,272,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>1&1;do if((g|0)!=(b>>>1&1|0)){b=_c(a,1,273,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>2&1;if((g|0)!=(b>>>2&1|0)?(i=_c(a,1,274,g)|0,i|0):0)return i|0;c[d>>2]=f}i=_c(a,0,0,0)|0;return i|0}function ad(a,b){a=a|0;b=b|0;var d=0;d=vf(552)|0;yc(d,a,18,256,4);c[d+64>>2]=1;c[d+272>>2]=0;c[d+280>>2]=8;c[d+544>>2]=b;return d|0}function bd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if((b|0)!=1)return 0;Nc(a,1,c,0);return 0}function cd(b){b=b|0;var e=0,f=0;switch(a[b+288>>0]|0){case 1:{switch(c[b+544>>2]|0){case 0:{e=13965;break}case 1:{e=13952;break}case 2:{e=13938;break}default:ra()}f=_g(e)|0;a[b+290>>0]=f;Ei(b+296|0,e|0,f|0)|0;return}case 18:{if((c[b+544>>2]|0)!=2)return;if((d[b+289>>0]|0)>=2)return;a[b+290>>0]=20;e=b+296|0;a[e>>0]=0;a[e+1>>0]=0;a[e+2>>0]=0;a[e+3>>0]=0;a[b+300>>0]=-1;a[b+301>>0]=127;e=b+302|0;f=e+14|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));return}case 17:{e=b+290|0;a[e>>0]=0;switch(c[b+544>>2]|0){case 0:switch(a[b+289>>0]|0){case 1:{a[e>>0]=16;e=b+296|0;f=e+16|0;do{a[e>>0]=255;e=e+1|0}while((e|0)<(f|0));return}case 20:{a[e>>0]=1;return}default:return}case 1:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=3;a[b+297>>0]=1;return}default:return}case 2:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=0;a[b+297>>0]=1;return}case 3:{a[e>>0]=1;a[b+296>>0]=3;return}default:return}default:ra()}break}case 0:return;default:{a[b+290>>0]=0;return}}}function dd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=_g(e)|0;f=vf(564)|0;yc(f,b,9,g+2|0,5);c[f+272>>2]=1;a[f+288>>0]=g;a[f+289>>0]=g>>>8;Ei(f+290|0,e|0,g|0)|0;c[f+544>>2]=d;c[f+548>>2]=8192;e=f+552|0;c[e>>2]=e;c[f+556>>2]=e;return f|0}function ed(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;Va=l;l=l+3008|0;Ta=Va+2984|0;A=Va+2976|0;z=Va+2968|0;fa=Va+2960|0;y=Va+2944|0;x=Va+2928|0;Ia=Va+2920|0;Ga=Va+2912|0;Ea=Va+2904|0;w=Va+2888|0;v=Va+2880|0;za=Va+2872|0;u=Va+2848|0;t=Va+2840|0;s=Va+2832|0;r=Va+2816|0;q=Va+2800|0;Q=Va+2792|0;o=Va+2776|0;n=Va+2760|0;Aa=Va+2736|0;ea=Va+2712|0;xa=Va+2704|0;J=Va+2672|0;I=Va+2664|0;G=Va+2648|0;F=Va+2608|0;R=Va+2464|0;E=Va+2456|0;qa=Va+2448|0;D=Va+2440|0;pa=Va+2432|0;C=Va+2408|0;oa=Va+2400|0;B=Va+2384|0;na=Va+2376|0;p=Va+2352|0;H=Va+2344|0;m=Va+2288|0;Sa=Va+2240|0;Ha=Va+2992|0;Oa=Va+1024|0;Pa=Va;Na=Va+2120|0;Ma=Va+2988|0;Ka=Va+2104|0;Ja=Va+2088|0;Fa=Va+2072|0;ja=Va+2064|0;ka=Va+2056|0;la=Va+2048|0;La=f+544|0;Qa=c[La>>2]|0;if(g|0){h=0;l=Va;return h|0}P=f+560|0;if(c[P>>2]|0){h=-1;l=Va;return h|0}c[Ha>>2]=0;a:do if(!(Kc(f,Oa,0,h,0,7,0)|0)){Ra=a[Oa+4>>0]|0;i=a[Oa+5>>0]|0;g=(d[Oa+6>>0]<<8|i&255)&65535;c[Ha>>2]=(c[Ha>>2]|0)+7;Ra=Ra&255;Wa=Ra+-8|0;j=(g&65535)>>>8&255;do switch(Wa>>>1|Wa<<31|0){case 11:{k=-524;break a}case 0:{db[c[Qa+8>>2]&15](Qa,Sa);Ta=c[Sa>>2]|0;Ja=Sa+8|0;Ia=c[Ja>>2]|0;Ja=c[Ja+4>>2]|0;La=Sa+16|0;Ka=c[La>>2]|0;La=c[La+4>>2]|0;Na=Sa+24|0;Ma=c[Na>>2]|0;Na=c[Na+4>>2]|0;Qa=Sa+32|0;Pa=c[Qa>>2]|0;Qa=c[Qa+4>>2]|0;Ua=Sa+40|0;Wa=c[Ua>>2]|0;Ua=c[Ua+4>>2]|0;c[m>>2]=0;c[m+4>>2]=Ta;Ta=m+8|0;c[Ta>>2]=Ia;c[Ta+4>>2]=Ja;Ta=m+16|0;c[Ta>>2]=Ka;c[Ta+4>>2]=La;Ta=m+24|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Na;Ta=m+32|0;c[Ta>>2]=Pa;c[Ta+4>>2]=Qa;Ta=m+40|0;c[Ta>>2]=Wa;c[Ta+4>>2]=Ua;c[m+48>>2]=0;c[m+52>>2]=256;Ta=fd(0,Oa,1024,13981,m)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}case 2:{c[H>>2]=Sa;c[H+4>>2]=Pa;b:do if((gd(f,0,h,Ha,13991,H)|0)==0?(W=c[Sa>>2]|0,X=f+552|0,k=c[f+556>>2]|0,(k|0)!=(X|0)):0){while(1){if((c[k+8>>2]|0)==(W|0))break;k=c[k+4>>2]|0;if((k|0)==(X|0))break b}if(k|0?(ia=c[k+12>>2]|0,ia|0):0){j=Lg(16)|0;c[j>>2]=f;c[j+4>>2]=0;c[j+8>>2]=h;b[j+12>>1]=g;i=_a[c[Qa+24>>2]&15](Qa,Na,ia,c[Pa>>2]|0,4,j)|0;if((i|0)<1)id(Na,i,j);else c[P>>2]=1;Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 3:{c[p>>2]=Sa;c[p+4>>2]=Ka;c[p+8>>2]=Pa;c[p+12>>2]=Na;c[p+16>>2]=Ma;if(gd(f,0,h,Ha,13994,p)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;c:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=25;break c}}if((k|0)!=0?(ra=c[k+12>>2]|0,(ra|0)!=0):0){k=$a[c[Qa+28>>2]&3](Qa,Ja,ra,c[Ka>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0)|0;Mg(c[Ka>>2]|0);if(!k){Ta=(c[f+548>>2]|0)+-24|0;c[na>>2]=Ja;c[na+4>>2]=Ta;Ta=fd(0,Oa,1024,14e3,na)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=25}else Ua=25;while(0);if((Ua|0)==25){Mg(c[Ka>>2]|0);k=-71}break a}case 4:{c[B>>2]=Sa;c[B+4>>2]=Na;c[B+8>>2]=Ma;c[B+12>>2]=Pa;if(gd(f,0,h,Ha,14003,B)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;d:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break d}}if((k|0)!=0?(sa=c[k+12>>2]|0,(sa|0)!=0):0)k=_a[c[Qa+60>>2]&15](Qa,Ka,sa,c[Na>>2]|0,c[Ma>>2]|0,c[Pa>>2]|0)|0;else k=-71}else k=-71;while(0);Mg(c[Na>>2]|0);Mg(c[Ma>>2]|0);if(k|0)break a;c[oa>>2]=Ka;Ta=fd(0,Oa,1024,14008,oa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}case 5:{c[C>>2]=Sa;c[C+4>>2]=Ja;c[C+8>>2]=Pa;c[C+12>>2]=Na;c[C+16>>2]=Ma;c[C+20>>2]=Ka;e:do if(!(gd(f,0,h,Ha,14010,C)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;f:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break f}if(k|0?(ta=c[k+12>>2]|0,ta|0):0){k=ab[c[Qa+64>>2]&1](Qa,Fa,ta,c[Ja>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;Mg(c[Ja>>2]|0);if(k|0){g=5;break e}c[pa>>2]=Fa;Wa=fd(0,Oa,1024,14008,pa)|0;k=Wa+7|0;g=Lg(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ei(g+7|0,Oa|0,Wa|0)|0;Kc(f,g,0,h,0,k,1)|0;Nc(f,0,h,k);Mg(g);g=0;k=0;break e}}while(0);Mg(c[Ja>>2]|0);g=5;k=-71}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 7:{c[D>>2]=Sa;if(gd(f,0,h,Ha,14017,D)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;g:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break g}}if((k|0)!=0?(ua=c[k+12>>2]|0,(ua|0)!=0):0){k=Ya[c[Qa+68>>2]&3](Qa,Pa,1024,ua)|0;if(!k){c[qa>>2]=Pa;Ta=fd(0,Oa,1024,14019,qa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);break a}case 8:{c[E>>2]=Sa;c[E+4>>2]=Pa;h:do if((gd(f,0,h,Ha,14021,E)|0)==0?(Y=c[Sa>>2]|0,Z=f+552|0,K=c[f+556>>2]|0,(K|0)!=(Z|0)):0){k=K;while(1){if((c[k+8>>2]|0)==(Y|0))break;k=c[k+4>>2]|0;if((k|0)==(Z|0))break h}if(k|0?(_=c[k+12>>2]|0,_|0):0){k=Xa[c[Qa+32>>2]&31](Qa,_,Na)|0;if(k|0)break a;ua=Pa;va=c[ua+4>>2]|0;xa=c[Na+16>>2]|0;ya=c[Na+20>>2]|0;Ta=c[Na+24>>2]|0;Aa=Na+32|0;za=c[Aa>>2]|0;Aa=c[Aa+4>>2]|0;Ca=Na+40|0;Ba=c[Ca>>2]|0;Ca=c[Ca+4>>2]|0;Ea=Na+48|0;Da=c[Ea>>2]|0;Ea=c[Ea+4>>2]|0;Ga=Na+56|0;Fa=c[Ga>>2]|0;Ga=c[Ga+4>>2]|0;Ia=Na+64|0;Ha=c[Ia>>2]|0;Ia=c[Ia+4>>2]|0;Ka=Na+72|0;Ja=c[Ka>>2]|0;Ka=c[Ka+4>>2]|0;La=c[Na+80>>2]|0;Pa=Na+88|0;Ma=c[Pa>>2]|0;Pa=c[Pa+4>>2]|0;Qa=c[Na+96>>2]|0;Wa=Na+104|0;Sa=c[Wa>>2]|0;Wa=c[Wa+4>>2]|0;Ua=c[Na+112>>2]|0;wa=R;c[wa>>2]=c[ua>>2];c[wa+4>>2]=va;c[R+8>>2]=Na;c[R+12>>2]=xa;c[R+16>>2]=ya;c[R+20>>2]=Ta;Ta=R+24|0;c[Ta>>2]=za;c[Ta+4>>2]=Aa;Ta=R+32|0;c[Ta>>2]=Ba;c[Ta+4>>2]=Ca;Ta=R+40|0;c[Ta>>2]=Da;c[Ta+4>>2]=Ea;Ta=R+48|0;c[Ta>>2]=Fa;c[Ta+4>>2]=Ga;Ta=R+56|0;c[Ta>>2]=Ha;c[Ta+4>>2]=Ia;Ta=R+64|0;c[Ta>>2]=Ja;c[Ta+4>>2]=Ka;Ta=R+72|0;c[Ta>>2]=La;c[Ta+4>>2]=0;Ta=R+80|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Pa;Ta=R+88|0;c[Ta>>2]=Qa;c[Ta+4>>2]=0;Ta=R+96|0;c[Ta>>2]=Sa;c[Ta+4>>2]=Wa;Ta=R+104|0;c[Ta>>2]=Ua;c[Ta+4>>2]=0;Ta=R+112|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+120|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+128|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+136|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=fd(0,Oa,1024,14024,R)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 9:{c[F>>2]=Sa;c[F+4>>2]=Pa;c[F+8>>2]=Na;c[F+12>>2]=Ma;c[F+16>>2]=Ka;c[F+20>>2]=Ja;c[F+24>>2]=Fa;c[F+28>>2]=ja;c[F+32>>2]=ka;c[F+36>>2]=la;i:do if(!(gd(f,0,h,Ha,14045,F)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){g=4;k=0;break i}}if((k|0)!=0?(va=c[k+12>>2]|0,(va|0)!=0):0){La=Fa;Oa=ja;Wa=ka;k=la;k=bb[c[Qa+36>>2]&1](Qa,va,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0,c[Ja>>2]|0,c[Ja+4>>2]|0,c[La>>2]|0,c[La+4>>2]|0,c[Oa>>2]|0,c[Oa+4>>2]|0,c[Wa>>2]|0,c[Wa+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;if(!k){g=Lg(7)|0;a[g>>0]=7;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Kc(f,g,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(g);g=0;k=0}else g=5}else{g=4;k=0}}else{g=4;k=0}}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:case 4:{Ua=262;break a}default:i=0}l=Va;return i|0}case 16:{c[G>>2]=Sa;c[G+4>>2]=Na;c[G+8>>2]=Pa;j:do if((gd(f,0,h,Ha,14056,G)|0)==0?($=c[Sa>>2]|0,aa=f+552|0,L=c[f+556>>2]|0,(L|0)!=(aa|0)):0){k=L;while(1){if((c[k+8>>2]|0)==($|0))break;k=c[k+4>>2]|0;if((k|0)==(aa|0))break j}if(k|0?(ma=c[k+12>>2]|0,ma|0):0){k=c[Pa>>2]|0;g=Lg(k+4|0)|0;Wa=Na;k=_a[c[Qa+44>>2]&15](Qa,ma,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0)break a;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,g|0,k+4|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Mg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 21:{c[I>>2]=Sa;if(gd(f,0,h,Ha,14017,I)|0){Ua=262;break a}Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}case 22:{n=Pa+28|0;c[J>>2]=Sa;c[J+4>>2]=Pa;c[J+8>>2]=Pa+4;c[J+12>>2]=Pa+8;c[J+16>>2]=Pa+16;c[J+20>>2]=Pa+24;c[J+24>>2]=n;if(gd(f,0,h,Ha,14060,J)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;k:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=106;break k}}if((k|0)!=0?(ya=c[k+12>>2]|0,(ya|0)!=0):0){k=Xa[c[Qa+80>>2]&31](Qa,ya,Pa)|0;Mg(c[n>>2]|0);if((k|0)>=0){c[xa>>2]=k;Ta=fd(0,Oa,1024,14068,xa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=106}else Ua=106;while(0);if((Ua|0)==106){Mg(c[n>>2]|0);k=-71}break a}case 23:{n=Pa+8|0;o=Pa+16|0;p=Pa+24|0;q=Pa+28|0;c[ea>>2]=Sa;c[ea+4>>2]=Pa;c[ea+8>>2]=n;c[ea+12>>2]=o;c[ea+16>>2]=p;c[ea+20>>2]=q;if(gd(f,0,h,Ha,14070,ea)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;l:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break l}}if((k|0)!=0?(Ba=c[k+12>>2]|0,(Ba|0)!=0):0){k=Xa[c[Qa+84>>2]&31](Qa,Ba,Pa)|0;if((k|0)>=0){c[Aa>>2]=Pa;c[Aa+4>>2]=n;c[Aa+8>>2]=o;c[Aa+12>>2]=p;c[Aa+16>>2]=q;Ta=fd(0,Oa,1024,14077,Aa)|0;Mg(c[q>>2]|0);Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);Mg(c[q>>2]|0);break a}case 31:{c[n>>2]=Sa;c[n+4>>2]=Pa;c[n+8>>2]=Na;if(gd(f,0,h,Ha,14083,n)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;m:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=127;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==127)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=134;break m}}if((k|0)!=0?(Ca=c[k+12>>2]|0,(m|0)!=0&(Ca|0)!=0):0){k=Ya[c[Qa+56>>2]&3](Qa,m,Ca,c[Na>>2]|0)|0;Mg(c[Na>>2]|0);if(!k){Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=134}else Ua=134;while(0);if((Ua|0)==134){Mg(c[Na>>2]|0);k=-71}break a}case 32:{c[o>>2]=Sa;c[o+4>>2]=Ma;c[o+8>>2]=Pa;c[o+12>>2]=Na;n:do if((gd(f,0,h,Ha,14087,o)|0)==0?(ba=c[Sa>>2]|0,ca=f+552|0,M=c[f+556>>2]|0,(M|0)!=(ca|0)):0){k=M;while(1){if((c[k+8>>2]|0)==(ba|0))break;k=c[k+4>>2]|0;if((k|0)==(ca|0))break n}if(k|0?(da=c[k+12>>2]|0,da|0):0){k=_a[c[Qa+20>>2]&15](Qa,Ka,da,c[Ma>>2]|0,c[Pa>>2]|0,c[Na>>2]|0)|0;if(k|0)break a;c[Q>>2]=Ka;Ta=fd(0,Oa,1024,14008,Q)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 33:{c[q>>2]=Sa;c[q+4>>2]=Na;c[q+8>>2]=Pa;c[q+12>>2]=Ma;if(gd(f,0,h,Ha,14092,q)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;o:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=156;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==156)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){k=-71;break o}}if((k|0)!=0?(Da=c[k+12>>2]|0,(m|0)!=0&(Da|0)!=0):0)k=Za[c[Qa+72>>2]&7](Qa,m,c[Na>>2]|0,Da,c[Ma>>2]|0)|0;else k=-71}else k=-71;while(0);Mg(c[Na>>2]|0);Mg(c[Ma>>2]|0);if(k|0)break a;Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}case 34:{c[r>>2]=Sa;c[r+4>>2]=Na;c[r+8>>2]=Pa;if(gd(f,0,h,Ha,14097,r)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;p:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=174;break p}}if((k|0)!=0?(wa=c[k+12>>2]|0,(wa|0)!=0):0){k=Xa[c[Qa+76>>2]&31](Qa,wa,c[Na>>2]|0)|0;Mg(c[Na>>2]|0);if(!k){Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}}else Ua=174}else Ua=174;while(0);if((Ua|0)==174){Mg(c[Na>>2]|0);k=-71}break a}case 46:{c[s>>2]=Sa;c[s+4>>2]=Pa;if(gd(f,0,h,Ha,14101,s)|0){Ua=262;break a}Ta=f+548|0;c[Ta>>2]=c[Sa>>2];Mg(c[Pa>>2]|0);c[t>>2]=c[Ta>>2];c[t+4>>2]=14104;Ta=fd(0,Oa,1024,14101,t)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}case 48:{c[u>>2]=Sa;c[u+4>>2]=Pa;c[u+8>>2]=Ma;c[u+12>>2]=Ka;c[u+16>>2]=Na;if(!(gd(f,0,h,Ha,14113,u)|0)){k=_a[c[Qa+12>>2]&15](Qa,Fa,Ja,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;if(!k){p=c[Sa>>2]|0;m=c[Fa>>2]|0;n=f+552|0;o=f+556|0;g=c[o>>2]|0;q:do if((g|0)!=(n|0)){k=g;while(1){if((c[k+8>>2]|0)==(p|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=190;break q}}if(k){Qa=c[La>>2]|0;Wa=k+12|0;db[c[Qa+4>>2]&15](Qa,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=190}else Ua=190;while(0);if((Ua|0)==190){Wa=Lg(16)|0;c[Wa+8>>2]=p;c[Wa+12>>2]=m;c[o>>2]=Wa;c[Wa>>2]=n;c[Wa+4>>2]=g;c[g>>2]=Wa}Mg(c[Ma>>2]|0);Mg(c[Ka>>2]|0);c[za>>2]=Ja;Wa=fd(0,Oa,1024,14008,za)|0;k=Wa+7|0;g=Lg(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ei(g+7|0,Oa|0,Wa|0)|0;Kc(f,g,0,h,0,k,1)|0;Nc(f,0,h,k);Mg(g);g=0;k=0}else g=5}else{g=2;k=0}switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 50:{c[v>>2]=Sa;if(gd(f,0,h,Ha,14119,v)|0){Ua=262;break a}Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}case 51:{c[w>>2]=Sa;c[w+4>>2]=Pa;c[w+8>>2]=Na;r:do if(!(gd(f,0,h,Ha,14121,w)|0)){g=c[Sa>>2]|0;p=f+552|0;q=f+556|0;k=c[q>>2]|0;s:do if((k|0)!=(p|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0))break s}if(k|0){k=c[k+12>>2]|0;c[Ma>>2]=k;if(!k)break r;m=vf(e[Na>>1]<<2)|0;Wa=b[Na>>1]|0;n=Lg((Wa&65535)<<4)|0;t:do if(!(Wa<<16>>16)){g=0;Ua=209}else{k=0;do{c[Ea>>2]=m+(k<<2);k=k+1|0;if(gd(f,0,h,Ha,14019,Ea)|0){k=-71;break t}g=b[Na>>1]|0}while(k>>>0<(g&65535)>>>0);g=g&65535;k=c[Ma>>2]|0;Ua=209}while(0);if((Ua|0)==209)k=_a[c[Qa+16>>2]&15](Qa,Ma,n,k,g,m)|0;if(b[Na>>1]|0){g=0;do{Mg(c[m+(g<<2)>>2]|0);g=g+1|0}while(g>>>0<(e[Na>>1]|0)>>>0)}Mg(m);if((k|0)<0){Mg(n);break a}c[Ga>>2]=k;g=fd(0,Oa,1024,14119,Ga)|0;if(!k)o=g;else{m=0;do{c[Ia>>2]=n+(m<<4);g=(fd(0,Oa+g|0,1024-g|0,14008,Ia)|0)+g|0;m=m+1|0}while((m|0)<(k|0));o=g}Mg(n);n=c[Pa>>2]|0;m=c[Ma>>2]|0;g=c[q>>2]|0;u:do if((g|0)!=(p|0)){k=g;while(1){if((c[k+8>>2]|0)==(n|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0)){Ua=223;break u}}if(k){Ta=c[La>>2]|0;Wa=k+12|0;db[c[Ta+4>>2]&15](Ta,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=223}else Ua=223;while(0);if((Ua|0)==223){Wa=Lg(16)|0;c[Wa+8>>2]=n;c[Wa+12>>2]=m;c[q>>2]=Wa;c[Wa>>2]=p;c[Wa+4>>2]=g;c[g>>2]=Wa}Ua=o+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,o|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);c[Ma>>2]=0}while(0);Ua=262;break a}case 54:{c[x>>2]=Sa;c[x+4>>2]=Na;c[x+8>>2]=Pa;v:do if((gd(f,0,h,Ha,14056,x)|0)==0?(S=c[Sa>>2]|0,T=f+552|0,N=c[f+556>>2]|0,(N|0)!=(T|0)):0){k=N;while(1){if((c[k+8>>2]|0)==(S|0))break;k=c[k+4>>2]|0;if((k|0)==(T|0))break v}if(k|0?(ga=c[k+12>>2]|0,ga|0):0){k=c[Pa>>2]|0;g=Lg(k+4|0)|0;Wa=Na;k=_a[c[Qa+48>>2]&15](Qa,ga,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0){Mg(g);break a}a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,g|0,k+4|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Mg(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 55:{c[y>>2]=Sa;c[y+4>>2]=Na;c[y+8>>2]=Pa;w:do if((gd(f,0,h,Ha,14056,y)|0)==0?(U=c[Sa>>2]|0,V=f+552|0,O=c[f+556>>2]|0,(O|0)!=(V|0)):0){k=O;while(1){if((c[k+8>>2]|0)==(U|0))break;k=c[k+4>>2]|0;if((k|0)==(V|0))break w}if(k|0?(ha=c[k+12>>2]|0,ha|0):0){Wa=c[Pa>>2]|0;g=Lg(Wa)|0;if(Kc(f,g,0,h,c[Ha>>2]|0,Wa,0)|0){Mg(g);break}k=Na;k=_a[c[Qa+52>>2]&15](Qa,ha,c[k>>2]|0,c[k+4>>2]|0,g,c[Pa>>2]|0)|0;Mg(g);if((k|0)<0)break a;c[fa>>2]=k;Ta=fd(0,Oa,1024,14017,fa)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Oa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 56:{c[z>>2]=Sa;if(gd(f,0,h,Ha,14017,z)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;x:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break x}if(k|0){Ua=c[La>>2]|0;db[c[Ua+4>>2]&15](Ua,c[k+12>>2]|0);Ua=c[k>>2]|0;Wa=c[k+4>>2]|0;c[Ua+4>>2]=Wa;c[Wa>>2]=Ua;Mg(k)}}while(0);Wa=Lg(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Kc(f,Wa,0,h,0,7,1)|0;Nc(f,0,h,7);Mg(Wa);Wa=0;l=Va;return Wa|0}default:{c[A>>2]=Ra;hi(14125,A)|0;Ua=262;break a}}while(0)}else{i=0;j=0;Ua=262}while(0);if((Ua|0)==262)k=-71;c[Ta>>2]=0-k;Ta=fd(0,Sa,4,14017,Ta)|0;Ua=Ta+7|0;Wa=Lg(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=7;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ei(Wa+7|0,Sa|0,Ta|0)|0;Kc(f,Wa,0,h,0,Ua,1)|0;Nc(f,0,h,Ua);Mg(Wa);Wa=0;l=Va;return Wa|0}function fd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;c[k>>2]=g;j=d+e|0;e=a[f>>0]|0;if(!(e<<24>>24)){k=d;d=k-d|0;l=m;return d|0}b=d;a:while(1){f=f+1|0;switch(e<<24>>24|0){case 98:{e=b+1|0;if(e>>>0>j>>>0){e=5;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;b=e;break}case 104:{e=b+2|0;if(e>>>0>j>>>0){e=8;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;b=e;break}case 119:{e=b+4|0;if(e>>>0>j>>>0){e=11;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=i>>>8;a[b+2>>0]=i>>>16;a[b+3>>0]=i>>>24;b=e;break}case 100:{e=b+8|0;if(e>>>0>j>>>0){e=14;break a}g=(c[k>>2]|0)+(8-1)&~(8-1);i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;c[k>>2]=g+8;a[b>>0]=h;a[b+1>>0]=h>>>8;a[b+2>>0]=h>>>16;a[b+3>>0]=h>>>24;a[b+4>>0]=i;a[b+5>>0]=Ai(h|0,i|0,40)|0;a[b+6>>0]=Ai(h|0,i|0,48)|0;a[b+7>>0]=Ai(h|0,i|0,56)|0;b=e;break}case 115:{i=(c[k>>2]|0)+(4-1)&~(4-1);h=c[i>>2]|0;c[k>>2]=i+4;i=_g(h)|0;if((i|0)>=65536){e=17;break a}e=b+2|0;g=e+i|0;if(g>>>0>j>>>0){e=19;break a}a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;Ei(e|0,h|0,i|0)|0;b=g;break}case 81:{e=b+13|0;if(e>>>0>j>>>0){e=22;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=a[i>>0]|0;h=c[i+4>>2]|0;a[b+1>>0]=h;a[b+2>>0]=h>>>8;a[b+3>>0]=h>>>16;a[b+4>>0]=h>>>24;i=i+8|0;h=c[i>>2]|0;i=c[i+4>>2]|0;a[b+5>>0]=h;a[b+6>>0]=h>>>8;a[b+7>>0]=h>>>16;a[b+8>>0]=h>>>24;a[b+9>>0]=i;a[b+10>>0]=Ai(h|0,i|0,40)|0;a[b+11>>0]=Ai(h|0,i|0,48)|0;a[b+12>>0]=Ai(h|0,i|0,56)|0;b=e;break}default:{e=24;break a}}e=a[f>>0]|0;if(!(e<<24>>24)){e=26;break}}if((e|0)==5)ja(14158,13903,1783,14177);else if((e|0)==8)ja(14186,13903,1793,14177);else if((e|0)==11)ja(14205,13903,1803,14177);else if((e|0)==14)ja(14224,13903,1813,14177);else if((e|0)==17)ja(14243,13903,1832,14177);else if((e|0)==19)ja(14256,13903,1833,14177);else if((e|0)==22)ja(14281,13903,1843,14177);else if((e|0)==24)ra();else if((e|0)==26){k=b;d=k-d|0;l=m;return d|0}return 0}function gd(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;x=l;l=l+32|0;u=x+16|0;v=x;m=c[h>>2]|0;c[u>>2]=j;k=a[i>>0]|0;a:do if(k<<24>>24){n=v+1|0;o=v+2|0;p=v+3|0;q=v+4|0;r=v+5|0;s=v+6|0;t=v+7|0;j=m;b:while(1){i=i+1|0;switch(k<<24>>24|0){case 98:{if(Kc(e,v,f,g,j,1,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;a[m>>0]=a[v>>0]|0;j=j+1|0;break}case 104:{if(Kc(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;b[m>>1]=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;break}case 119:{if(Kc(e,v,f,g,j,4,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;j=j+4|0;break}case 100:{if(Kc(e,v,f,g,j,8,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;k=(d[r>>0]|0)<<8|(d[q>>0]|0)|(d[s>>0]|0)<<16|(d[t>>0]|0)<<24;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;c[m+4>>2]=k;j=j+8|0;break}case 115:{if(Kc(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}m=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;k=Lg(m+1|0)|0;if(Kc(e,k,f,g,j,m,0)|0){j=-1;k=18;break b}a[k+m>>0]=0;z=(c[u>>2]|0)+(4-1)&~(4-1);y=c[z>>2]|0;c[u>>2]=z+4;c[y>>2]=k;j=m+j|0;break}default:{k=15;break b}}k=a[i>>0]|0;if(!(k<<24>>24)){w=j;break a}}if((k|0)==15)ra();else if((k|0)==18){l=x;return j|0}}else w=m;while(0);c[h>>2]=w;z=0;l=x;return z|0}function hd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[e>>2]|0;a=c[e+4>>2]|0;id(b,d,e);c[f+560>>2]=0;Hc(f,a);return}function id(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+64|0;k=m+40|0;j=m+32|0;g=m+48|0;h=m;i=c[f>>2]|0;if((e|0)<0){d=c[f+4>>2]|0;h=c[f+8>>2]|0;n=b[f+12>>1]|0;c[j>>2]=0-e;e=fd(0,g,4,14017,j)|0;j=e+7|0;k=Lg(j)|0;a[k>>0]=j;a[k+1>>0]=j>>>8;a[k+2>>0]=j>>>16;a[k+3>>0]=j>>>24;a[k+4>>0]=7;a[k+5>>0]=n;a[k+6>>0]=(n&65535)>>>8;Ei(k+7|0,g|0,e|0)|0;Kc(i,k,d,h,0,j,1)|0;Nc(i,d,h,j);Mg(k);Mg(f);l=m;return}else{e=(c[i+548>>2]|0)+-24|0;c[k>>2]=d;c[k+4>>2]=e;e=fd(0,h,32,14e3,k)|0;g=c[f+4>>2]|0;j=c[f+8>>2]|0;d=b[f+12>>1]|0;k=e+7|0;n=Lg(k)|0;a[n>>0]=k;a[n+1>>0]=k>>>8;a[n+2>>0]=k>>>16;a[n+3>>0]=k>>>24;a[n+4>>0]=13;a[n+5>>0]=d;a[n+6>>0]=(d&65535)>>>8;Ei(n+7|0,h|0,e|0)|0;Kc(i,n,g,j,0,k,1)|0;Nc(i,g,j,k);Mg(n);Mg(f);l=m;return}}function jd(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+32|0;d=e+16|0;c[d>>2]=b;_a[c[a+16>>2]&15](a,d,e,b,0,0)|0;l=e;return c[d>>2]|0}function kd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;p=r+20|0;j=r+24|0;k=r+16|0;q=r;c[p>>2]=d;i=(f|0)==0;n=b+16|0;o=b+4|0;m=1;g=(a[e>>0]|0)==47?e+1|0:e;while(1){h=ch(g,47)|0;if(!h){c[j>>2]=g;if(!i){e=5;break}g=1;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0}else{e=h-g|0;s=Lg(e+1|0)|0;c[j>>2]=s;Ei(s|0,g|0,e|0)|0;a[s+e>>0]=0;e=_a[c[n>>2]&15](b,k,q,d,1,j)|0;Mg(c[j>>2]|0);g=0}if(!m)db[c[o>>2]&15](b,c[p>>2]|0);d=c[k>>2]|0;c[p>>2]=d;if((e|0)<1){e=13;break}if(g){e=15;break}else{m=0;g=h+1|0}}if((e|0)==5){c[f>>2]=g;if(!m){s=d;l=r;return s|0}if((_a[c[n>>2]&15](b,p,q,d,0,0)|0)<0){c[p>>2]=0;s=0;l=r;return s|0}else{s=c[p>>2]|0;l=r;return s|0}}else if((e|0)==13){db[c[o>>2]&15](b,d);c[p>>2]=0;s=0;l=r;return s|0}else if((e|0)==15){l=r;return d|0}return 0}function ld(a,b,c){a=a|0;b=b|0;c=c|0;return kd(a,b,c,0)|0}function md(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=l;l=l+16|0;e=m;b=vf(208)|0;c[b>>2]=9;c[b+4>>2]=7;c[b+8>>2]=8;c[b+12>>2]=1;c[b+16>>2]=2;c[b+20>>2]=3;c[b+24>>2]=4;c[b+28>>2]=1;c[b+32>>2]=10;c[b+36>>2]=1;c[b+40>>2]=9;c[b+44>>2]=5;c[b+48>>2]=6;c[b+52>>2]=7;c[b+56>>2]=1;c[b+60>>2]=8;c[b+64>>2]=1;c[b+68>>2]=2;c[b+72>>2]=6;c[b+76>>2]=11;c[b+80>>2]=12;c[b+84>>2]=13;n=b+88|0;c[n>>2]=n;o=b+92|0;c[o>>2]=n;j=b+128|0;f=j;c[f>>2]=1;c[f+4>>2]=0;f=b+136|0;c[f>>2]=12;g=b+140|0;c[g>>2]=4096;h=b+104|0;c[h>>2]=1048576;c[h+4>>2]=0;h=b+120|0;c[h>>2]=262144;c[h+4>>2]=0;h=b+148|0;c[h>>2]=h;c[b+152>>2]=h;h=b+168|0;c[h>>2]=67108864;c[h+4>>2]=0;h=b+176|0;c[h>>2]=h;c[b+180>>2]=h;h=b+184|0;c[h>>2]=h;c[b+188>>2]=h;h=b+192|0;c[h>>2]=h;c[b+196>>2]=h;h=vf(104)|0;i=h+16|0;c[i>>2]=1;c[h+20>>2]=0;p=j;d=c[p+4>>2]|0;k=h+8|0;c[k>>2]=c[p>>2];c[k+4>>2]=d;k=j;k=pi(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[j>>2]=k;c[j+4>>2]=y;j=h+24|0;c[j>>2]=4;c[h+28>>2]=511;c[h+32>>2]=0;c[h+36>>2]=0;k=h+56|0;c[k>>2]=k;c[h+60>>2]=k;d=c[o>>2]|0;c[o>>2]=h;c[h>>2]=n;c[h+4>>2]=d;c[d>>2]=h;d=b+96|0;n=d;n=pi(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;c[d>>2]=n;c[d+4>>2]=y;Oa(e|0,0)|0;d=c[e>>2]|0;c[h+40>>2]=d;e=(c[e+4>>2]|0)*1e3|0;c[h+48>>2]=e;c[h+44>>2]=d;c[h+52>>2]=e;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)!=4)ja(14301,14319,456,14328);p=vf(18)|0;c[p+8>>2]=h;d=p+13|0;a[d>>0]=46;a[d+1>>0]=0;d=h+64|0;e=c[d>>2]|0;o=e+18|0;t=pi(c[g>>2]|0,0,-1,-1)|0;s=y;n=pi(t|0,s|0,o|0,((o|0)<0)<<31>>31|0)|0;r=c[f>>2]|0;n=Ai(n|0,y|0,r|0)|0;q=y;e=pi(t|0,s|0,e|0,((e|0)<0)<<31>>31|0)|0;r=Ai(e|0,y|0,r|0)|0;e=b+112|0;s=e;r=qi(c[s>>2]|0,c[s+4>>2]|0,r|0,y|0)|0;q=pi(r|0,y|0,n|0,q|0)|0;n=e;c[n>>2]=q;c[n+4>>2]=y;c[d>>2]=o;o=c[k>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[p+4>>2]=k;c[k>>2]=p;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)==4){t=vf(19)|0;c[t+8>>2]=h;o=t+13|0;a[o>>0]=a[14342]|0;a[o+1>>0]=a[14343]|0;a[o+2>>0]=a[14344]|0;o=c[d>>2]|0;s=o+19|0;j=pi(c[g>>2]|0,0,-1,-1)|0;n=y;r=pi(j|0,n|0,s|0,((s|0)<0)<<31>>31|0)|0;p=c[f>>2]|0;r=Ai(r|0,y|0,p|0)|0;q=y;o=pi(j|0,n|0,o|0,((o|0)<0)<<31>>31|0)|0;p=Ai(o|0,y|0,p|0)|0;o=e;p=qi(c[o>>2]|0,c[o+4>>2]|0,p|0,y|0)|0;q=pi(p|0,y|0,r|0,q|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;c[d>>2]=s;s=c[k>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[t+4>>2]=k;c[k>>2]=t;c[b+144>>2]=h;l=m;return b|0}else ja(14301,14319,456,14328);return 0}function nd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+88|0;b=c[a+92>>2]|0;if((b|0)!=(h|0))do{e=b;b=c[b+4>>2]|0;c[e+16>>2]=0;if((c[e+24>>2]|0)==4){g=e+56|0;f=e+60|0;d=c[f>>2]|0;if((d|0)!=(g|0))do{j=d+4|0;i=d;d=c[j>>2]|0;k=c[i>>2]|0;c[k+4>>2]=d;c[d>>2]=k;c[i>>2]=0;c[j>>2]=0;Mg(i)}while((d|0)!=(g|0));c[g>>2]=g;c[f>>2]=g}Kd(a,e)}while((b|0)!=(h|0));k=a+148|0;if((c[k+4>>2]|0)==(k|0)){Mg(c[a+200>>2]|0);return}else ja(15144,14319,1527,15178)}function od(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+8|0;if(c[d>>2]|0)c[d>>2]=0;d=b+16|0;e=c[d>>2]|0;if(e|0){f=c[e+4>>2]|0;if(f|0)c[f>>2]=0;Mg(e);c[d>>2]=0}d=c[b+4>>2]|0;e=d+20|0;f=c[e>>2]|0;if((f|0)<=0)ja(14992,14319,397,15011);c[e>>2]=f+-1;if((f|0)!=1){Mg(b);return}if((c[d+16>>2]|0)>=1){Mg(b);return}Kd(a,d);Mg(b);return}function pd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=1024;d=a+120|0;e=d;f=a+136|0;e=Bi(c[e>>2]|0,c[e+4>>2]|0,(c[f>>2]|0)+-10|0)|0;g=b+8|0;c[g>>2]=e;c[g+4>>2]=y;g=a+112|0;g=qi(c[d>>2]|0,c[d+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0)|0;f=Bi(g|0,y|0,(c[f>>2]|0)+-10|0)|0;g=y;d=b+16|0;c[d>>2]=f;c[d+4>>2]=g;d=b+24|0;c[d>>2]=f;c[d+4>>2]=g;d=a+104|0;g=d;f=c[g+4>>2]|0;e=b+32|0;c[e>>2]=c[g>>2];c[e+4>>2]=f;a=a+96|0;a=qi(c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;b=b+40|0;c[b>>2]=a;c[b+4>>2]=y;return}function qd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=b+144|0;g=c[b>>2]|0;h=vf(20)|0;i=g+20|0;c[i>>2]=(c[i>>2]|0)+1;c[h+4>>2]=g;c[h>>2]=f;c[d>>2]=h;b=c[b>>2]|0;d=c[b+24>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;g=b+8|0;h=c[g+4>>2]|0;i=e+8|0;c[i>>2]=c[g>>2];c[i+4>>2]=h;return 0}function rd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=c[f+4>>2]|0;a:do if((g|0)>0){b=0;do{k=c[h+(b<<2)>>2]|0;if((c[i+24>>2]|0)!=4)break a;l=i+56|0;j=c[i+60>>2]|0;if((j|0)==(l|0))break a;while(1){if(!(Zg(j+13|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(l|0))break a}if(!j)break a;i=c[j+8>>2]|0;j=e+(b<<4)|0;k=c[i+24>>2]|0;do if((k|0)!=4)if((k|0)==10){a[j>>0]=2;break}else{a[j>>0]=0;break}else a[j>>0]=-128;while(0);c[e+(b<<4)+4>>2]=0;j=i+8|0;k=c[j+4>>2]|0;l=e+(b<<4)+8|0;c[l>>2]=c[j>>2];c[l+4>>2]=k;b=b+1|0}while((b|0)<(g|0))}else b=0;while(0);h=c[f>>2]|0;f=vf(20)|0;g=i+20|0;c[g>>2]=(c[g>>2]|0)+1;c[f+4>>2]=i;c[f>>2]=h;c[d>>2]=f;return b|0}function sd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;s=l;l=l+16|0;n=s;q=c[e+4>>2]|0;r=q+24|0;if((c[r>>2]|0)!=4){d=-20;l=s;return d|0}p=q+56|0;i=c[q+60>>2]|0;a:do if((i|0)!=(p|0)){while(1){if(!(Zg(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(p|0))break a}if(i|0){d=-17;l=s;return d|0}}while(0);j=c[e>>2]|0;k=vf(104)|0;e=k+16|0;c[e>>2]=1;c[k+20>>2]=0;m=b+128|0;u=m;t=c[u+4>>2]|0;o=k+8|0;i=o;c[i>>2]=c[u>>2];c[i+4>>2]=t;i=m;i=pi(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[m>>2]=i;c[m+4>>2]=y;m=k+24|0;c[m>>2]=4;c[k+28>>2]=g&4095;c[k+32>>2]=j;c[k+36>>2]=h;j=k+56|0;c[j>>2]=j;c[k+60>>2]=j;g=b+92|0;h=c[g>>2]|0;c[g>>2]=k;c[k>>2]=b+88;c[k+4>>2]=h;c[h>>2]=k;h=b+96|0;g=h;g=pi(c[g>>2]|0,c[g+4>>2]|0,1,0)|0;c[h>>2]=g;c[h+4>>2]=y;Oa(n|0,0)|0;h=c[n>>2]|0;c[k+40>>2]=h;n=(c[n+4>>2]|0)*1e3|0;c[k+48>>2]=n;c[k+44>>2]=h;c[k+52>>2]=n;c[e>>2]=(c[e>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);u=vf(18)|0;c[u+8>>2]=k;e=u+13|0;a[e>>0]=46;a[e+1>>0]=0;e=k+64|0;i=c[e>>2]|0;t=i+18|0;g=b+140|0;z=pi(c[g>>2]|0,0,-1,-1)|0;x=y;v=pi(z|0,x|0,t|0,((t|0)<0)<<31>>31|0)|0;h=b+136|0;w=c[h>>2]|0;v=Ai(v|0,y|0,w|0)|0;n=y;i=pi(z|0,x|0,i|0,((i|0)<0)<<31>>31|0)|0;w=Ai(i|0,y|0,w|0)|0;i=b+112|0;b=i;b=qi(c[b>>2]|0,c[b+4>>2]|0,w|0,y|0)|0;n=pi(b|0,y|0,v|0,n|0)|0;b=i;c[b>>2]=n;c[b+4>>2]=y;c[e>>2]=t;t=c[j>>2]|0;c[t+4>>2]=u;c[u>>2]=t;c[u+4>>2]=j;c[j>>2]=u;u=q+16|0;c[u>>2]=(c[u>>2]|0)+1;if((c[m>>2]|0)!=4)ja(14301,14319,456,14328);z=vf(19)|0;c[z+8>>2]=q;t=z+13|0;a[t>>0]=a[14342]|0;a[t+1>>0]=a[14343]|0;a[t+2>>0]=a[14344]|0;t=c[e>>2]|0;x=t+19|0;n=pi(c[g>>2]|0,0,-1,-1)|0;b=y;w=pi(n|0,b|0,x|0,((x|0)<0)<<31>>31|0)|0;u=c[h>>2]|0;w=Ai(w|0,y|0,u|0)|0;v=y;t=pi(n|0,b|0,t|0,((t|0)<0)<<31>>31|0)|0;u=Ai(t|0,y|0,u|0)|0;t=i;u=qi(c[t>>2]|0,c[t+4>>2]|0,u|0,y|0)|0;v=pi(u|0,y|0,w|0,v|0)|0;w=i;c[w>>2]=v;c[w+4>>2]=y;c[e>>2]=x;x=c[j>>2]|0;c[x+4>>2]=z;c[z>>2]=x;c[z+4>>2]=j;c[j>>2]=z;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);x=_g(f)|0;w=x+17|0;z=vf(w)|0;c[z+8>>2]=k;Ei(z+13|0,f|0,x+1|0)|0;x=q+64|0;r=c[x>>2]|0;w=r+w|0;f=pi(c[g>>2]|0,0,-1,-1)|0;q=y;u=pi(f|0,q|0,w|0,((w|0)<0)<<31>>31|0)|0;t=c[h>>2]|0;u=Ai(u|0,y|0,t|0)|0;v=y;r=pi(f|0,q|0,r|0,((r|0)<0)<<31>>31|0)|0;t=Ai(r|0,y|0,t|0)|0;r=i;t=qi(c[r>>2]|0,c[r+4>>2]|0,t|0,y|0)|0;v=pi(t|0,y|0,u|0,v|0)|0;c[i>>2]=v;c[i+4>>2]=y;c[x>>2]=w;i=c[p>>2]|0;c[i+4>>2]=z;c[z>>2]=i;c[z+4>>2]=p;c[p>>2]=z;i=c[m>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;w=o;x=c[w+4>>2]|0;z=d+8|0;c[z>>2]=c[w>>2];c[z+4>>2]=x;z=0;l=s;return z|0}function td(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=c[e+4>>2]|0;l=e+8|0;if(c[l>>2]|0)c[l>>2]=0;i=e+16|0;j=c[i>>2]|0;if(j|0){k=c[j+4>>2]|0;if(k|0)c[k>>2]=0;Mg(j);c[i>>2]=0}j=u+24|0;i=c[j>>2]|0;a:do if(f&65536){if((i|0)!=4){h=-20;return h|0}}else{switch(i|0){case 4:case 8:break a;default:i=-22}return i|0}while(0);c[e+12>>2]=f;b:do if((c[j>>2]|0)==8){if(!((f&512|0)==0|(f&3|0)==0))Qd(b,u,0,0)|0;t=u+56|0;c:do switch(c[t>>2]|0){case 0:break b;case 1:{k=u+80|0;j=c[k>>2]|0;k=c[k+4>>2]|0;f=b+176|0;i=c[b+180>>2]|0;d:do if((i|0)!=(f|0)){while(1){s=i+8|0;if((c[s>>2]|0)==(j|0)?(c[s+4>>2]|0)==(k|0):0)break;i=c[i+4>>2]|0;if((i|0)==(f|0))break d}s=i+16|0;i=c[i+20>>2]|0;if((i|0)!=(s|0)){q=b+184|0;r=b+188|0;do{k=c[i+12>>2]|0;e:do if(!(c[i+8>>2]|0)){j=Od(b,k)|0;if((j|0?(c[j+24>>2]|0)==8:0)?(c[j+56>>2]|0)==1:0)Rd(b,j,0)|0}else{j=c[r>>2]|0;if((j|0)!=(q|0)){while(1){if(!(Zg(c[j+8>>2]|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(q|0))break e}if(j|0){o=Od(b,k)|0;do if((o|0?(c[o+24>>2]|0)==8:0)?(c[o+56>>2]|0)==1:0){p=j+12|0;n=j+16|0;k=c[n>>2]|0;if((k|0)==(p|0))break e;f=0;d=0;m=0;do{l=Od(b,c[k+24>>2]|0)|0;do if(l){if((c[l+24>>2]|0)!=8)break;f=(c[l+56>>2]|0)==1?1:f}while(0);l=k+16|0;m=pi(c[l>>2]|0,c[l+4>>2]|0,m|0,d|0)|0;d=y;k=c[k+4>>2]|0}while((k|0)!=(p|0));if(!f)break e;if(!((d|0)==0?(m|0)==(c[o+60>>2]|0):0))break;Rd(b,o,1)|0;j=c[n>>2]|0;if((j|0)==(p|0))break e;m=o+96|0;l=0;d=0;while(1){k=j+24|0;f=Od(b,c[k>>2]|0)|0;f:do if(f|0){if((c[f+24>>2]|0)!=8)break;if((c[f+56>>2]|0)!=1)break;o=j+16|0;do if((c[o+4>>2]|0)==0?(c[o>>2]|0)==(c[f+60>>2]|0):0){n=f+80|0;o=j+8|0;if(!((c[n>>2]|0)==(c[o>>2]|0)?(c[n+4>>2]|0)==(c[o+4>>2]|0):0))break;Rd(b,f,2)|0;o=f+96|0;k=c[o>>2]|0;f=k+24|0;n=(c[m>>2]|0)+40|0;v=c[n>>2]|0;c[v+4>>2]=f;c[f>>2]=v;c[k+28>>2]=n;c[n>>2]=f;o=(c[o>>2]|0)+32|0;c[o>>2]=l;c[o+4>>2]=d;break f}while(0);k=Od(b,c[k>>2]|0)|0;if(!k)break;if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Rd(b,k,0)|0}while(0);v=j+16|0;l=pi(c[v>>2]|0,c[v+4>>2]|0,l|0,d|0)|0;j=c[j+4>>2]|0;if((j|0)==(p|0))break e;else d=y}}while(0);f=j+12|0;j=c[j+16>>2]|0;if((j|0)!=(f|0))do{k=Od(b,c[j+24>>2]|0)|0;do if(k|0){if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Rd(b,k,0)|0}while(0);j=c[j+4>>2]|0}while((j|0)!=(f|0))}}}while(0);i=c[i+4>>2]|0}while((i|0)!=(s|0));if((c[t>>2]|0)==2)break c}}while(0);i=Rd(b,u,0)|0;if(i|0){v=i;return v|0}v=c[u+96>>2]|0;c[v+48>>2]=e;c[v+52>>2]=g;c[v+56>>2]=h;v=1;return v|0}case 2:break;case 3:{h=u+88|0;v=c[h>>2]|0;g=u+92|0;e=c[g>>2]|0;c[v+4>>2]=e;c[e>>2]=v;c[h>>2]=0;c[g>>2]=0;e=b+148|0;b=e+4|0;v=c[b>>2]|0;c[b>>2]=h;c[h>>2]=e;c[g>>2]=v;c[v>>2]=h;break b}default:ra()}while(0);i=c[u+96>>2]|0;j=i+52|0;if(c[j>>2]|0){v=-5;return v|0}c[i+48>>2]=e;c[j>>2]=g;c[i+56>>2]=h;v=1;return v|0}while(0);c[l>>2]=1;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=u+8|0;h=c[g+4>>2]|0;v=d+8|0;c[v>>2]=c[g>>2];c[v+4>>2]=h;v=0;return v|0}function ud(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+16|0;u=x;w=e+4|0;v=c[w>>2]|0;r=v+24|0;if((c[r>>2]|0)!=4){d=-20;l=x;return d|0}s=v+56|0;j=c[v+60>>2]|0;a:do if((j|0)!=(s|0)){while(1){if(!(Zg(j+13|0,f)|0))break;j=c[j+4>>2]|0;if((j|0)==(s|0))break a}if(j|0){d=-17;l=x;return d|0}}while(0);t=e+8|0;if(c[t>>2]|0)c[t>>2]=0;j=e+16|0;k=c[j>>2]|0;if(k|0){m=c[k+4>>2]|0;if(m|0)c[m>>2]=0;Mg(k);c[j>>2]=0}m=c[e>>2]|0;n=vf(104)|0;c[n+16>>2]=1;o=n+20|0;c[o>>2]=0;p=b+128|0;z=p;j=c[z+4>>2]|0;q=n+8|0;k=q;c[k>>2]=c[z>>2];c[k+4>>2]=j;k=p;k=pi(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[p>>2]=k;c[p+4>>2]=y;p=n+24|0;c[p>>2]=8;c[n+28>>2]=h&4095;c[n+32>>2]=m;c[n+36>>2]=i;Ga(n+64|0);h=b+92|0;i=c[h>>2]|0;c[h>>2]=n;c[n>>2]=b+88;c[n+4>>2]=i;c[i>>2]=n;i=b+96|0;h=i;h=pi(c[h>>2]|0,c[h+4>>2]|0,1,0)|0;c[i>>2]=h;c[i+4>>2]=y;Oa(u|0,0)|0;i=c[u>>2]|0;c[n+40>>2]=i;u=(c[u+4>>2]|0)*1e3|0;c[n+48>>2]=u;c[n+44>>2]=i;c[n+52>>2]=u;if((c[r>>2]|0)!=4)ja(14301,14319,456,14328);k=_g(f)|0;m=k+17|0;j=vf(m)|0;c[j+8>>2]=n;Ei(j+13|0,f|0,k+1|0)|0;k=v+64|0;z=c[k>>2]|0;m=z+m|0;f=pi(c[b+140>>2]|0,0,-1,-1)|0;h=y;u=pi(f|0,h|0,m|0,((m|0)<0)<<31>>31|0)|0;i=c[b+136>>2]|0;u=Ai(u|0,y|0,i|0)|0;v=y;z=pi(f|0,h|0,z|0,((z|0)<0)<<31>>31|0)|0;i=Ai(z|0,y|0,i|0)|0;z=b+112|0;h=z;i=qi(c[h>>2]|0,c[h+4>>2]|0,i|0,y|0)|0;v=pi(i|0,y|0,u|0,v|0)|0;c[z>>2]=v;c[z+4>>2]=y;c[k>>2]=m;k=c[s>>2]|0;c[k+4>>2]=j;c[j>>2]=k;c[j+4>>2]=s;c[s>>2]=j;j=c[w>>2]|0;k=j+20|0;m=c[k>>2]|0;if((m|0)<=0)ja(14992,14319,397,15011);c[k>>2]=m+-1;if((m|0)==1?(c[j+16>>2]|0)<1:0)Kd(b,j);c[o>>2]=(c[o>>2]|0)+1;c[w>>2]=n;c[t>>2]=1;c[e+12>>2]=g;j=c[p>>2]|0;do if((j|0)!=4)if((j|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=q;w=c[g+4>>2]|0;z=d+8|0;c[z>>2]=c[g>>2];c[z+4>>2]=w;z=0;l=x;return z|0}function vd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;h=i+24|0;d=c[h>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;d=i+8|0;g=c[d+4>>2]|0;f=e+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=g;c[e+16>>2]=c[h>>2]<<12|c[i+28>>2];c[e+20>>2]=c[i+32>>2];c[e+24>>2]=c[i+36>>2];f=c[i+16>>2]|0;g=e+32|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;switch(c[h>>2]|0){case 2:case 6:{d=c[i+56>>2]<<8|c[i+60>>2];f=0;break}default:{d=0;f=0}}g=e+40|0;c[g>>2]=d;c[g+4>>2]=f;g=b+140|0;f=e+56|0;c[f>>2]=c[g>>2];c[f+4>>2]=0;switch(c[h>>2]|0){case 8:{d=c[i+60>>2]|0;f=0;break}case 10:{d=_g(c[i+56>>2]|0)|0;f=0;break}case 4:{f=c[i+64>>2]|0;d=f;f=((f|0)<0)<<31>>31;break}default:{d=0;f=0}}h=e+48|0;c[h>>2]=d;c[h+4>>2]=f;g=c[g>>2]|0;h=pi(d|0,f|0,-1,-1)|0;g=pi(h|0,y|0,g|0,0)|0;b=c[b+136>>2]|0;g=Ai(g|0,y|0,b|0)|0;b=Bi(g|0,y|0,b+-9|0)|0;g=e+64|0;c[g>>2]=b;c[g+4>>2]=y;g=i+40|0;b=e+72|0;c[b>>2]=c[g>>2];c[b+4>>2]=0;b=i+48|0;c[e+80>>2]=c[b>>2];h=e+88|0;c[h>>2]=c[g>>2];c[h+4>>2]=0;c[e+96>>2]=c[b>>2];b=e+104|0;c[b>>2]=c[i+44>>2];c[b+4>>2]=0;c[e+112>>2]=c[i+52>>2];return 0}function wd(a,b,d,e,f,g,h,i,j,k,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0;p=l;l=l+16|0;n=p;m=c[b+4>>2]|0;if(d&1|0)c[m+28>>2]=e;if(d&2|0)c[m+32>>2]=f;if(d&4|0)c[m+36>>2]=g;if(d&8|0?(s=Qd(a,m,h,i)|0,s|0):0){i=s;l=p;return i|0}do if(d&32|0)if(!(d&256)){Oa(n|0,0)|0;c[m+40>>2]=c[n>>2];c[m+48>>2]=(c[n+4>>2]|0)*1e3;break}else{c[m+40>>2]=o;c[m+48>>2]=q;break}while(0);if(!(d&64)){i=0;l=p;return i|0}Oa(n|0,0)|0;c[m+44>>2]=c[n>>2];c[m+52>>2]=(c[n+4>>2]|0)*1e3;i=0;l=p;return i|0}function xd(a,b){a=a|0;b=b|0;var d=0;a=b+8|0;if(c[a>>2]|0)c[a>>2]=0;a=b+16|0;b=c[a>>2]|0;if(!b)return;d=c[b+4>>2]|0;if(d|0)c[d>>2]=0;Mg(b);c[a>>2]=0;return}function yd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;return h|0}if((c[b+24>>2]|0)!=4){h=-71;return h|0}m=b+56|0;b=c[b+60>>2]|0;a:do if((e|0)==0&(f|0)==0){e=b;i=0;d=0}else{i=0;d=0;while(1){if((b|0)==(m|0)){b=0;break}i=pi(i|0,d|0,1,0)|0;d=y;b=c[b+4>>2]|0;if(!(d>>>0<f>>>0|(d|0)==(f|0)&i>>>0<e>>>0)){e=b;break a}}return b|0}while(0);if((e|0)==(m|0)){h=0;return h|0}b=0;while(1){f=e+13|0;j=_g(f)|0;k=b+24|0;l=k+j|0;if((l|0)>(h|0)){d=11;break}i=pi(i|0,d|0,1,0)|0;d=y;p=c[e+8>>2]|0;n=p+24|0;o=c[n>>2]|0;a[g+b>>0]=(o|0)==4?-128:(o|0)==10?2:0;o=g+(b+1)|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;a[o+3>>0]=0;o=g+(b+5)|0;p=p+8|0;q=c[p>>2]|0;p=c[p+4>>2]|0;a[o>>0]=q;a[o+1>>0]=q>>>8;a[o+2>>0]=q>>>16;a[o+3>>0]=q>>>24;a[o+4>>0]=p;r=Ai(q|0,p|0,40)|0;a[o+5>>0]=r;r=Ai(q|0,p|0,48)|0;a[o+6>>0]=r;p=Ai(q|0,p|0,56)|0;a[o+7>>0]=p;o=g+(b+13)|0;a[o>>0]=i;a[o+1>>0]=i>>>8;a[o+2>>0]=i>>>16;a[o+3>>0]=i>>>24;a[o+4>>0]=d;p=Ai(i|0,d|0,40)|0;a[o+5>>0]=p;p=Ai(i|0,d|0,48)|0;a[o+6>>0]=p;p=Ai(i|0,d|0,56)|0;a[o+7>>0]=p;a[g+(b+21)>>0]=c[n>>2];b=g+(b+22)|0;a[b>>0]=j;a[b+1>>0]=(j&65535)>>>8;Ei(g+k|0,f|0,j|0)|0;e=c[e+4>>2]|0;if((e|0)==(m|0)){b=l;d=11;break}else b=l}if((d|0)==11)return b|0;return 0}function zd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=c[b+4>>2]|0;if(!(c[b+8>>2]|0)){g=-71;return g|0}if((c[h+24>>2]|0)!=8){g=-5;return g|0}if((c[b+12>>2]&3|0)==1){g=-5;return g|0}if(!(c[h+100>>2]|0)){i=c[h+60>>2]|0;a=qi(i|0,0,d|0,e|0)|0;b=y;if(!(0>e>>>0|0==(e|0)&i>>>0>d>>>0)){i=0;return i|0}i=((g|0)<0)<<31>>31;i=b>>>0<i>>>0|(b|0)==(i|0)&a>>>0<g>>>0?a:g;Ha(h+64|0,d|0,f|0,i|0);return i|0}else{a=c[b+16>>2]|0;if(!a){i=-5;return i|0}i=c[a+8>>2]|0;i=(i|0)<(g|0)?i:g;Ei(f|0,a+12|0,i|0)|0;return i|0}return 0}function Ad(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=l;l=l+4480|0;k=L+4448|0;A=L+4472|0;F=L+3408|0;H=L+2384|0;B=L+1360|0;J=L+336|0;x=L+208|0;v=L+80|0;z=L+4432|0;I=L+4464|0;w=L+4460|0;G=L+64|0;q=L+4456|0;m=L+4452|0;j=L;s=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;l=L;return h|0}if((c[s+24>>2]|0)!=8){h=-5;l=L;return h|0}if(!(c[d+12>>2]&3)){h=-5;l=L;return h|0}if(!h){h=0;l=L;return h|0}if(!(c[s+100>>2]|0)){f=pi(h|0,((h|0)<0)<<31>>31|0,e|0,f|0)|0;i=y;j=s+60|0;if(i>>>0>0|((i|0)==0?f>>>0>(c[j>>2]|0)>>>0:0)?(p=Qd(b,s,f,i)|0,p|0):0){h=p;l=L;return h|0}Oa(A|0,0)|0;c[s+40>>2]=c[A>>2];c[s+48>>2]=(c[A+4>>2]|0)*1e3;f=s+56|0;do if((c[f>>2]|0)==3){K=s+88|0;H=c[K>>2]|0;J=s+92|0;I=c[J>>2]|0;c[H+4>>2]=I;c[I>>2]=H;c[K>>2]=0;c[J>>2]=0;J=b+160|0;K=J;K=qi(c[K>>2]|0,c[K+4>>2]|0,c[j>>2]|0,0)|0;b=y;c[J>>2]=K;c[J+4>>2]=b;if((b|0)>-1|(b|0)==-1&K>>>0>4294967295){c[f>>2]=0;break}else ja(14470,14319,1283,14936)}while(0);La(s+64|0,e|0,g|0,h|0);l=L;return h|0}e=Lg(h+1|0)|0;Ei(e|0,g|0,h|0)|0;a[e+h>>0]=0;c[m>>2]=e;a:do if((se(j,64,m)|0)<0)K=104;else{do if(!(Zg(j,14688)|0)){f=c[d>>2]|0;c[A>>2]=c[m>>2];p=d+16|0;b:do if((((((c[p>>2]|0)==0?(se(J,1024,A)|0)>=0:0)?(se(x,128,A)|0)>=0:0)?(se(v,128,A)|0)>=0:0)?(se(H,1024,A)|0)>=0:0)?(se(F,1024,A)|0)>=0:0){do if(((se(B,1024,A)|0)>=0?(r=_g(B)|0,(r&1|0)==0):0)?(t=r>>1,(r|0)<=33):0){if((ze(G,B,t)|0)<0)break;if((r|0)<0){f=-5;break b}if((ve(q,A)|0)<0){f=-5;break b}o=(t|0)==0;if((t|16|0)!=16){f=-5;break b}m=(a[x>>0]|0)==0?0:x;k=(a[v>>0]|0)==0?0:v;if(_a[c[b+12>>2]&15](b,I,z,f,34812,34812)|0)ja(14692,14319,2526,14740);n=kd(b,c[I>>2]|0,F,w)|0;do if(!n){f=-2;i=b+4|0}else{Xa[c[b+76>>2]&31](b,n,c[w>>2]|0)|0;f=$a[c[b+28>>2]&3](b,z,n,c[w>>2]|0,514,384,0)|0;c:do if((f|0)<0)j=0;else{do if(a[H>>0]|0){j=ld(b,c[I>>2]|0,H)|0;if(!j){j=0;f=-2;break c}f=_a[c[b+24>>2]&15](b,z,j,0,0,0)|0;if((f|0)<0)break c;f=c[j+4>>2]|0;if((c[f+24>>2]|0)!=8)ja(14751,14319,2555,14740);if(!(c[f+56>>2]|0)){C=j;D=c[f+60>>2]|0;E=0;break}else ja(14751,14319,2555,14740)}else{C=0;D=0;E=0}while(0);i=vf(260)|0;c[i+4>>2]=c[I>>2];c[i+8>>2]=n;c[i+12>>2]=C;if(o)f=0;else{f=i+16|0;Bf(G,128,f)|0}I=vf(76)|0;c[I>>2]=0;c[I+8>>2]=0;c[I+4>>2]=i;c[i>>2]=d;c[p>>2]=I;le(b,n,J,m,k,C,D,E,2,i,f);f=0;break b}while(0);i=b+4|0;db[c[i>>2]&15](b,n);if(!j)break;db[c[i>>2]&15](b,j)}while(0);db[c[i>>2]&15](b,c[I>>2]|0);break b}while(0);f=-5}else f=-5;while(0)}else{if(!(Zg(j,14806)|0)){c[A>>2]=c[m>>2];d:do if((((se(H,1024,A)|0)>=0?(se(J,1024,A)|0)>=0:0)?(se(x,128,A)|0)>=0:0)?(se(v,128,A)|0)>=0:0){do if(((se(B,1024,A)|0)>=0?(i=_g(B)|0,(i&1|0)==0):0)?(o=i>>1,(i|0)<=33):0){if((ze(G,B,o)|0)<0)break;if((i|0)<0){f=-22;break d}j=(a[x>>0]|0)==0?0:x;i=(a[v>>0]|0)==0?0:v;switch(o|0){case 0:{f=0;break}case 16:{Bf(G,128,F)|0;f=F;break}default:{f=-22;break d}}Nd(b,H,J,j,i,f);f=0;break d}while(0);f=-22}else f=-22;while(0);break}if(!(Zg(j,14819)|0)){c[A>>2]=c[m>>2];e:do if((se(B,1024,A)|0)>=0){if((c[b>>2]|0)!=9)ja(14834,14319,1665,14849);i=b+192|0;f=c[i+4>>2]|0;if((f|0)!=(i|0)){while(1){if(!(Zg(c[f+12>>2]|0,B)|0))break;f=c[f+4>>2]|0;if((f|0)==(i|0)){f=0;break e}}if(f){Ld(f);f=0}else f=0}else f=0}else f=-22;while(0);break}if(!(Zg(j,14871)|0)){c[A>>2]=c[m>>2];if((((se(J,1024,A)|0)>=0?(se(B,1024,A)|0)>=0:0)?(xe(F,A)|0)>=0:0)?(ue(H,A)|0)>=0:0){f=Od(b,J)|0;if(!f)f=-2;else{I=F;J=H;f=Pd(b,f,B,c[I>>2]|0,c[I+4>>2]|0,c[J>>2]|0,c[J+4>>2]|0)|0}}else f=-22;break}if(!(Zg(j,14879)|0)){c[A>>2]=c[m>>2];f:do if((se(B,1024,A)|0)>=0){f=Od(b,B)|0;if(f)if((c[f+24>>2]|0)==8){switch(c[f+56>>2]|0){case 3:case 0:break;default:{f=-5;break f}}I=Jh(B,47)|0;J=f+60|0;b=Lg(c[J>>2]|0)|0;Ha(f+64|0,0,b|0,c[J>>2]|0);Ma(((I|0)==0?B:I+1|0)|0,b|0,c[J>>2]|0);Mg(b);f=0}else f=-5;else f=-2}else f=-5;while(0);break}if(Zg(j,14891)|0){if(Zg(j,14898)|0){c[k>>2]=j;hi(14913,k)|0;K=104;break a}c[A>>2]=c[m>>2];if((se(B,1024,A)|0)<0)f=-22;else{f=b+200|0;Mg(c[f>>2]|0);c[f>>2]=Lh(B)|0;f=0}break}c[A>>2]=c[m>>2];j=d+16|0;g:do if(!(c[j>>2]|0)){do if(((se(B,1024,A)|0)>=0?(n=_g(B)|0,(n&1|0)==0):0)?(u=n>>1,(n|0)<=2049):0){if((ze(J,B,u)|0)<0)break;if((n|0)<0){f=-22;break g}do if((se(B,1024,A)|0)<0)f=-1;else{f=_g(B)|0;if(f&1|0){f=-1;break}i=f>>1;if((f|0)>257){f=-1;break}f=(ze(x,B,i)|0)<0;f=f?-1:i}while(0);if((ve(F,A)|0)<0){f=-22;break g}if((ve(H,A)|0)<0){f=-22;break g}if(((c[H>>2]|0)+-1|0)>>>0>63){f=-22;break g}b=vf(76)|0;c[b>>2]=1;I=c[H>>2]|0;c[b+8>>2]=I;oe(J,u,x,f,c[F>>2]|0,I,b+12|0);c[j>>2]=b;f=0;break g}while(0);f=-22}else f=-5;while(0)}while(0);Mg(e);f=(f|0)==0?h:f}while(0);if((K|0)==104){Mg(e);f=-5}h=f;l=L;return h|0}function Bd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[b+4>>2]|0;g=c[d+4>>2]|0;if((c[g+24>>2]|0)==4){e=-1;return e|0}d=h+24|0;a:do if((c[d>>2]|0)==4?(i=h+56|0,f=c[h+60>>2]|0,(f|0)!=(i|0)):0){b=f;while(1){if(!(Zg(b+13|0,e)|0))break;b=c[b+4>>2]|0;if((b|0)==(i|0))break a}if(b|0){e=-17;return e|0}}while(0);i=g+16|0;c[i>>2]=(c[i>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);j=_g(e)|0;l=j+17|0;i=vf(l)|0;c[i+8>>2]=g;Ei(i+13|0,e|0,j+1|0)|0;e=h+56|0;h=h+64|0;j=c[h>>2]|0;g=j+l|0;l=pi(c[a+140>>2]|0,0,-1,-1)|0;k=y;d=pi(l|0,k|0,g|0,((g|0)<0)<<31>>31|0)|0;b=c[a+136>>2]|0;d=Ai(d|0,y|0,b|0)|0;f=y;j=pi(l|0,k|0,j|0,((j|0)<0)<<31>>31|0)|0;b=Ai(j|0,y|0,b|0)|0;a=a+112|0;j=a;b=qi(c[j>>2]|0,c[j+4>>2]|0,b|0,y|0)|0;f=pi(b|0,y|0,d|0,f|0)|0;c[a>>2]=f;c[a+4>>2]=y;c[h>>2]=g;a=c[e>>2]|0;c[a+4>>2]=i;c[i>>2]=a;c[i+4>>2]=e;c[e>>2]=i;e=0;return e|0}function Cd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=l;l=l+16|0;k=o;m=c[e+4>>2]|0;n=m+24|0;a:do if((c[n>>2]|0)==4?(j=m+56|0,i=c[m+60>>2]|0,(i|0)!=(j|0)):0){while(1){if(!(Zg(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(j|0))break a}if(i|0){d=-17;l=o;return d|0}}while(0);p=c[e>>2]|0;i=vf(104)|0;c[i+16>>2]=1;c[i+20>>2]=0;j=b+128|0;s=j;r=c[s+4>>2]|0;e=i+8|0;q=e;c[q>>2]=c[s>>2];c[q+4>>2]=r;q=j;q=pi(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[j>>2]=q;c[j+4>>2]=y;j=i+24|0;c[j>>2]=10;c[i+28>>2]=511;c[i+32>>2]=p;c[i+36>>2]=h;p=b+92|0;h=c[p>>2]|0;c[p>>2]=i;c[i>>2]=b+88;c[i+4>>2]=h;c[h>>2]=i;h=b+96|0;p=h;p=pi(c[p>>2]|0,c[p+4>>2]|0,1,0)|0;c[h>>2]=p;c[h+4>>2]=y;Oa(k|0,0)|0;h=c[k>>2]|0;c[i+40>>2]=h;k=(c[k+4>>2]|0)*1e3|0;c[i+48>>2]=k;c[i+44>>2]=h;c[i+52>>2]=k;c[i+56>>2]=Lh(g)|0;if((c[n>>2]|0)!=4)ja(14301,14319,456,14328);r=_g(f)|0;q=r+17|0;s=vf(q)|0;c[s+8>>2]=i;Ei(s+13|0,f|0,r+1|0)|0;i=m+56|0;r=m+64|0;p=c[r>>2]|0;q=p+q|0;g=pi(c[b+140>>2]|0,0,-1,-1)|0;h=y;m=pi(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;k=c[b+136>>2]|0;m=Ai(m|0,y|0,k|0)|0;n=y;p=pi(g|0,h|0,p|0,((p|0)<0)<<31>>31|0)|0;k=Ai(p|0,y|0,k|0)|0;p=b+112|0;h=p;k=qi(c[h>>2]|0,c[h+4>>2]|0,k|0,y|0)|0;n=pi(k|0,y|0,m|0,n|0)|0;c[p>>2]=n;c[p+4>>2]=y;c[r>>2]=q;r=c[i>>2]|0;c[r+4>>2]=s;c[s>>2]=r;c[s+4>>2]=i;c[i>>2]=s;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;q=e;r=c[q+4>>2]|0;s=d+8|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;s=0;l=o;return s|0}function Dd(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;s=l;l=l+16|0;q=s;n=c[e+4>>2]|0;r=g>>>12;o=r&15;r=r&255;switch(r&15){case 1:case 2:case 6:case 8:case 12:break;default:{d=-22;l=s;return d|0}}p=n+24|0;a:do if((c[p>>2]|0)==4?(m=n+56|0,k=c[n+60>>2]|0,(k|0)!=(m|0)):0){while(1){if(!(Zg(k+13|0,f)|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break a}if(k|0){d=-17;l=s;return d|0}}while(0);t=c[e>>2]|0;k=vf(104)|0;c[k+16>>2]=1;c[k+20>>2]=0;m=b+128|0;w=m;v=c[w+4>>2]|0;e=k+8|0;u=e;c[u>>2]=c[w>>2];c[u+4>>2]=v;u=m;u=pi(c[u>>2]|0,c[u+4>>2]|0,1,0)|0;c[m>>2]=u;c[m+4>>2]=y;m=k+24|0;c[m>>2]=o;c[k+28>>2]=g&4095;c[k+32>>2]=t;c[k+36>>2]=j;switch(r&15){case 8:{Ga(k+64|0);break}case 4:{w=k+56|0;c[w>>2]=w;c[k+60>>2]=w;break}default:{}}w=b+92|0;v=c[w>>2]|0;c[w>>2]=k;c[k>>2]=b+88;c[k+4>>2]=v;c[v>>2]=k;v=b+96|0;w=v;w=pi(c[w>>2]|0,c[w+4>>2]|0,1,0)|0;c[v>>2]=w;c[v+4>>2]=y;Oa(q|0,0)|0;v=c[q>>2]|0;c[k+40>>2]=v;w=(c[q+4>>2]|0)*1e3|0;c[k+48>>2]=w;c[k+44>>2]=v;c[k+52>>2]=w;if((o|4|0)==6){c[k+56>>2]=h;c[k+60>>2]=i}if((c[p>>2]|0)!=4)ja(14301,14319,456,14328);v=_g(f)|0;u=v+17|0;w=vf(u)|0;c[w+8>>2]=k;Ei(w+13|0,f|0,v+1|0)|0;k=n+56|0;v=n+64|0;t=c[v>>2]|0;u=t+u|0;h=pi(c[b+140>>2]|0,0,-1,-1)|0;i=y;q=pi(h|0,i|0,u|0,((u|0)<0)<<31>>31|0)|0;j=c[b+136>>2]|0;q=Ai(q|0,y|0,j|0)|0;r=y;t=pi(h|0,i|0,t|0,((t|0)<0)<<31>>31|0)|0;j=Ai(t|0,y|0,j|0)|0;t=b+112|0;i=t;j=qi(c[i>>2]|0,c[i+4>>2]|0,j|0,y|0)|0;r=pi(j|0,y|0,q|0,r|0)|0;c[t>>2]=r;c[t+4>>2]=y;c[v>>2]=u;v=c[k>>2]|0;c[v+4>>2]=w;c[w>>2]=v;c[w+4>>2]=k;c[k>>2]=w;k=c[m>>2]|0;do if((k|0)!=4)if((k|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;u=e;v=c[u+4>>2]|0;w=d+8|0;c[w>>2]=c[u>>2];c[w+4>>2]=v;w=0;l=s;return w|0}function Ed(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[f+4>>2]|0;if((c[b+24>>2]|0)!=10){e=-5;return e|0}f=c[b+56>>2]|0;b=_g(f)|0;e=e+-1|0;e=(b|0)<(e|0)?b:e;Ei(d|0,f|0,e|0)|0;a[d+e>>0]=0;e=0;return e|0}function Fd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=b+4|0;b=c[l>>2]|0;if((c[b+24>>2]|0)!=4){a=-2;return a|0}h=b+56|0;b=c[b+60>>2]|0;if((b|0)==(h|0)){a=-2;return a|0}k=b;while(1){if(!(Zg(k+13|0,d)|0))break;b=c[k+4>>2]|0;if((b|0)==(h|0)){b=-2;i=28;break}else k=b}if((i|0)==28)return b|0;if(!k){a=-2;return a|0}e=e+4|0;h=c[e>>2]|0;d=h+24|0;a:do if((c[d>>2]|0)==4?(j=h+56|0,g=c[h+60>>2]|0,(g|0)!=(j|0)):0){while(1){if(!(Zg(g+13|0,f)|0))break;b=c[g+4>>2]|0;if((b|0)==(j|0)){e=0;break a}else g=b}if(g){b=c[g+8>>2]|0;if((c[b+24>>2]|0)==4){a=-17;return a|0}else{Jd(a,h,g);h=c[e>>2]|0;e=b;d=h+24|0;break}}else e=0}else e=0;while(0);b=k+8|0;g=c[b>>2]|0;j=g+16|0;c[j>>2]=(c[j>>2]|0)+1;if((c[d>>2]|0)!=4)ja(14301,14319,456,14328);i=_g(f)|0;p=i+17|0;j=vf(p)|0;c[j+8>>2]=g;Ei(j+13|0,f|0,i+1|0)|0;g=h+56|0;h=h+64|0;i=c[h>>2]|0;f=i+p|0;p=pi(c[a+140>>2]|0,0,-1,-1)|0;o=y;m=pi(p|0,o|0,f|0,((f|0)<0)<<31>>31|0)|0;n=c[a+136>>2]|0;m=Ai(m|0,y|0,n|0)|0;d=y;i=pi(p|0,o|0,i|0,((i|0)<0)<<31>>31|0)|0;n=Ai(i|0,y|0,n|0)|0;i=a+112|0;o=i;n=qi(c[o>>2]|0,c[o+4>>2]|0,n|0,y|0)|0;d=pi(n|0,y|0,m|0,d|0)|0;c[i>>2]=d;c[i+4>>2]=y;c[h>>2]=f;h=c[g>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[j+4>>2]=g;c[g>>2]=j;h=c[b>>2]|0;Jd(a,c[l>>2]|0,k);b=h+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)==1?(c[h+20>>2]|0)<1:0)Kd(a,h);if(!e){p=0;return p|0}b=e+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(14345,14319,389,14362);c[b>>2]=g+-1;if((g|0)!=1){p=0;return p|0}if((c[e+20>>2]|0)>=1){p=0;return p|0}Kd(a,e);p=0;return p|0}function Gd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!(Zg(d,19070)|0)){o=-2;return o|0}if(!(Zg(d,14342)|0)){o=-2;return o|0}m=b+4|0;g=c[m>>2]|0;if((c[g+24>>2]|0)!=4){o=-2;return o|0}f=g+56|0;b=c[g+60>>2]|0;if((b|0)==(f|0)){o=-2;return o|0}while(1){if(!(Zg(b+13|0,d)|0))break;e=c[b+4>>2]|0;if((e|0)==(f|0)){k=-2;l=30;break}else b=e}if((l|0)==30)return k|0;if(!b){o=-2;return o|0}i=b+8|0;j=c[i>>2]|0;do if((c[j+24>>2]|0)==4){h=j+56|0;e=c[j+60>>2]|0;a:do if((e|0)!=(h|0)){f=e;do{d=f+13|0;if(Zg(d,19070)|0?Zg(d,14342)|0:0){k=-39;l=30;break}f=c[f+4>>2]|0}while((f|0)!=(h|0));if((l|0)==30)return k|0;while(1){d=e;e=c[e+4>>2]|0;f=c[d+8>>2]|0;Jd(a,j,d);d=f+16|0;g=c[d>>2]|0;if((g|0)<=0)break;c[d>>2]=g+-1;if((g|0)==1?(c[f+20>>2]|0)<1:0)Kd(a,f);if((e|0)==(h|0))break a}ja(14345,14319,389,14362)}while(0);if(!(c[j+64>>2]|0)){n=c[m>>2]|0;o=c[i>>2]|0;break}else ja(14375,14319,576,14394)}else{n=g;o=j}while(0);Jd(a,n,b);b=o+16|0;e=c[b>>2]|0;if((e|0)<=0)ja(14345,14319,389,14362);c[b>>2]=e+-1;if((e|0)!=1){o=0;return o|0}if((c[o+20>>2]|0)>=1){o=0;return o|0}Kd(a,o);o=0;return o|0}function Hd(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Id(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Jd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=_g(d+13|0)|0;e=b+64|0;i=c[e>>2]|0;b=-17-k+i|0;k=pi(c[a+140>>2]|0,0,-1,-1)|0;j=y;f=pi(k|0,j|0,b|0,((b|0)<0)<<31>>31|0)|0;h=c[a+136>>2]|0;f=Ai(f|0,y|0,h|0)|0;g=y;i=pi(k|0,j|0,i|0,((i|0)<0)<<31>>31|0)|0;h=Ai(i|0,y|0,h|0)|0;a=a+112|0;i=a;h=qi(c[i>>2]|0,c[i+4>>2]|0,h|0,y|0)|0;g=pi(h|0,y|0,f|0,g|0)|0;f=a;c[f>>2]=g;c[f+4>>2]=y;c[e>>2]=b;if((b|0)<=-1)ja(14639,14319,554,14658);k=a;j=c[k+4>>2]|0;if((j|0)>-1|(j|0)==-1&(c[k>>2]|0)>>>0>4294967295){j=c[d>>2]|0;k=c[d+4>>2]|0;c[j+4>>2]=k;c[k>>2]=j;Mg(d);return}else ja(14451,14319,555,14658)}function Kd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c[b+16>>2]|0)ja(14404,14319,334,14421);if(c[b+20>>2]|0)ja(14432,14319,335,14421);a:do switch(c[b+24>>2]|0){case 8:{d=b+60|0;k=c[a+140>>2]|0;k=Ai(pi(pi(c[d>>2]|0,0,-1,-1)|0,y|0,k|0,0)|0,y|0,c[a+136>>2]|0)|0;h=a+112|0;i=h;k=qi(c[i>>2]|0,c[i+4>>2]|0,k|0,y|0)|0;i=y;c[h>>2]=k;c[h+4>>2]=i;if(!((i|0)>-1|(i|0)==-1&k>>>0>4294967295))ja(14451,14319,339,14421);Ia(b+64|0);switch(c[b+56>>2]|0){case 0:break a;case 3:{k=b+88|0;h=c[k>>2]|0;i=b+92|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[k>>2]=0;c[i>>2]=0;i=a+160|0;k=i;k=qi(c[k>>2]|0,c[k+4>>2]|0,c[d>>2]|0,0)|0;j=y;c[i>>2]=k;c[i+4>>2]=j;if((j|0)>-1|(j|0)==-1&k>>>0>4294967295){Ld(c[b+72>>2]|0);break a}else ja(14470,14319,348,14421);break}case 2:{k=c[b+96>>2]|0;d=c[k+8>>2]|0;if(d|0)fe(d);i=k+4|0;d=c[i>>2]|0;do if((d|0)==1){h=k+40|0;d=c[k+44>>2]|0;if((d|0)!=(h|0)){while(1){e=d;d=c[d+4>>2]|0;e=c[e+-12>>2]|0;f=e+56|0;if((c[f>>2]|0)!=2){e=18;break}g=c[e+96>>2]|0;c[f>>2]=1;Ia(e+64|0);e=c[g+52>>2]|0;if(e|0)fb[e&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){e=g+24|0;m=c[e>>2]|0;f=g+28|0;l=c[f>>2]|0;c[m+4>>2]=l;c[l>>2]=m;c[e>>2]=0;c[f>>2]=0}e=c[g+16>>2]|0;if(e|0)ke(e);Mg(g);if((d|0)==(h|0)){e=26;break}}if((e|0)==18)ja(14496,14319,754,14532);else if((e|0)==26){j=c[i>>2]|0;e=27;break}}}else{j=d;e=27}while(0);if((e|0)==27?(j|0)==2:0){l=k+24|0;i=c[l>>2]|0;m=k+28|0;j=c[m>>2]|0;c[i+4>>2]=j;c[j>>2]=i;c[l>>2]=0;c[m>>2]=0}d=c[k+16>>2]|0;if(d|0)ke(d);Mg(k);Ld(c[b+72>>2]|0);break a}case 1:{Ld(c[b+72>>2]|0);break a}default:ra()}break}case 10:{Mg(c[b+56>>2]|0);break}case 4:{if((c[b+60>>2]|0)!=(b+56|0))ja(14550,14319,376,14421);break}default:{}}while(0);m=c[b>>2]|0;l=c[b+4>>2]|0;c[m+4>>2]=l;c[l>>2]=m;Mg(b);b=a+96|0;l=b;m=c[l>>2]|0;l=c[l+4>>2]|0;a=pi(m|0,l|0,-1,-1)|0;c[b>>2]=a;c[b+4>>2]=y;if((l|0)>0|(l|0)==0&m>>>0>0)return;else ja(14580,14319,384,14421)}function Ld(a){a=a|0;var b=0,d=0;b=a+8|0;d=c[b>>2]|0;if((d|0)<=0)ja(14601,14319,1609,14620);d=d+-1|0;c[b>>2]=d;if(d|0)return;Mg(c[a+12>>2]|0);Mg(c[a+16>>2]|0);Mg(c[a+20>>2]|0);Mg(c[a+24>>2]|0);b=c[a>>2]|0;d=c[a+4>>2]|0;c[b+4>>2]=d;c[d>>2]=b;Mg(a);return}function Md(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;d=c[g+8>>2]|0;if(d|0)db[c[b+4>>2]&15](b,d);h=c[g+12>>2]|0;d=b+4|0;if(h|0)db[c[d>>2]&15](b,h);db[c[d>>2]&15](b,c[g+4>>2]|0);d=c[g>>2]|0;if(!d){Mg(g);return}b=c[d+16>>2]|0;h=(f|0)<0;e=h?e:0;a[b+12>>0]=e;a[b+13>>0]=e>>>8;a[b+14>>0]=e>>>16;a[b+15>>0]=e>>>24;c[b+8>>2]=4;c[b+4>>2]=0;Mg(g);return}function Nd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((c[a>>2]|0)!=9)ja(14834,14319,1629,14972);h=a+192|0;a=c[h+4>>2]|0;a:do if((a|0)!=(h|0)){while(1){if(!(Zg(c[a+12>>2]|0,b)|0))break;a=c[a+4>>2]|0;if((a|0)==(h|0)){i=8;break a}}if(a){Mg(c[a+16>>2]|0);Mg(c[a+20>>2]|0);Mg(c[a+24>>2]|0);h=a}else i=8}else i=8;while(0);if((i|0)==8){i=vf(276)|0;c[i+12>>2]=Lh(b)|0;c[i+8>>2]=1;b=c[h>>2]|0;c[b+4>>2]=i;c[i>>2]=b;c[i+4>>2]=h;c[h>>2]=i;h=i}c[h+16>>2]=Lh(d)|0;if(!e)a=0;else a=Lh(e)|0;c[h+20>>2]=a;if(!f)a=0;else a=Lh(f)|0;c[h+24>>2]=a;a=h+28|0;if(!g){c[a>>2]=0;return}else{c[a>>2]=1;Ei(h+32|0,g|0,244)|0;return}}function Od(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+1024|0;g=h;if(!b){g=0;l=h;return g|0}b=c[b+144>>2]|0;d=(a[d>>0]|0)==47?d+1|0:d;a:do if(a[d>>0]|0)while(1){e=ch(d,47)|0;if(!e){f=_g(d)|0;e=0}else{f=e-d|0;e=e+1|0}if(f>>>0>1023){b=0;break a}Ei(g|0,d|0,f|0)|0;a[g+f>>0]=0;if((c[b+24>>2]|0)!=4){b=0;break a}d=b+56|0;b=c[b+60>>2]|0;if((b|0)==(d|0)){b=0;break a}while(1){if(!(Zg(b+13|0,g)|0))break;b=c[b+4>>2]|0;if((b|0)==(d|0)){b=0;break a}}if(!b){b=0;break a}b=c[b+8>>2]|0;if(!e)break;else d=e}while(0);g=b;l=h;return g|0}function Pd(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if((c[a>>2]|0)!=9)ja(14834,14319,1687,14957);k=a+192|0;i=c[k+4>>2]|0;if((i|0)==(k|0)){l=-2;return l|0}j=i;while(1){if(!(Zg(c[j+12>>2]|0,d)|0))break;i=c[j+4>>2]|0;if((i|0)==(k|0)){i=-2;l=13;break}else j=i}if((l|0)==13)return i|0;if(!j){l=-2;return l|0}if((c[b+24>>2]|0)!=8){l=-5;return l|0}i=b+56|0;if(c[i>>2]|0){l=-5;return l|0}if(c[b+68>>2]|0){l=-5;return l|0}if((g|0)==0&(h|0)==0){l=0;return l|0}c[i>>2]=1;c[b+72>>2]=j;l=j+8|0;c[l>>2]=(c[l>>2]|0)+1;c[b+60>>2]=g;l=c[a+140>>2]|0;g=pi(g|0,h|0,-1,-1)|0;g=pi(g|0,y|0,l|0,0)|0;g=Ai(g|0,y|0,c[a+136>>2]|0)|0;l=a+112|0;h=l;h=pi(g|0,y|0,c[h>>2]|0,c[h+4>>2]|0)|0;c[l>>2]=h;c[l+4>>2]=y;l=b+80|0;c[l>>2]=e;c[l+4>>2]=f;l=0;return l|0}function Qd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((c[b+24>>2]|0)!=8){l=-22;return l|0}if(e>>>0>0|(e|0)==0&d>>>0>4294967295){l=-28;return l|0}j=b+60|0;f=c[j>>2]|0;h=d-f|0;if(!h){l=0;return l|0}m=pi(c[a+140>>2]|0,0,-1,-1)|0;g=y;i=pi(m|0,g|0,d|0,e|0)|0;k=c[a+136>>2]|0;i=Ai(i|0,y|0,k|0)|0;l=y;g=pi(m|0,g|0,f|0,0)|0;k=Ai(g|0,y|0,k|0)|0;k=qi(i|0,l|0,k|0,y|0)|0;l=b+56|0;a:do switch(c[l>>2]|0){case 1:{if((d|0)==0&(e|0)==0)c[l>>2]=0;break}case 0:case 3:{if((h|0)<=0){f=(c[b+68>>2]<<2>>>0)/5|0;if(!(0<e>>>0|0==(e|0)&f>>>0<d>>>0)?(Ja(b+64|0,f|0)|0)<0:0){m=-28;return m|0}}else{i=a+112|0;i=pi(c[i>>2]|0,c[i+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;n=y;m=a+120|0;g=c[m+4>>2]|0;if(n>>>0>g>>>0|((n|0)==(g|0)?i>>>0>(c[m>>2]|0)>>>0:0)){n=-28;return n|0}i=b+64|0;g=c[b+68>>2]|0;do if(0<e>>>0|0==(e|0)&g>>>0<d>>>0){n=(g*5|0)>>>2;if((Ja(i|0,(0<e>>>0|0==(e|0)&n>>>0<d>>>0?d:n)|0)|0)<0){n=-28;return n|0}else{f=c[j>>2]|0;break}}while(0);Ka(i|0,f|0,0,h|0)}if((c[l>>2]|0)==3){n=b+88|0;i=c[n>>2]|0;b=b+92|0;m=c[b>>2]|0;c[i+4>>2]=m;c[m>>2]=i;c[n>>2]=0;c[b>>2]=0;b=a+160|0;n=b;n=qi(c[n>>2]|0,c[n+4>>2]|0,c[j>>2]|0,0)|0;m=y;c[b>>2]=n;c[b+4>>2]=m;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){c[l>>2]=0;break a}else ja(14470,14319,1240,14945)}break}case 2:{n=-5;return n|0}default:ra()}while(0);l=a+112|0;n=l;n=pi(c[n>>2]|0,c[n+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;m=y;c[l>>2]=n;c[l+4>>2]=m;if(!((m|0)>-1|(m|0)==-1&n>>>0>4294967295))ja(14451,14319,1248,14945);c[j>>2]=d;n=0;return n|0}function Rd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;p=q;j=b+56|0;if((c[j>>2]|0)!=1)ja(15026,14319,848,15063);k=b+60|0;m=c[k>>2]|0;o=a+160|0;r=o;r=pi(c[r>>2]|0,c[r+4>>2]|0,m|0,0)|0;t=y;h=a+168|0;g=h;s=c[g+4>>2]|0;do if((t|0)>(s|0)|((t|0)==(s|0)?r>>>0>(c[g>>2]|0)>>>0:0)?(i=a+148|0,e=c[i>>2]|0,(e|0)!=(i|0)):0){f=e+-32|0;if((c[f>>2]|0)!=3)ja(15076,14319,684,15111);g=e;while(1){e=g;g=c[g>>2]|0;if(!(c[e+-68>>2]|0)){Ia(e+-24|0);c[f>>2]=1;s=c[e>>2]|0;f=e+4|0;t=c[f>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[e>>2]=0;c[f>>2]=0;f=o;e=qi(c[f>>2]|0,c[f+4>>2]|0,c[e+-28>>2]|0,0)|0;f=y;t=o;c[t>>2]=e;c[t+4>>2]=f;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){f=10;break}s=pi(e|0,f|0,m|0,0)|0;f=y;t=h;r=c[t+4>>2]|0;if((g|0)==(i|0)|((f|0)<(r|0)|((f|0)==(r|0)?s>>>0<=(c[t>>2]|0)>>>0:0))){f=14;break}}else if((g|0)==(i|0)){f=14;break}f=g+-32|0;if((c[f>>2]|0)!=3){f=7;break}}if((f|0)==7)ja(15076,14319,684,15111);else if((f|0)==10)ja(14470,14319,697,15111);else if((f|0)==14){n=c[k>>2]|0;break}}else n=m;while(0);if((Ja(b+64|0,n|0)|0)<0){t=-5;l=q;return t|0}c[j>>2]=2;g=vf(64)|0;c[g+20>>2]=0;c[g>>2]=a;c[g+12>>2]=b;c[g+4>>2]=d;switch(d|0){case 2:break;case 1:{f=g+40|0;c[f>>2]=f;c[g+44>>2]=f;f=18;break}default:f=18}if((f|0)==18){f=b+80|0;ye(p,c[f>>2]|0,c[f+4>>2]|0)|0;f=c[b+72>>2]|0;e=pe(c[f+16>>2]|0,p)|0;if(c[f+28>>2]|0)c[g+16>>2]=he(f+32|0,14,g)|0;c[g+8>>2]=ge(e,c[f+20>>2]|0,c[f+24>>2]|0,g,5,0)|0}c[b+96>>2]=g;t=0;l=q;return t|0}function Sd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a+12>>2]|0;a=a+20|0;e=c[a>>2]|0;g=(c[f+60>>2]|0)-e|0;d=g>>>0>d>>>0?d:g;La(f+64|0,e|0,b|0,d|0);c[a>>2]=d+(c[a>>2]|0);return 0}function Td(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1024|0;n=q;j=a+12|0;p=c[j>>2]|0;do if((b|0)>=0){f=a+16|0;g=c[f>>2]|0;if(!g){g=p+60|0;m=a+20|0;r=c[m>>2]|0;f=(c[g>>2]|0)-r|0;f=f>>>0>e>>>0?e:f;La(p+64|0,r|0,d|0,f|0);f=f+(c[m>>2]|0)|0;c[m>>2]=f;if(b){l=q;return}}else{if((ie(g,d,e)|0)<0)break;if(b|0){l=q;return}if((je(c[f>>2]|0)|0)<0)break;g=p+60|0;f=c[a+20>>2]|0}if((f|0)==(c[g>>2]|0)){if((c[a+4>>2]|0)==1?(o=a+40|0,i=c[a+44>>2]|0,(i|0)!=(o|0)):0){m=(c[j>>2]|0)+64|0;do{f=i;i=c[i+4>>2]|0;j=c[f+-12>>2]|0;k=j+60|0;g=c[k>>2]|0;if(g|0){b=f+8|0;a=j+64|0;f=0;h=0;d=0;e=c[b>>2]|0;b=c[b+4>>2]|0;while(1){f=qi(g|0,f|0,h|0,d|0)|0;r=y;s=r>>>0<0|(r|0)==0&f>>>0<1024;f=s?f:1024;r=s?r:0;Ha(m|0,e|0,n|0,f|0);La(a|0,h|0,n|0,f|0);e=pi(f|0,r|0,e|0,b|0)|0;b=y;h=pi(f|0,r|0,h|0,d|0)|0;d=y;g=c[k>>2]|0;if(!(d>>>0<0|(d|0)==0&h>>>0<g>>>0))break;else f=0}}Ud(j)}while((i|0)!=(o|0))}Ud(p);l=q;return}}while(0);a:do if((c[a+4>>2]|0)==1?(k=a+40|0,h=c[a+44>>2]|0,(h|0)!=(k|0)):0){while(1){f=h;h=c[h+4>>2]|0;f=c[f+-12>>2]|0;g=f+56|0;if((c[g>>2]|0)!=2)break;d=c[f+96>>2]|0;c[g>>2]=1;Ia(f+64|0);f=c[d+52>>2]|0;if(f|0)fb[f&31](c[d>>2]|0,0,-5,c[d+56>>2]|0);if((c[d+4>>2]|0)==2){r=d+24|0;n=c[r>>2]|0;s=d+28|0;o=c[s>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[r>>2]=0;c[s>>2]=0}f=c[d+16>>2]|0;if(f|0)ke(f);Mg(d);if((h|0)==(k|0))break a}ja(14496,14319,754,14532)}while(0);f=p+56|0;if((c[f>>2]|0)!=2)ja(14496,14319,754,14532);g=c[p+96>>2]|0;c[f>>2]=1;Ia(p+64|0);f=c[g+52>>2]|0;if(f|0)fb[f&31](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){r=g+24|0;o=c[r>>2]|0;s=g+28|0;p=c[s>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[r>>2]=0;c[s>>2]=0}f=c[g+16>>2]|0;if(f|0)ke(f);Mg(g);l=q;return}function Ud(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;e=g;d=b+56|0;if((c[d>>2]|0)!=2)ja(14496,14319,735,15125);f=c[b+96>>2]|0;h=c[f>>2]|0;c[d>>2]=3;i=b+88|0;j=h+152|0;d=c[j>>2]|0;c[j>>2]=i;c[i>>2]=h+148;c[b+92>>2]=d;c[d>>2]=i;d=h+160|0;h=d;h=pi(c[h>>2]|0,c[h+4>>2]|0,c[b+60>>2]|0,0)|0;c[d>>2]=h;c[d+4>>2]=y;d=f+52|0;if(c[d>>2]|0){c[(c[f+48>>2]|0)+8>>2]=1;h=c[b+24>>2]|0;a[e>>0]=(h|0)==4?-128:(h|0)==10?2:0;c[e+4>>2]=0;h=b+8|0;i=c[h+4>>2]|0;j=e+8|0;c[j>>2]=c[h>>2];c[j+4>>2]=i;fb[c[d>>2]&31](c[f>>2]|0,e,0,c[f+56>>2]|0)}if((c[f+4>>2]|0)==2){i=f+24|0;e=c[i>>2]|0;j=f+28|0;h=c[j>>2]|0;c[e+4>>2]=h;c[h>>2]=e;c[i>>2]=0;c[j>>2]=0}d=c[f+16>>2]|0;if(!d){Mg(f);l=g;return}ke(d);Mg(f);l=g;return}function Vd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;i=o+144|0;m=o+128|0;g=o;h=o+152|0;n=md()|0;if(!(c[8555]|0))c[8555]=n;c[n+200>>2]=Lh(15189)|0;e=n+12|0;if(_a[c[e>>2]&15](n,m,g,0,34812,34812)|0)ja(15194,14319,2070,15240);j=n+28|0;if($a[c[j>>2]&3](n,g,c[m>>2]|0,15254,514,438,0)|0)ja(15261,14319,2072,15240);k=c[m>>2]|0;c[(c[k+4>>2]|0)+100>>2]=1;db[c[n+4>>2]&15](n,k);if(!a){l=o;return n|0}k=vf(28)|0;c[k>>2]=n;f=k+4|0;c[f>>2]=Lh(a)|0;c[k+8>>2]=b;c[k+12>>2]=d;a=k+16|0;if(_a[c[e>>2]&15](n,a,m,0,34812,34812)|0)ja(15340,14319,2145,15389);Oa(h|0,0)|0;b=c[h>>2]|0;b=vi(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;h=c[h+4>>2]|0;h=pi(b|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;fh(g,128,15405,i)|0;b=qe(c[f>>2]|0,g)|0;a=jd(n,c[a>>2]|0)|0;if($a[c[j>>2]&3](n,m,a,15423,514,420,0)|0)ja(15429,14319,2154,15389);le(n,a,b,0,0,0,0,0,3,k,0);Mg(b);l=o;return n|0}function Wd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;h=n+64|0;j=n;k=n+56|0;m=n+40|0;i=n+32|0;if((f|0)<0){c[h>>2]=0-e;Xd(15505,h)}f=Lg(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);d=g+16|0;Xa[c[b+76>>2]&31](b,c[d>>2]|0,15423)|0;if((Ee(f)|0)!=1)Xd(15548,n+72|0);if((De(k,f,15569)|0)<0)Xd(15576,n+80|0);e=(Ce(i,f,15596)|0)==0;h=i;f=c[h>>2]|0;h=c[h+4>>2]|0;do if(e&(h>>>0>0|(h|0)==0&f>>>0>1048575))if((c[b>>2]|0)==9){e=c[b+140>>2]|0;i=pi(f|0,h|0,-1,-1)|0;e=pi(i|0,y|0,e|0,0)|0;e=Ai(e|0,y|0,c[b+136>>2]|0)|0;i=b+120|0;c[i>>2]=e;c[i+4>>2]=y;break}else ja(14834,14319,1677,15606);while(0);h=qe(c[g+4>>2]|0,15629)|0;Nd(b,15635,h,0,0,0);f=jd(b,c[d>>2]|0)|0;if(!($a[c[b+28>>2]&3](b,m,f,15637,514,420,0)|0)){m=k;ye(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=qe(h,j)|0;le(b,f,m,0,0,0,0,0,4,g,0);Mg(h);Mg(m);l=n;return}else ja(15651,14319,2196,15743)}function Xd(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;b=c[3261]|0;di(16070,7,1,b)|0;hh(b,a,d)|0;ii(10,b)|0;Da(1)} +function ag(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=b+584|0;i=v;j=c[i>>2]|0;if((h|0)!=2&((j&131072|0)!=0|0!=0)){u=Ai(j|0,c[i+4>>2]|0,11)|0;u=u&3}else u=d[b+550>>0]|0;if((u|0)==3){h=a[b+549>>0]|0;v=(h&255)<64;h=Bi(1,0,h&255|0)|0;h=pi(h|0,y|0,-1,-1)|0;w=e;c[w>>2]=(v?h:-1)&f;c[w+4>>2]=(v?y:-1)&g;g=0;return g|0}j=b+704|0;i=c[j>>2]|0;j=c[j+4>>2]|0;k=Ai(i|0,j|0,60)|0;if(!k){w=e;c[w>>2]=f;c[w+4>>2]=g;g=0;return g|0}t=k+-5|0;s=(N(t,-9)|0)+52|0;r=Bi(f|0,g|0,s|0)|0;s=zi(r|0,y|0,s|0)|0;if(!((s|0)==(f|0)&(y|0)==(g|0)&(k|0)>5)){g=-1;return g|0}o=Bi(i|0,j|0,12)|0;l=k+-6|0;p=b+728|0;j=0;o=o&-4096;s=y&16777215;while(1){q=((l-j|0)*9|0)+12|0;r=Ai(f|0,g|0,q|0)|0;r=o|r<<3&4088;i=qf(c[p>>2]|0,r,s)|0;if(!i){i=-1;j=26;break}if(!(c[i+32>>2]|0)){i=-1;j=26;break}k=c[i+40>>2]|0;m=i+8|0;m=qi(r|0,s|0,c[m>>2]|0,c[m+4>>2]|0)|0;m=k+m|0;k=c[m>>2]|0;m=c[m+4>>2]|0;if((k&1|0)==0&0==0){i=-1;j=26;break}o=Ai(k|0,m|0,10)|0;o=Bi(o|0,y|0,12)|0;n=y;b=Ai(k|0,m|0,1)|0;b=b&7;j=j+1|0;if(b|0){j=15;break}if((j|0)>=(t|0)){i=-1;j=26;break}else s=n}if((j|0)==15){if((b|4|0)==6){g=-1;return g|0}i=(k&16|0)!=0|0!=0;if((u|0)==1){if(i?(c[v>>2]&262144|0)==0&0==0:0){g=-1;return g|0}}else if(!i){g=-1;return g|0}if(!((((c[v>>2]&524288|0)==0&0==0?0:b>>>2)|b)&1<<h)){g=-1;return g|0}u=(k&64|0)==0&0==0;h=(h|0)==1;v=h&((k&128|0)==0&0==0);i=h?192:64;i=k|i;if((u|v?(w=qf(c[p>>2]|0,r,s)|0,w|0):0)?c[w+32>>2]|0:0){v=c[w+40>>2]|0;w=w+8|0;w=qi(r|0,s|0,c[w>>2]|0,c[w+4>>2]|0)|0;w=v+w|0;c[w>>2]=i;c[w+4>>2]=m}u=Bi(1,0,q|0)|0;h=y;v=pi(u|0,h|0,-1,-1)|0;w=y&g;h=qi(0,0,u|0,h|0)|0;g=e;c[g>>2]=o&h|v&f;c[g+4>>2]=n&y|w;g=0;return g|0}else if((j|0)==26)return i|0;return 0}function bg(b,d){b=b|0;d=d|0;if((d|0)!=64){d=0;return d|0}c[5288]=12968;c[5470]=b;b=21160;c[b>>2]=4096;c[b+4>>2]=0;a[21702]=3;a[21701]=64;a[21704]=2;b=21736;c[b>>2]=0;c[b+4>>2]=10;c[5448]=c[5448]|1315117;b=0;do{d=21888+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=25984+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=30080+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;b=b+1|0}while((b|0)!=256);b=21152;return b|0}function cg(a){a=a|0;return}function dg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;z=l;l=l+96|0;x=z+80|0;u=z+72|0;q=z+64|0;o=z+56|0;n=z+48|0;k=z+40|0;f=z+32|0;d=z+24|0;e=z+88|0;m=z;b=c[a+8>>2]|0;if(Zg(b,17419)|0)if(Zg(b,17427)|0)if(!(Zg(b,17435)|0))b=128;else{c[d>>2]=b;yg(17444,d);x=0;l=z;return x|0}else b=64;else b=32;r=vf(488)|0;c[r>>2]=c[a+4>>2];d=a+16|0;t=d;j=c[t+4>>2]|0;s=r+32|0;p=s;c[p>>2]=c[t>>2];c[p+4>>2]=j;p=r+24|0;c[p>>2]=b;j=kf()|0;t=r+20|0;c[t>>2]=j;c[j+2584>>2]=r;c[(c[t>>2]|0)+2588>>2]=8;j=bg(c[t>>2]|0,b)|0;c[r+28>>2]=j;if(!j){c[f>>2]=b;yg(17469,f);x=0;l=z;return x|0}i=c[t>>2]|0;j=d;_a[c[i+2568>>2]&15](i,-2147483648,0,c[j>>2]|0,c[j+4>>2]|0,0)|0;j=c[t>>2]|0;_a[c[j+2568>>2]&15](j,0,0,65536,0,0)|0;j=a+24|0;c[r+40>>2]=c[j>>2];if(c[j>>2]|0){sa(1,e|0)|0;j=c[e>>2]|0;j=vi(j|0,((j|0)<0)<<31>>31|0,1e7,0)|0;i=(c[e+4>>2]|0)/100|0;i=pi(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;j=r+48|0;c[j>>2]=i;c[j+4>>2]=y}rf(c[t>>2]|0,33554432,0,786432,0,r,16,13,4)|0;rf(c[t>>2]|0,1074790400,0,4194304,0,r,17,14,4)|0;j=r+72|0;b=1;do{uf(j+(b*12|0)|0,9,r,b);b=b+1|0}while((b|0)!=32);rf(c[t>>2]|0,1073774592,0,16,0,r,18,15,4)|0;b=a+44|0;c[r+12>>2]=c[b>>2];c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;c[m+20>>2]=0;c[m+4>>2]=c[t>>2];i=m+8|0;h=i;c[h>>2]=1073807360;c[h+4>>2]=0;b=c[b>>2]|0;if(!b)b=1;else{c[m+16>>2]=r+84;c[r+8>>2]=Xc(m,b)|0;h=i;h=pi(c[h>>2]|0,c[h+4>>2]|0,4096,0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;b=r+480|0;c[b>>2]=(c[b>>2]|0)+1;b=2}e=a+180|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+4|0;h=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);B=a+168+(d*12|0)+8|0;Oc(m,c[B>>2]|0)|0;c[g>>2]=c[B>>2];B=i;B=pi(c[B>>2]|0,c[B+4>>2]|0,4096,0)|0;A=i;c[A>>2]=B;c[A+4>>2]=y;b=b+1|0;c[h>>2]=(c[h>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+96|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);wc(m,c[a+48+(d*12|0)+8>>2]|0)|0;A=i;A=pi(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0))}e=a+164|0;if((c[e>>2]|0)>0){f=m+16|0;g=r+480|0;d=0;do{c[f>>2]=j+(b*12|0);dd(m,c[a+100+(d<<4)+12>>2]|0,c[a+100+(d<<4)+4>>2]|0)|0;A=i;A=pi(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;b=b+1|0;c[g>>2]=(c[g>>2]|0)+1;d=d+1|0}while((d|0)<(c[e>>2]|0));e=b}else e=b;b=a+32|0;do if(c[b>>2]|0){d=vf(28)|0;c[r+16>>2]=d;b=c[b>>2]|0;if(!(Zg(b,17494)|0)){He(c[t>>2]|0,1090519040,0,d,c[a+36>>2]|0,c[a+40>>2]|0)|0;break}else{c[k>>2]=b;yg(17503,k);Da(1)}}while(0);b=c[a+192>>2]|0;do if(b|0)if(!(Zg(b,17535)|0)){n=m+16|0;c[n>>2]=j+(e*12|0);c[r+472>>2]=ad(m,0)|0;A=i;A=pi(c[A>>2]|0,c[A+4>>2]|0,4096,0)|0;B=i;c[B>>2]=A;c[B+4>>2]=y;B=r+480|0;c[B>>2]=(c[B>>2]|0)+1;c[n>>2]=j+((e+1|0)*12|0);c[r+476>>2]=ad(m,2)|0;n=i;n=pi(c[n>>2]|0,c[n+4>>2]|0,4096,0)|0;A=i;c[A>>2]=n;c[A+4>>2]=y;c[B>>2]=(c[B>>2]|0)+1;break}else{c[n>>2]=b;yg(17542,n);Da(1)}while(0);b=a+200|0;if(!(c[b>>2]|0))yg(17572,o);e=c[a+204>>2]|0;f=c[a+224>>2]|0;h=c[a+228>>2]|0;i=c[a+236>>2]|0;j=c[a+240>>2]|0;g=c[a+184>>2]|0;A=((e|0)<0)<<31>>31;B=s;a=c[B+4>>2]|0;if(a>>>0<A>>>0|((a|0)==(A|0)?(c[B>>2]|0)>>>0<e>>>0:0)){yg(17586,q);Da(1)}B=c[b>>2]|0;d=tf(c[t>>2]|0,-2147483648,0,1)|0;Ei(d|0,B|0,e|0)|0;if((h|0)>0){b=(c[p>>2]|0)==32?4194304:2097152;b=e+-1+b&0-b;Ei(d+b|0,f|0,h|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+h|0)>>>0:0)){yg(17600,u);Da(1)}else w=b}else w=0;if((j|0)>0){b=s;b=Ai(c[b>>2]|0,c[b+4>>2]|0,1)|0;b=b>>>0<134217728?b:134217728;Ei(d+b|0,i|0,j|0)|0;B=s;A=c[B+4>>2]|0;if(A>>>0<0|((A|0)==0?(c[B>>2]|0)>>>0<(b+j|0)>>>0:0)){yg(17615,x);Da(1)}else v=b}else v=0;B=tf(c[t>>2]|0,0,0,1)|0;sg(r,B+4160|0,w^-2147483648,0,h,((h|0)<0)<<31>>31,v|-2147483648,0,j,((j|0)<0)<<31>>31,g);c[B+4096>>2]=2147480215;c[B+4100>>2]=1431;c[B+4104>>2]=63276435;c[B+4108>>2]=-247454349;c[B+4112>>2]=163943;B=r;l=z;return B|0}function eg(a){a=a|0;var b=0;b=c[a+28>>2]|0;cb[c[(c[b>>2]|0)+4>>2]&15](b);pf(c[a+20>>2]|0);Mg(a);return}function fg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;d=i;e=a+28|0;h=c[e>>2]|0;do if(!((Va[c[(c[h>>2]|0)+24>>2]&15](h)|0)&128)){g=a+56|0;f=c[g>>2]|0;g=c[g+4>>2]|0;if(!(c[a+40>>2]|0)){a=c[e>>2]|0;a=Va[c[(c[a>>2]|0)+12>>2]&15](a)|0;a=Ai(a|0,y|0,4)|0;d=y}else{sa(1,d|0)|0;e=c[d>>2]|0;e=vi(e|0,((e|0)<0)<<31>>31|0,1e7,0)|0;d=(c[d+4>>2]|0)/100|0;d=pi(e|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;a=a+48|0;a=qi(d|0,y|0,c[a>>2]|0,c[a+4>>2]|0)|0;d=y}a=qi(f|0,g|0,a|0,d|0)|0;d=y;if((d|0)<0|(d|0)==0&a>>>0<1){db[c[(c[h>>2]|0)+16>>2]&15](h,128);b=0;break}else{g=xi(a|0,d|0,1e4,0)|0;e=y;f=((b|0)<0)<<31>>31;b=(e|0)<(f|0)|(e|0)==(f|0)&g>>>0<b>>>0?g:b;break}}while(0);h=(Va[c[(c[h>>2]|0)+28>>2]&15](h)|0)==0;l=i;return (h?0:b)|0}function gg(a,b){a=a|0;b=b|0;a=c[a+28>>2]|0;db[c[(c[a>>2]|0)+8>>2]&15](a,b);return}function hg(a){a=a|0;return 1}function ig(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;a=c[a+476>>2]|0;if(!a)return;$c(a,b,d,e,f)|0;return}function jg(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+472>>2]|0;if(!a)return;Zc(a,b,d)|0;return}function kg(a,b,d){a=a|0;b=b|0;d=d|0;a=c[a+28>>2]|0;eb[c[(c[a>>2]|0)+36>>2]&15](a,b,d);return}function lg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;f=l;l=l+16|0;e=f;if((d|0)!=2)ja(18248,18213,200,18365);if((b|0)<49144)switch(b|0){case 16384:{e=c[a+56>>2]|0;l=f;return e|0}case 16388:{e=c[a+56+4>>2]|0;l=f;return e|0}default:{e=0;l=f;return e|0}}switch(b|0){case 49144:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=Ai(e|0,y|0,4)|0;l=f;return e|0}else{sa(1,e|0)|0;d=c[e>>2]|0;d=vi(d|0,((d|0)<0)<<31>>31|0,1e7,0)|0;d=pi(d|0,y|0,(c[e+4>>2]|0)/100|0|0,0)|0;e=a+48|0;e=qi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;l=f;return e|0}case 49148:if(!(c[a+40>>2]|0)){e=c[a+28>>2]|0;e=Va[c[(c[e>>2]|0)+12>>2]&15](e)|0;e=Ai(e|0,y|0,36)|0;l=f;return e|0}else{sa(1,e|0)|0;b=c[e>>2]|0;b=vi(b|0,((b|0)<0)<<31>>31|0,1e7,0)|0;d=(c[e+4>>2]|0)/100|0;d=pi(b|0,y|0,d|0,((d|0)<0)<<31>>31|0)|0;e=a+48|0;qi(d|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;e=y;l=f;return e|0}default:{e=0;l=f;return e|0}}return 0}function mg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,226,18353);switch(b|0){case 16384:{e=a+56|0;c[e>>2]=d;c[e+4>>2]=0;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}case 16388:{b=a+56|0;e=b;c[e>>2]=c[b>>2];c[e+4>>2]=d;e=c[a+28>>2]|0;db[c[(c[e>>2]|0)+20>>2]&15](e,128);return}default:return}}function ng(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;if((d|0)!=2)ja(18248,18213,261,18343);if((b|0)!=2097156){h=0;return h|0}h=c[a+64>>2]|0;f=a+68|0;g=c[f>>2]|0;d=h&~g;if(!d){h=0;return h|0}b=0;while(1){if(1<<b&d|0){e=b;break}b=b+1|0;if(b>>>0>=32){e=32;break}}g=1<<e|g;c[f>>2]=g;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(h&~g))db[c[d+20>>2]&15](b,2560);else db[c[d+16>>2]&15](b,2560);h=e+1|0;return h|0}function og(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if((e|0)!=2)ja(18248,18213,289,18332);if((b|0)!=2097156)return;b=d+-1|0;if(b>>>0>=32)return;d=a+68|0;e=c[d>>2]&~(1<<b);c[d>>2]=e;b=c[a+28>>2]|0;d=c[b>>2]|0;if(!(c[a+64>>2]&~e)){db[c[d+20>>2]&15](b,2560);return}else{db[c[d+16>>2]&15](b,2560);return}}function pg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;b=1<<b+-1;if(!d){e=a+64|0;d=c[e>>2]&~b;c[e>>2]=d}else{e=a+64|0;d=c[e>>2]|b;c[e>>2]=d}b=c[a+28>>2]|0;e=c[b>>2]|0;if(!(d&~c[a+68>>2])){db[c[e+20>>2]&15](b,2560);return}else{db[c[e+16>>2]&15](b,2560);return}}function qg(a,b,d){a=a|0;b=b|0;d=d|0;if((d|0)!=2)ja(18248,18213,108,18322);switch(b>>>2|b<<30|0){case 0:{d=c[a+456>>2]|0;return d|0}case 1:{d=c[a+456+4>>2]|0;return d|0}case 2:{d=c[a+464>>2]|0;return d|0}case 3:{d=c[a+464+4>>2]|0;return d|0}default:{d=0;return d|0}}return 0}function rg(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;i=k+8|0;if((f|0)!=2)ja(18248,18213,158,18263);switch(d>>>2|d<<30|0){case 0:{j=b+456|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 1:{d=b+456|0;f=c[d>>2]|0;g=d;c[g>>2]=f;c[g+4>>2]=e;g=e>>>16&255;if((f|0)==1&(e|0)==0){ji(18274)|0;Da(0)}h=(e&-16777216|0)==16777216&0==0;if(h&(g|0)==1){a[i>>0]=f;j=c[b+12>>2]|0;eb[c[j+4>>2]&15](c[j>>2]|0,i,1);j=d;c[j>>2]=0;c[j+4>>2]=0;j=b+464|0;c[j>>2]=0;c[j+4>>2]=16842752;l=k;return}if(h&(g|0)==0){j=d;c[j>>2]=0;c[j+4>>2]=0;l=k;return}else{i=j;c[i>>2]=f;c[i+4>>2]=e;hi(18286,j)|0;l=k;return}}case 2:{j=b+464|0;c[j>>2]=e;c[j+4>>2]=0;l=k;return}case 3:{i=b+464|0;j=i;c[j>>2]=c[i>>2];c[j+4>>2]=e;l=k;return}default:{l=k;return}}}function sg(b,d,e,f,g,h,i,j,k,m,n){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+160|0;v=D+136|0;t=D+128|0;u=D;A=vf(28)|0;B=A+4|0;r=c[B>>2]|0;o=r+1|0;C=A+8|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){p=A;q=c[A>>2]|0;o=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}a[q+(o<<2)>>0]=0;o=(c[p>>2]|0)+(c[B>>2]<<2)+1|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;z=A+12|0;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}x=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=x;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[A>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;ug(A,17657,17668,24);ug(A,17692,17698,21);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+2|0;p=c[C>>2]|0;if((p|0)<(o|0)){p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=A;o=c[B>>2]|0}else{p=A;q=c[A>>2]|0;o=r}o=q+(o<<2)|0;a[o>>0]=a[17719]|0;a[o+1>>0]=a[17720]|0;a[o+2>>0]=a[17721]|0;a[o+3>>0]=a[17722]|0;a[o+4>>0]=a[17723]|0;o=(c[p>>2]|0)+(c[B>>2]<<2)+5|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+2|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+3|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17724)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=-2137614336;vg(A,17743,0,0);ug(A,17747,17743,4);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;ug(A,17763,17770,5);ug(A,17657,17775,6);q=c[b+24>>2]|0;r=c[b+28>>2]|0;r=Va[c[(c[r>>2]|0)+32>>2]&15](r)|0;c[t>>2]=q;p=0;o=u+(fh(u,128,17781,t)|0)|0;do{if(1<<p&r){a[o>>0]=p+97;o=o+1|0}p=p+1|0}while((p|0)!=26);a[o>>0]=0;ug(A,17786,u,(_g(u)|0)+1|0);ug(A,17818,(q|0)<33?17796:17807,11);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17827)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=9713015;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;q=c[B>>2]|0;o=q+6|0;p=c[C>>2]|0;if((p|0)<(o|0)){r=(p*3|0)/2|0;r=(r|0)<(o|0)?o:r;p=Ng(c[A>>2]|0,r<<2)|0;c[A>>2]=p;c[C>>2]=r;r=A;o=c[B>>2]|0}else{r=A;p=c[A>>2]|0;o=q}o=p+(o<<2)|0;p=17843;q=o+21|0;do{a[o>>0]=a[p>>0]|0;o=o+1|0;p=p+1|0}while((o|0)<(q|0));o=(c[r>>2]|0)+(c[B>>2]<<2)+21|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;o=c[B>>2]|0;r=o+6|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+7|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;ug(A,17843,0,0);ug(A,17657,17881,15);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;vg(A,17904,-2147483648,0);ug(A,17747,17904,7);t=b+32|0;u=c[t>>2]|0;t=c[t+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[A>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[A>>2]|0,p<<2)|0;c[A>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){x=A;w=A;q=c[A>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[A>>2]|0,o<<2)|0;c[A>>2]=q;c[C>>2]=o;o=c[B>>2]|0;x=A;p=o+1|0;w=A}r=Ci(s|0)|0;c[B>>2]=p;c[q+(o<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=128;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;r=p+(o<<2)|0;a[r>>0]=a[17911]|0;a[r+1>>0]=a[17912]|0;a[r+2>>0]=a[17913]|0;a[r+3>>0]=a[17914]|0;a[r+4>>0]=a[17915]|0;r=(c[x>>2]|0)+(c[B>>2]<<2)+5|0;a[r>>0]=0;a[r+1>>0]=0;a[r+2>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;ug(A,17657,17916,10);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))p=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}o=p+(o<<2)|0;a[o>>0]=115;a[o+1>>0]=111;a[o+2>>0]=99;a[o+3>>0]=0;o=c[B>>2]|0;r=o+1|0;c[B>>2]=r;c[z>>2]=(c[z>>2]|0)+1;o=o+2|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17630)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17645)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[v>>2]=17926;c[v+4>>2]=17950;c[v+8>>2]=0;wg(A,0,v);ug(A,17961,0,0);vg(A,17968,33554432,0);ug(A,17657,17974,13);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0))q=c[x>>2]|0;else{o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=117440512;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=2;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=3072;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;vg(A,18007,1074790400,0);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17864)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;ug(A,17843,0,0);ug(A,17657,18012,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18024)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=520093696;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=4160;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16384;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=150994944;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=184549376;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,17896)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;v=b+480|0;if((c[v>>2]|0)>0){u=0;do{t=(u<<12)+1073807360|0;vg(A,17535,t,0);ug(A,17657,18035,12);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=1048576;u=u+1|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,17987)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;p=r+1|0;o=c[C>>2]|0;if((o|0)>(r|0)){q=c[x>>2]|0;o=r}else{o=(o*3|0)/2|0;o=(o|0)<(p|0)?p:o;q=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=q;c[C>>2]=o;o=c[B>>2]|0;p=o+1|0}c[B>>2]=p;c[q+(o<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}while((u|0)<(c[v>>2]|0))}u=c[b+16>>2]|0;if(u|0){vg(A,18047,1090519040,0);ug(A,17657,18059,19);t=c[u+16>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=268435456;s=tg(A,17759)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=65;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t>>31|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18898)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+4>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18904)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}t=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=t;t=c[u+8>>2]|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=67108864;s=tg(A,18078)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;ug(A,18085,18092,9);r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=16777216;o=c[B>>2]|0;p=o+2|0;q=c[C>>2]|0;if((q|0)<(p|0)){o=(q*3|0)/2|0;o=(o|0)<(p|0)?p:o;p=Ng(c[w>>2]|0,o<<2)|0;c[w>>2]=p;c[C>>2]=o;o=c[B>>2]|0}else p=c[x>>2]|0;b=p+(o<<2)|0;a[b>>0]=a[18101]|0;a[b+1>>0]=a[18102]|0;a[b+2>>0]=a[18103]|0;a[b+3>>0]=a[18104]|0;a[b+4>>0]=a[18105]|0;a[b+5>>0]=a[18106]|0;a[b+6>>0]=a[18107]|0;a[(c[x>>2]|0)+(c[B>>2]<<2)+7>>0]=0;c[B>>2]=(c[B>>2]|0)+2;c[z>>2]=(c[z>>2]|0)+1;n=(n|0)==0?34812:n;ug(A,18108,n,(_g(n)|0)+1|0);if(!((g|0)==0&(h|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18117)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(f|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=Ci(e|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=pi(g|0,h|0,e|0,f|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18136)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}h=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=h}if(!((k|0)==0&(m|0)==0)){r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18153)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(j|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}u=Ci(i|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=u;u=pi(k|0,m|0,i|0,j|0)|0;t=y;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=50331648;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=134217728;s=tg(A,18172)|0;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(s|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}r=Ci(t|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=r;r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}m=Ci(u|0)|0;c[B>>2]=o;c[q+(p<<2)>>2]=m}r=c[B>>2]|0;o=r+1|0;p=c[C>>2]|0;if((p|0)>(r|0)){q=c[x>>2]|0;p=r}else{p=(p*3|0)/2|0;p=(p|0)<(o|0)?o:p;q=Ng(c[w>>2]|0,p<<2)|0;c[w>>2]=q;c[C>>2]=p;p=c[B>>2]|0;o=p+1|0}c[B>>2]=o;c[q+(p<<2)>>2]=33554432;c[z>>2]=(c[z>>2]|0)+-1;o=c[B>>2]|0;p=o+1|0;q=c[C>>2]|0;if((q|0)>(o|0)){k=p;m=c[x>>2]|0;C=o;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;xg(A,d)|0;C=c[w>>2]|0;Mg(C);C=A+16|0;C=c[C>>2]|0;Mg(C);Mg(A);l=D;return}else{k=(q*3|0)/2|0;k=(k|0)<(p|0)?p:k;m=Ng(c[w>>2]|0,k<<2)|0;c[w>>2]=m;c[C>>2]=k;C=c[B>>2]|0;k=C+1|0;c[B>>2]=k;C=m+(C<<2)|0;c[C>>2]=33554432;C=c[z>>2]|0;C=C+-1|0;c[z>>2]=C;xg(A,d)|0;C=c[w>>2]|0;Mg(C);C=A+16|0;C=c[C>>2]|0;Mg(C);Mg(A);l=D;return}}function tg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+20|0;h=c[i>>2]|0;a:do if((h|0)>0){e=c[a+16>>2]|0;d=0;while(1){f=e+d|0;if(!(Zg(f,b)|0))break;d=d+1+(_g(f)|0)|0;if((d|0)>=(h|0))break a}return d|0}while(0);f=(_g(b)|0)+1|0;g=f+h|0;d=a+24|0;e=c[d>>2]|0;if((g|0)>(e|0)){h=(e*3|0)/2|0;h=(g|0)>(h|0)?g:h;a=a+16|0;e=Ng(c[a>>2]|0,h)|0;c[a>>2]=e;c[d>>2]=h;d=c[i>>2]|0}else{e=c[a+16>>2]|0;d=h}Ei(e+d|0,b|0,f|0)|0;c[i>>2]=g;i=d;return i|0}function ug(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=a+4|0;f=c[j>>2]|0;g=f+1|0;k=a+8|0;h=c[k>>2]|0;if((h|0)>(f|0))h=c[a>>2]|0;else{f=(h*3|0)/2|0;f=(f|0)<(g|0)?g:f;h=Ng(c[a>>2]|0,f<<2)|0;c[a>>2]=h;c[k>>2]=f;f=c[j>>2]|0;g=f+1|0}c[j>>2]=g;c[h+(f<<2)>>2]=50331648;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Ng(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=Ci(e|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;b=tg(a,b)|0;i=c[j>>2]|0;f=i+1|0;g=c[k>>2]|0;if((g|0)>(i|0)){h=c[a>>2]|0;g=i}else{g=(g*3|0)/2|0;g=(g|0)<(f|0)?f:g;h=Ng(c[a>>2]|0,g<<2)|0;c[a>>2]=h;c[k>>2]=g;g=c[j>>2]|0;f=g+1|0}i=Ci(b|0)|0;c[j>>2]=f;c[h+(g<<2)>>2]=i;f=(e+3|0)/4|0;g=c[j>>2]|0;h=g+f|0;i=c[k>>2]|0;if((i|0)<(h|0)){i=(i*3|0)/2|0;i=(i|0)<(h|0)?h:i;b=Ng(c[a>>2]|0,i<<2)|0;c[a>>2]=b;c[k>>2]=i;k=a;a=c[j>>2]|0;a=b+(a<<2)|0;Ei(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;Fi(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}else{k=a;b=c[a>>2]|0;a=g;a=b+(a<<2)|0;Ei(a|0,d|0,e|0)|0;k=c[k>>2]|0;d=c[j>>2]|0;d=k+(d<<2)|0;d=d+e|0;k=0-e|0;k=k&3;Fi(d|0,0,k|0)|0;k=c[j>>2]|0;k=k+f|0;c[j>>2]=k;return}}function vg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+272|0;j=m+256|0;k=m;c[j>>2]=b;f=j+8|0;c[f>>2]=d;c[f+4>>2]=e;fh(k,256,18240,j)|0;j=a+4|0;f=c[j>>2]|0;b=f+1|0;i=a+8|0;d=c[i>>2]|0;if((d|0)>(f|0)){e=c[a>>2]|0;d=f}else{d=(d*3|0)/2|0;d=(d|0)<(b|0)?b:d;e=Ng(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=c[j>>2]|0;b=d+1|0}c[j>>2]=b;c[e+(d<<2)>>2]=16777216;f=_g(k)|0;g=f+1|0;h=(f+4|0)/4|0;b=c[j>>2]|0;d=h+b|0;e=c[i>>2]|0;if((e|0)<(d|0)){e=(e*3|0)/2|0;d=(e|0)<(d|0)?d:e;e=Ng(c[a>>2]|0,d<<2)|0;c[a>>2]=e;c[i>>2]=d;d=a;b=c[j>>2]|0}else{d=a;e=c[a>>2]|0}Ei(e+(b<<2)|0,k|0,g|0)|0;Fi((c[d>>2]|0)+(c[j>>2]<<2)+g|0,0,f&3^3|0)|0;c[j>>2]=(c[j>>2]|0)+h;k=a+12|0;c[k>>2]=(c[k>>2]|0)+1;l=m;return}function wg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+16|0;g=h;c[g>>2]=d;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4;if(!e)b=0;else{b=0;do{b=b+1+(_g(e)|0)|0;f=(c[g>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[g>>2]=f+4}while((e|0)!=0)}f=Lg(b)|0;c[g>>2]=d;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4;if(!e){g=0;ug(a,17657,f,g);Mg(f);l=h;return}b=0;do{d=(_g(e)|0)+1|0;Ei(f+b|0,e|0,d|0)|0;b=d+b|0;d=(c[g>>2]|0)+(4-1)&~(4-1);e=c[d>>2]|0;c[g>>2]=d+4}while((e|0)!=0);ug(a,17657,f,b);Mg(f);l=h;return}function xg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if(c[b+12>>2]|0)ja(18189,18213,536,18229);i=b+4|0;e=c[i>>2]|0;f=e+1|0;g=b+8|0;h=c[g>>2]|0;if((h|0)>(e|0)){h=b;g=c[b>>2]|0}else{e=(h*3|0)/2|0;e=(e|0)<(f|0)?f:e;j=Ng(c[b>>2]|0,e<<2)|0;c[b>>2]=j;c[g>>2]=e;e=c[i>>2]|0;f=e+1|0;h=b;g=j}c[i>>2]=f;c[g+(e<<2)>>2]=150994944;e=c[i>>2]<<2;g=c[b+20>>2]|0;c[d>>2]=-302117424;c[d+20>>2]=285212672;c[d+24>>2]=268435456;c[d+28>>2]=0;c[d+32>>2]=Ci(g|0)|0;c[d+36>>2]=Ci(e|0)|0;c[d+8>>2]=671088640;Ei(d+40|0,c[h>>2]|0,e|0)|0;e=e+40|0;if(e&4)while(1){f=e+1|0;a[d+e>>0]=0;if(!(f&7)){e=f;break}else e=f}c[d+16>>2]=Ci(e|0)|0;j=d+e|0;i=j;c[i>>2]=0;c[i+4>>2]=0;j=j+8|0;c[j>>2]=0;c[j+4>>2]=0;e=e+16|0;c[d+12>>2]=Ci(e|0)|0;Ei(d+e|0,c[b+16>>2]|0,g|0)|0;e=e+g|0;if(!(e&7)){j=e;b=Ci(j|0)|0;d=d+4|0;c[d>>2]=b;return j|0}f=e;while(1){e=f+1|0;a[d+f>>0]=0;if(!(e&7))break;else f=e}b=Ci(e|0)|0;j=d+4|0;c[j>>2]=b;return e|0}function yg(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;gi(a,e)|0;l=d;return}function zg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+24|0;f=g+16|0;e=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Se(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[e>>2]=b;yg(18376,e);i=-1;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;yg(18401,f);i=-1;l=g;return i|0}}return 0}function Ag(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+16|0;f=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];Se(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[d>>2]=e;i=0;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;yg(18401,f);i=-1;l=g;return i|0}}return 0}function Bg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=vf(24)|0;c[f>>2]=a;c[f+4>>2]=d;c[f+8>>2]=e;c[a>>2]=Lh(b)|0;if(!(Fe(b)|0))Cg();else{c[f+12>>2]=10;c[f+16>>2]=f;ge(b,0,0,f,16,1)|0;return}}function Cg(){ra()}function Dg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;oa=l;l=l+816|0;ma=oa+796|0;na=oa+744|0;ja=oa+736|0;ga=oa+728|0;fa=oa+720|0;ea=oa+712|0;da=oa+704|0;ca=oa+696|0;ba=oa+688|0;aa=oa+680|0;$=oa+672|0;_=oa+664|0;Y=oa+656|0;X=oa+648|0;W=oa+640|0;V=oa+632|0;U=oa+624|0;T=oa+616|0;ia=oa+608|0;P=oa+600|0;O=oa+592|0;N=oa+584|0;M=oa+576|0;L=oa+568|0;K=oa+560|0;ha=oa+552|0;H=oa+544|0;G=oa+536|0;F=oa+528|0;E=oa+520|0;D=oa+512|0;J=oa+504|0;A=oa+488|0;v=oa+480|0;u=oa+472|0;t=oa+464|0;s=oa+456|0;r=oa+448|0;q=oa+440|0;p=oa+432|0;j=oa+424|0;i=oa+416|0;n=oa+408|0;m=oa+400|0;k=oa+392|0;h=oa+384|0;g=oa+376|0;C=oa+288|0;w=oa+256|0;x=oa+792|0;z=oa+748|0;S=oa;la=oa+368|0;pa=oa+360|0;B=oa+352|0;I=oa+344|0;R=oa+336|0;Z=oa+328|0;f=oa+320|0;ka=c[b>>2]|0;$e(pa,d,e);e=pa;d=c[e>>2]|0;e=c[e+4>>2]|0;pa=la;c[pa>>2]=d;c[pa+4>>2]=e;if((d|0)==7){c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];c[g>>2]=We(ma)|0;yg(18452,g);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);Da(1)}pa=w;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18463);pa=C;d=c[pa+4>>2]|0;a:do switch(c[pa>>2]|0){case 6:{c[h>>2]=18463;yg(18376,h);Q=6;break}case 1:{if((d|0)!=1)if((d|0)>1){yg(18471,m);Da(1)}else{yg(18527,n);Da(1)}m=la;n=c[m+4>>2]|0;pa=w;c[pa>>2]=c[m>>2];c[pa+4>>2]=n;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18633);switch(c[C>>2]|0){case 6:{c[i>>2]=18633;yg(18376,i);break}case 0:{g=Lh((c[C+4>>2]|0)+4|0)|0;c[ka+8>>2]=g;d=c[3252]|0;e=ch(d,44)|0;b:do if(!e){o=d;Q=20}else{h=_g(g)|0;while(1){if((e-d|0)==(h|0)?(Rh(g,d,h)|0)==0:0)break b;d=e+1|0;e=ch(d,44)|0;if(!e){o=d;Q=20;break}}}while(0);if((Q|0)==20?Zg(g,o)|0:0){c[ka+4>>2]=0;c[p>>2]=g;yg(18662,p);break a}c[ka+4>>2]=13008;cb[c[13012>>2]&15](ka);pa=la;d=c[pa+4>>2]|0;e=w;c[e>>2]=c[pa>>2];c[e+4>>2]=d;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18688);e=C;d=c[e>>2]|0;e=c[e+4>>2]|0;switch(d|0){case 6:{c[q>>2]=18688;yg(18376,q);break}case 1:{q=ka+16|0;c[q>>2]=Bi(zi(d|0,e|0,32)|0,y|0,20)|0;c[q+4>>2]=y;q=la;r=c[q+4>>2]|0;pa=w;c[pa>>2]=c[q>>2];c[pa+4>>2]=r;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18700);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+196>>2]=Lh((c[C+4>>2]|0)+4|0)|0;break}default:{c[s>>2]=18700;yg(18641,s);break a}}r=la;s=c[r+4>>2]|0;pa=w;c[pa>>2]=c[r>>2];c[pa+4>>2]=s;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18705);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+220>>2]=Lh((c[C+4>>2]|0)+4|0)|0;break}default:{c[t>>2]=18705;yg(18641,t);break a}}s=la;t=c[s+4>>2]|0;pa=w;c[pa>>2]=c[s>>2];c[pa+4>>2]=t;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18712);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+232>>2]=Lh((c[C+4>>2]|0)+4|0)|0;break}default:{c[u>>2]=18712;yg(18641,u);break a}}t=la;u=c[t+4>>2]|0;pa=w;c[pa>>2]=c[t>>2];c[pa+4>>2]=u;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];Se(C,ma,18719);switch(c[C>>2]|0){case 6:break;case 0:{d=(c[C+4>>2]|0)+4|0;xf(ma);h=C;i=z+36|0;c:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 0:break c;case 36:{e=d+1|0;if((a[e>>0]|0)==123){e=C;g=d+2|0;d:while(1){d=a[g>>0]|0;switch(d<<24>>24){case 0:case 125:break d;default:{}}if((e-h|0)>>>0<31){a[e>>0]=d;d=e+1|0}else d=e;e=d;g=g+1|0}a[e>>0]=0;d=(a[g>>0]|0)==125?g+1|0:g;if(!(Zg(C,18727)|0)){Ra(x|0)|0;Pa(x|0,z|0)|0;u=c[i>>2]|0;v=(u|0)/60|0;u=(u|0)<-59;v=u?0-v|0:v;pa=(v|0)/60|0;c[A>>2]=u?43:45;c[A+4>>2]=pa;c[A+8>>2]=v-(pa*60|0);fh(w,32,18730,A)|0;zf(ma,w)}}else{d=e;Q=52}break}default:{d=d+1|0;Q=52}}if((Q|0)==52){Q=0;yf(ma,g)}}yf(ma,0);c[ka+184>>2]=c[ma>>2];break}default:{c[v>>2]=18719;yg(18641,v);break a}}i=ka+96|0;c[J>>2]=c[i>>2];fh(S,256,18745,J)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(B,ma,S);e=B;d=c[e>>2]|0;e:do if((d|0)==6)Q=68;else{h=J+4|0;g=J+4|0;e=c[e+4>>2]|0;f:while(1){if((c[i>>2]|0)>3){Q=58;break}pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Se(J,ma,18770);switch(c[J>>2]|0){case 6:{Q=60;break f}case 0:break;default:{Q=61;break f}}pa=Lh((c[h>>2]|0)+4|0)|0;c[ka+48+((c[i>>2]|0)*12|0)+4>>2]=pa;pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];Se(J,ma,18775);switch(c[J>>2]|0){case 6:{d=0;break}case 0:{d=Lh((c[g>>2]|0)+4|0)|0;break}default:{Q=65;break f}}c[ka+48+((c[i>>2]|0)*12|0)>>2]=d;e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[H>>2]=e;fh(S,256,18745,H)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(B,ma,S);e=B;d=c[e>>2]|0;if((d|0)==6){Q=68;break e}else e=c[e+4>>2]|0}if((Q|0)==58){yg(18753,D);break}else if((Q|0)==60){c[E>>2]=18770;yg(18376,E)}else if((Q|0)==61){c[F>>2]=18770;yg(18641,F)}else if((Q|0)==65){c[G>>2]=18775;yg(18641,G);break a}break a}while(0);g:do if((Q|0)==68){j=ka+164|0;c[ha>>2]=c[j>>2];fh(S,256,18782,ha)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(I,ma,S);e=I;d=c[e>>2]|0;h:do if((d|0)!=6){h=ha+4|0;i=ha+4|0;e=c[e+4>>2]|0;i:while(1){if((c[j>>2]|0)>3){Q=71;break}pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Se(ha,ma,18770);switch(c[ha>>2]|0){case 6:{Q=73;break i}case 0:break;default:{Q=74;break i}}pa=Lh((c[h>>2]|0)+4|0)|0;c[ka+100+(c[j>>2]<<4)+8>>2]=pa;pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];Se(ha,ma,18809);j:do switch(c[ha>>2]|0){case 6:{d=c[j>>2]|0;if(!d){d=S;e=18813;g=d+10|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(g|0));d=S;break j}else{c[O>>2]=d;fh(S,256,18823,O)|0;d=S;break j}}case 0:{d=(c[i>>2]|0)+4|0;break}default:{Q=77;break i}}while(0);d=Lh(d)|0;e=c[j>>2]|0;c[ka+100+(e<<4)+4>>2]=d;e=e+1|0;c[j>>2]=e;c[P>>2]=e;fh(S,256,18782,P)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(I,ma,S);e=I;d=c[e>>2]|0;if((d|0)==6)break h;else e=c[e+4>>2]|0}if((Q|0)==71){yg(18787,K);break g}else if((Q|0)==73){c[L>>2]=18770;yg(18376,L)}else if((Q|0)==74){c[M>>2]=18770;yg(18641,M)}else if((Q|0)==77){c[N>>2]=18809;yg(18641,N);break a}break a}while(0);i=ka+180|0;c[ia>>2]=c[i>>2];fh(S,256,18835,ia)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(R,ma,S);e=R;d=c[e>>2]|0;k:do if((d|0)!=6){g=ia+4|0;h=ia+4|0;e=c[e+4>>2]|0;l:while(1){if((c[i>>2]|0)>0){Q=86;break}pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18871);switch(c[ia>>2]|0){case 6:{Q=88;break l}case 0:break;default:{Q=89;break l}}pa=(c[g>>2]|0)+4|0;P=Lh(pa)|0;c[ka+168+((c[i>>2]|0)*12|0)>>2]=P;if(!(Zg(pa,18878)|0)){pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18882);switch(c[ia>>2]|0){case 6:{Q=93;break l}case 0:break;default:{Q=94;break l}}pa=Lh((c[h>>2]|0)+4|0)|0;c[ka+168+((c[i>>2]|0)*12|0)+4>>2]=pa}e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[Y>>2]=e;fh(S,256,18835,Y)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(R,ma,S);e=R;d=c[e>>2]|0;if((d|0)==6)break k;else e=c[e+4>>2]|0}if((Q|0)==86){yg(18841,T);break g}else if((Q|0)==88){c[U>>2]=18871;yg(18376,U);Q=90}else if((Q|0)==89){c[V>>2]=18871;yg(18641,V);Q=90}else if((Q|0)==93){c[W>>2]=18882;yg(18376,W);Q=95}else if((Q|0)==94){c[X>>2]=18882;yg(18641,X);Q=95}if((Q|0)==90)break a;else if((Q|0)==95)break a}while(0);d=ka+32|0;c[d>>2]=0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(Z,ma,18889);g=Z;e=c[g>>2]|0;g=c[g+4>>2]|0;m:do if((e|0)!=6){pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18775);switch(c[ia>>2]|0){case 6:{c[_>>2]=18775;yg(18376,_);break}case 0:{c[d>>2]=Lh((c[ia+4>>2]|0)+4|0)|0;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18898);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[aa>>2]=18898;yg(18376,aa);break}case 1:{c[ka+36>>2]=d;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18904);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[ca>>2]=18904;yg(18376,ca);break}case 1:{c[ka+40>>2]=d;pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18911);switch(c[ia>>2]|0){case 6:break m;case 0:{c[ka+208>>2]=Lh((c[ia+4>>2]|0)+4|0)|0;break m}default:{c[ea>>2]=18911;yg(18641,ea);break a}}}default:{c[da>>2]=18904;yg(18401,da)}}break a}default:{c[ba>>2]=18898;yg(18401,ba)}}break a}default:{c[$>>2]=18775;yg(18641,$)}}break a}while(0);da=la;ea=c[da+4>>2]|0;pa=ha;c[pa>>2]=c[da>>2];c[pa+4>>2]=ea;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18920);switch(c[ia>>2]|0){case 6:{d=0;break}case 0:{d=Lh((c[ia+4>>2]|0)+4|0)|0;break}default:{c[fa>>2]=18920;yg(18641,fa);break a}}c[ka+192>>2]=d;ea=la;fa=c[ea+4>>2]|0;pa=ha;c[pa>>2]=c[ea>>2];c[pa+4>>2]=fa;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];Se(ia,ma,18933);n:do switch(c[ia>>2]|0){case 6:break;case 0:{d=(c[ia+4>>2]|0)+4|0;if(!(Zg(d,18939)|0)){c[ka+188>>2]=0;break n}if(!(Zg(d,18944)|0)){c[ka+188>>2]=1;break n}c[ja>>2]=d;yg(18949,ja);Da(1);break}default:{c[ga>>2]=18933;yg(18641,ga);break a}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Se(f,ma,18981);switch(c[f>>2]|0){case 4:{c[ka+28>>2]=c[f+4>>2];c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);pa=b+20|0;c[pa>>2]=0;Fg(b);l=oa;return}case 6:{c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);pa=b+20|0;c[pa>>2]=0;Fg(b);l=oa;return}default:{c[na>>2]=18981;yg(18996,na);break a}}}while(0);Da(1);break}default:{c[r>>2]=18688;yg(18401,r)}}break a}default:{c[j>>2]=18633;yg(18641,j)}}break}default:{c[k>>2]=18463;yg(18401,k);Q=6}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];Ue(ma);Da(1)}function Eg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if((b|0)<0){c[f>>2]=0-b;yg(18423,f);Da(1)}else{eb[c[a+12>>2]&15](c[a+16>>2]|0,d,e);l=g;return}}function Fg(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=c[b>>2]|0;f=b+20|0;d=c[f>>2]|0;a:do if((d|0)<4)while(1){e=c[g+196+(d*12|0)>>2]|0;if(e|0)break a;e=d+1|0;c[f>>2]=e;if((d|0)<3)d=e;else{d=e;h=5;break}}else h=5;while(0);do if((h|0)==5){if((d|0)!=4){e=c[g+196+(d*12|0)>>2]|0;break}d=c[b+4>>2]|0;if(d|0)cb[d&15](c[b+8>>2]|0);Mg(b);return}while(0);d=c[g>>2]|0;if((((d|0)!=0?(ch(e,58)|0)==0:0)?(a[e>>0]|0)!=47:0)?(i=Jh(d,47)|0,(i|0)!=0):0){g=i+1-d|0;h=(_g(e)|0)+1|0;i=Lg(h+g|0)|0;Ei(i|0,d|0,g|0)|0;Ei(i+g|0,e|0,h|0)|0;d=i}else d=Lh(e)|0;if(!(Fe(d)|0))Cg();c[b+12>>2]=11;c[b+16>>2]=b;ge(d,0,0,b,16,1)|0;Mg(d);return}function Gg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;g=Lg(d)|0;e=a+20|0;c[f+196+((c[e>>2]|0)*12|0)+4>>2]=g;Ei(c[f+196+((c[e>>2]|0)*12|0)+4>>2]|0,b|0,d|0)|0;c[f+196+((c[e>>2]|0)*12|0)+8>>2]=d;c[e>>2]=(c[e>>2]|0)+1;Fg(a);return}function Hg(b,d){b=b|0;d=d|0;var e=0,f=0;if((a[d>>0]|0)==33){e=Lh(d+1|0)|0;d=b+184|0;b=c[d>>2]|0;Mg(b);c[d>>2]=e;return}else{e=b+184|0;f=c[e>>2]|0;f=(f|0)==0?34812:f;b=_g(f)|0;b=Lg(b+2+(_g(d)|0)|0)|0;$g(b,f)|0;f=b+(_g(b)|0)|0;a[f>>0]=32;a[f+1>>0]=0;ah(b,d)|0;d=b;b=c[e>>2]|0;Mg(b);c[e>>2]=d;return}}function Ig(a){a=a|0;var b=0,d=0;Mg(c[a+8>>2]|0);Mg(c[a+184>>2]|0);Mg(c[a+196>>2]|0);Mg(c[a+200>>2]|0);Mg(c[a+208>>2]|0);Mg(c[a+212>>2]|0);Mg(c[a+220>>2]|0);Mg(c[a+224>>2]|0);Mg(c[a+232>>2]|0);Mg(c[a+236>>2]|0);d=a+96|0;if((c[d>>2]|0)>0){b=0;do{Mg(c[a+48+(b*12|0)+4>>2]|0);Mg(c[a+48+(b*12|0)>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+164|0;if((c[d>>2]|0)>0){b=0;do{Mg(c[a+100+(b<<4)+8>>2]|0);Mg(c[a+100+(b<<4)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+180|0;if((c[d>>2]|0)<=0){d=a+192|0;d=c[d>>2]|0;Mg(d);d=a+32|0;d=c[d>>2]|0;Mg(d);a=c[a>>2]|0;Mg(a);return}b=0;do{Mg(c[a+168+(b*12|0)>>2]|0);Mg(c[a+168+(b*12|0)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0));d=a+192|0;d=c[d>>2]|0;Mg(d);d=a+32|0;d=c[d>>2]|0;Mg(d);a=c[a>>2]|0;Mg(a);return}function Jg(a){a=a|0;return Va[c[(c[a+4>>2]|0)+8>>2]&15](a)|0}function Kg(a){a=a|0;Fi(a|0,0,248)|0;return}function Lg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;o=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;n=c[8557]|0;d=n>>>a;if(d&3|0){b=(d&1^1)+a|0;a=34268+(b<<1<<2)|0;d=a+8|0;e=c[d>>2]|0;f=e+8|0;g=c[f>>2]|0;if((g|0)==(a|0))c[8557]=n&~(1<<b);else{c[g+12>>2]=a;c[d>>2]=g}w=b<<3;c[e+4>>2]=w|3;w=e+w+4|0;c[w>>2]=c[w>>2]|1;w=f;l=x;return w|0}m=c[8559]|0;if(k>>>0>m>>>0){if(d|0){b=2<<a;b=d<<a&(b|0-b);b=(b&0-b)+-1|0;i=b>>>12&16;b=b>>>i;d=b>>>5&8;b=b>>>d;g=b>>>2&4;b=b>>>g;a=b>>>1&2;b=b>>>a;e=b>>>1&1;e=(d|i|g|a|e)+(b>>>e)|0;b=34268+(e<<1<<2)|0;a=b+8|0;g=c[a>>2]|0;i=g+8|0;d=c[i>>2]|0;if((d|0)==(b|0)){a=n&~(1<<e);c[8557]=a}else{c[d+12>>2]=b;c[a>>2]=d;a=n}w=e<<3;h=w-k|0;c[g+4>>2]=k|3;f=g+k|0;c[f+4>>2]=h|1;c[g+w>>2]=h;if(m|0){e=c[8562]|0;b=m>>>3;d=34268+(b<<1<<2)|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[8559]=h;c[8562]=f;w=i;l=x;return w|0}g=c[8558]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=c[34532+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(c[j+4>>2]&-8)-k|0;while(1){a=c[d+16>>2]|0;if(!a){a=c[d+20>>2]|0;if(!a)break}h=(c[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){d=0;break}}while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);do if(f|0){b=c[i+28>>2]|0;a=34532+(b<<2)|0;if((i|0)==(c[a>>2]|0)){c[a>>2]=d;if(!d){c[8558]=g&~(1<<b);break}}else{w=f+16|0;c[((c[w>>2]|0)==(i|0)?w:f+20|0)>>2]=d;if(!d)break}c[d+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}b=c[i+20>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}while(0);if(j>>>0<16){w=j+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[h+4>>2]=j|1;c[h+j>>2]=j;if(m|0){e=c[8562]|0;b=m>>>3;d=34268+(b<<1<<2)|0;b=1<<b;if(!(b&n)){c[8557]=b|n;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[8559]=j;c[8562]=h}w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=c[8558]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{n=(a+1048320|0)>>>16&8;r=a<<n;i=(r+520192|0)>>>16&4;r=r<<i;j=(r+245760|0)>>>16&2;j=14-(i|n|j)+(r<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=c[34532+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;r=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(c[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;r=65;break a}else{a=d;f=h}r=c[d+20>>2]|0;d=c[d+16+(i>>>31<<2)>>2]|0;g=(r|0)==0|(r|0)==(d|0)?g:r;if(!d){d=g;r=61;break}else i=i<<1}}while(0);if((r|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){n=k;break}n=(a&0-a)+-1|0;h=n>>>12&16;n=n>>>h;g=n>>>5&8;n=n>>>g;i=n>>>2&4;n=n>>>i;j=n>>>1&2;n=n>>>j;d=n>>>1&1;a=0;d=c[34532+((g|h|i|j|d)+(n>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else r=65}if((r|0)==65){g=d;while(1){n=(c[g+4>>2]&-8)-k|0;d=n>>>0<f>>>0;f=d?n:f;a=d?g:a;d=c[g+16>>2]|0;if(!d)d=c[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((c[8559]|0)-k|0)>>>0:0)?(m=i+k|0,m>>>0>i>>>0):0){g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;else{b=d;a=f}}else{b=d;a=f}}c[a>>2]=0}else{w=c[i+8>>2]|0;c[w+12>>2]=b;c[b+8>>2]=w}while(0);do if(g){a=c[i+28>>2]|0;d=34532+(a<<2)|0;if((i|0)==(c[d>>2]|0)){c[d>>2]=b;if(!b){e=e&~(1<<a);c[8558]=e;break}}else{w=g+16|0;c[((c[w>>2]|0)==(i|0)?w:g+20|0)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[i+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[i+20>>2]|0;if(a){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);b:do if(h>>>0<16){w=h+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[m+4>>2]=h|1;c[m+h>>2]=h;b=h>>>3;if(h>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=m;c[b+12>>2]=m;c[m+8>>2]=b;c[m+12>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;d=(w+245760|0)>>>16&2;d=14-(u|v|d)+(w<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=34532+(d<<2)|0;c[m+28>>2]=d;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<d;if(!(e&a)){c[8558]=e|a;c[b>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(h|0)){b=a;break c}else{e=e<<1;b=a}}c[d>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break b}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=m;c[v>>2]=m;c[m+8>>2]=w;c[m+12>>2]=b;c[m+24>>2]=0}while(0);w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=-1;while(0);d=c[8559]|0;if(d>>>0>=n>>>0){b=d-n|0;a=c[8562]|0;if(b>>>0>15){w=a+n|0;c[8562]=w;c[8559]=b;c[w+4>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=n|3}else{c[8559]=0;c[8562]=0;c[a+4>>2]=d|3;w=a+d+4|0;c[w>>2]=c[w>>2]|1}w=a+8|0;l=x;return w|0}h=c[8560]|0;if(h>>>0>n>>>0){u=h-n|0;c[8560]=u;w=c[8563]|0;v=w+n|0;c[8563]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}if(!(c[8675]|0)){c[8677]=4096;c[8676]=4096;c[8678]=-1;c[8679]=-1;c[8680]=0;c[8668]=0;c[8675]=o&-16^1431655768;a=4096}else a=c[8677]|0;i=n+48|0;j=n+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=n>>>0){w=0;l=x;return w|0}a=c[8667]|0;if(a|0?(m=c[8665]|0,o=m+k|0,o>>>0<=m>>>0|o>>>0>a>>>0):0){w=0;l=x;return w|0}d:do if(!(c[8668]&4)){d=c[8563]|0;e:do if(d){e=34676;while(1){o=c[e>>2]|0;if(o>>>0<=d>>>0?(o+(c[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=c[e+8>>2]|0;if(!a){r=128;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=Gi(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;r=145;break d}}else{e=a;r=136}}else b=0}else r=128;while(0);do if((r|0)==128){d=Gi(0)|0;if((d|0)!=(-1|0)?(b=d,p=c[8676]|0,q=p+-1|0,b=((q&b|0)==0?0:(q+b&0-p)-b|0)+k|0,p=c[8665]|0,q=b+p|0,b>>>0>n>>>0&b>>>0<2147483647):0){o=c[8667]|0;if(o|0?q>>>0<=p>>>0|q>>>0>o>>>0:0){b=0;break}a=Gi(b|0)|0;if((a|0)==(d|0)){h=b;g=d;r=145;break d}else{e=a;r=136}}else b=0}while(0);do if((r|0)==136){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;r=145;break d}a=c[8677]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;r=145;break d}if((Gi(a|0)|0)==(-1|0)){Gi(d|0)|0;b=0;break}else{h=a+b|0;g=e;r=145;break d}}while(0);c[8668]=c[8668]|4;r=143}else{b=0;r=143}while(0);if(((r|0)==143?k>>>0<2147483647:0)?(u=Gi(k|0)|0,q=Gi(0)|0,s=q-u|0,t=s>>>0>(n+40|0)>>>0,!((u|0)==(-1|0)|t^1|u>>>0<q>>>0&((u|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=t?s:b;g=u;r=145}if((r|0)==145){b=(c[8665]|0)+h|0;c[8665]=b;if(b>>>0>(c[8666]|0)>>>0)c[8666]=b;j=c[8563]|0;f:do if(j){b=34676;while(1){a=c[b>>2]|0;d=c[b+4>>2]|0;if((g|0)==(a+d|0)){r=154;break}e=c[b+8>>2]|0;if(!e)break;else b=e}if(((r|0)==154?(v=b+4|0,(c[b+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){c[v>>2]=d+h;w=(c[8560]|0)+h|0;u=j+8|0;u=(u&7|0)==0?0:0-u&7;v=j+u|0;u=w-u|0;c[8563]=v;c[8560]=u;c[v+4>>2]=u|1;c[j+w+4>>2]=40;c[8564]=c[8679];break}if(g>>>0<(c[8561]|0)>>>0)c[8561]=g;d=g+h|0;b=34676;while(1){if((c[b>>2]|0)==(d|0)){r=162;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((r|0)==162?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;m=b+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;k=m+n|0;i=b-m-n|0;c[m+4>>2]=n|3;g:do if((j|0)==(b|0)){w=(c[8560]|0)+i|0;c[8560]=w;c[8563]=k;c[k+4>>2]=w|1}else{if((c[8562]|0)==(b|0)){w=(c[8559]|0)+i|0;c[8559]=w;c[8562]=k;c[k+4>>2]=w|1;c[k+w>>2]=w;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=c[b+8>>2]|0;d=c[b+12>>2]|0;if((d|0)==(a|0)){c[8557]=c[8557]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}else{g=c[b+24>>2]|0;a=c[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{w=c[b+8>>2]|0;c[w+12>>2]=a;c[a+8>>2]=w}while(0);if(!g)break;d=c[b+28>>2]|0;e=34532+(d<<2)|0;do if((c[e>>2]|0)!=(b|0)){w=g+16|0;c[((c[w>>2]|0)==(b|0)?w:g+20|0)>>2]=a;if(!a)break h}else{c[e>>2]=a;if(a|0)break;c[8558]=c[8558]&~(1<<d);break h}while(0);c[a+24>>2]=g;d=b+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(!d)break;c[a+20>>2]=d;c[d+24>>2]=a}while(0);b=b+h|0;f=h+i|0}else f=i;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;b=f>>>3;if(f>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=k;c[b+12>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=34532+(e<<2)|0;c[k+28>>2]=e;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[8558]|0;d=1<<e;if(!(a&d)){c[8558]=a|d;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break}b=c[b>>2]|0;i:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break i}else{e=e<<1;b=a}}c[d>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break g}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=k;c[v>>2]=k;c[k+8>>2]=w;c[k+12>>2]=b;c[k+24>>2]=0}while(0);w=m+8|0;l=x;return w|0}b=34676;while(1){a=c[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(c[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=c[b+8>>2]|0}f=w+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;b=a+8|0;d=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=d-u|0;c[8563]=v;c[8560]=u;c[v+4>>2]=u|1;c[g+d+4>>2]=40;c[8564]=c[8679];d=a+4|0;c[d>>2]=27;c[b>>2]=c[8669];c[b+4>>2]=c[8670];c[b+8>>2]=c[8671];c[b+12>>2]=c[8672];c[8669]=g;c[8670]=h;c[8672]=0;c[8671]=b;b=a+24|0;do{v=b;b=b+4|0;c[b>>2]=7}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;c[d>>2]=c[d>>2]&-2;c[j+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=j;c[b+12>>2]=j;c[j+8>>2]=b;c[j+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=34532+(e<<2)|0;c[j+28>>2]=e;c[j+20>>2]=0;c[f>>2]=0;b=c[8558]|0;a=1<<e;if(!(b&a)){c[8558]=b|a;c[d>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}b=c[d>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(g|0)){b=a;break j}else{e=e<<1;b=a}}c[d>>2]=j;c[j+24>>2]=b;c[j+12>>2]=j;c[j+8>>2]=j;break f}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=j;c[v>>2]=j;c[j+8>>2]=w;c[j+12>>2]=b;c[j+24>>2]=0}}else{w=c[8561]|0;if((w|0)==0|g>>>0<w>>>0)c[8561]=g;c[8669]=g;c[8670]=h;c[8672]=0;c[8566]=c[8675];c[8565]=-1;c[8570]=34268;c[8569]=34268;c[8572]=34276;c[8571]=34276;c[8574]=34284;c[8573]=34284;c[8576]=34292;c[8575]=34292;c[8578]=34300;c[8577]=34300;c[8580]=34308;c[8579]=34308;c[8582]=34316;c[8581]=34316;c[8584]=34324;c[8583]=34324;c[8586]=34332;c[8585]=34332;c[8588]=34340;c[8587]=34340;c[8590]=34348;c[8589]=34348;c[8592]=34356;c[8591]=34356;c[8594]=34364;c[8593]=34364;c[8596]=34372;c[8595]=34372;c[8598]=34380;c[8597]=34380;c[8600]=34388;c[8599]=34388;c[8602]=34396;c[8601]=34396;c[8604]=34404;c[8603]=34404;c[8606]=34412;c[8605]=34412;c[8608]=34420;c[8607]=34420;c[8610]=34428;c[8609]=34428;c[8612]=34436;c[8611]=34436;c[8614]=34444;c[8613]=34444;c[8616]=34452;c[8615]=34452;c[8618]=34460;c[8617]=34460;c[8620]=34468;c[8619]=34468;c[8622]=34476;c[8621]=34476;c[8624]=34484;c[8623]=34484;c[8626]=34492;c[8625]=34492;c[8628]=34500;c[8627]=34500;c[8630]=34508;c[8629]=34508;c[8632]=34516;c[8631]=34516;w=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=w-u|0;c[8563]=v;c[8560]=u;c[v+4>>2]=u|1;c[g+w+4>>2]=40;c[8564]=c[8679]}while(0);b=c[8560]|0;if(b>>>0>n>>>0){u=b-n|0;c[8560]=u;w=c[8563]|0;v=w+n|0;c[8563]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}}c[(Ug()|0)>>2]=12;w=0;l=x;return w|0}function Mg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=c[8561]|0;a=c[a+-4>>2]|0;b=a&-8;j=d+b|0;do if(!(a&1)){e=c[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+b|0;if(h>>>0<f>>>0)return;if((c[8562]|0)==(h|0)){a=j+4|0;b=c[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}c[8559]=g;c[a>>2]=b&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[8557]=c[8557]&~(1<<d);i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){b=h+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){a=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;d=34532+(b<<2)|0;if((c[d>>2]|0)==(h|0)){c[d>>2]=a;if(!a){c[8558]=c[8558]&~(1<<b);i=h;b=g;break}}else{i=f+16|0;c[((c[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=h+16|0;d=c[b>>2]|0;if(d|0){c[a+16>>2]=d;c[d+24>>2]=a}b=c[b+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=c[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((c[8563]|0)==(j|0)){j=(c[8560]|0)+b|0;c[8560]=j;c[8563]=i;c[i+4>>2]=j|1;if((i|0)!=(c[8562]|0))return;c[8562]=0;c[8559]=0;return}if((c[8562]|0)==(j|0)){j=(c[8559]|0)+b|0;c[8559]=j;c[8562]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[8557]=c[8557]&~(1<<d);break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){d=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0;d=a}else{d=c[j+8>>2]|0;c[d+12>>2]=a;c[a+8>>2]=d;d=a}while(0);if(g|0){a=c[j+28>>2]|0;b=34532+(a<<2)|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=d;if(!d){c[8558]=c[8558]&~(1<<a);break}}else{e=g+16|0;c[((c[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;a=j+16|0;b=c[a>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}a=c[a+4>>2]|0;if(a|0){c[d+20>>2]=a;c[a+24>>2]=d}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[8562]|0)){c[8559]=f;return}}else{c[a>>2]=e&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}a=f>>>3;if(f>>>0<256){d=34268+(a<<1<<2)|0;b=c[8557]|0;a=1<<a;if(!(b&a)){c[8557]=b|a;a=d;b=d+8|0}else{b=d+8|0;a=c[b>>2]|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=34532+(e<<2)|0;c[i+28>>2]=e;c[i+20>>2]=0;c[i+16>>2]=0;b=c[8558]|0;d=1<<e;a:do if(!(b&d)){c[8558]=b|d;c[a>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i}else{a=c[a>>2]|0;b:do if((c[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;b=c[d>>2]|0;if(!b)break;if((c[b+4>>2]&-8|0)==(f|0)){a=b;break b}else{e=e<<1;a=b}}c[d>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break a}while(0);h=a+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=a;c[i+24>>2]=0}while(0);j=(c[8565]|0)+-1|0;c[8565]=j;if(j|0)return;a=34684;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[8565]=-1;return}function Ng(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=Lg(b)|0;return b|0}if(b>>>0>4294967231){c[(Ug()|0)>>2]=12;b=0;return b|0}d=Og(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=Lg(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;Ei(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Mg(a);b=d;return b|0}function Og(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=a+4|0;m=c[l>>2]|0;d=m&-8;i=a+d|0;if(!(m&3)){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[8677]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;k=a+b|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|3;m=i+4|0;c[m>>2]=c[m>>2]|1;Pg(k,d);return a|0}if((c[8563]|0)==(i|0)){k=(c[8560]|0)+d|0;d=k-b|0;e=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}c[l>>2]=m&1|b|2;c[e+4>>2]=d|1;c[8563]=e;c[8560]=d;return a|0}if((c[8562]|0)==(i|0)){e=(c[8559]|0)+d|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){k=a+b|0;e=a+e|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|1;c[e>>2]=d;e=e+4|0;c[e>>2]=c[e>>2]&-2;e=k}else{c[l>>2]=m&1|e|2;e=a+e+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[8559]=d;c[8562]=e;return a|0}e=c[i+4>>2]|0;if(e&2|0){a=0;return a|0}j=(e&-8)+d|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;f=e>>>3;do if(e>>>0<256){e=c[i+8>>2]|0;d=c[i+12>>2]|0;if((d|0)==(e|0)){c[8557]=c[8557]&~(1<<f);break}else{c[e+12>>2]=d;c[d+8>>2]=e;break}}else{h=c[i+24>>2]|0;d=c[i+12>>2]|0;do if((d|0)==(i|0)){e=i+16|0;f=e+4|0;d=c[f>>2]|0;if(!d){d=c[e>>2]|0;if(!d){f=0;break}}else e=f;while(1){g=d+20|0;f=c[g>>2]|0;if(!f){g=d+16|0;f=c[g>>2]|0;if(!f)break;else{d=f;e=g}}else{d=f;e=g}}c[e>>2]=0;f=d}else{f=c[i+8>>2]|0;c[f+12>>2]=d;c[d+8>>2]=f;f=d}while(0);if(h|0){d=c[i+28>>2]|0;e=34532+(d<<2)|0;if((c[e>>2]|0)==(i|0)){c[e>>2]=f;if(!f){c[8558]=c[8558]&~(1<<d);break}}else{g=h+16|0;c[((c[g>>2]|0)==(i|0)?g:h+20|0)>>2]=f;if(!f)break}c[f+24>>2]=h;d=i+16|0;e=c[d>>2]|0;if(e|0){c[f+16>>2]=e;c[e+24>>2]=f}d=c[d+4>>2]|0;if(d|0){c[f+20>>2]=d;c[d+24>>2]=f}}}while(0);if(k>>>0<16){c[l>>2]=m&1|j|2;m=a+j+4|0;c[m>>2]=c[m>>2]|1;return a|0}else{i=a+b|0;c[l>>2]=m&1|b|2;c[i+4>>2]=k|3;m=a+j+4|0;c[m>>2]=c[m>>2]|1;Pg(i,k);return a|0}return 0}function Pg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){f=c[a>>2]|0;if(!(d&3))return;h=a+(0-f)|0;b=f+b|0;if((c[8562]|0)==(h|0)){a=i+4|0;d=c[a>>2]|0;if((d&3|0)!=3)break;c[8559]=b;c[a>>2]=d&-2;c[h+4>>2]=b|1;c[i>>2]=b;return}e=f>>>3;if(f>>>0<256){a=c[h+8>>2]|0;d=c[h+12>>2]|0;if((d|0)==(a|0)){c[8557]=c[8557]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}g=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){d=h+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{f=c[h+8>>2]|0;c[f+12>>2]=a;c[a+8>>2]=f}while(0);if(g){d=c[h+28>>2]|0;e=34532+(d<<2)|0;if((c[e>>2]|0)==(h|0)){c[e>>2]=a;if(!a){c[8558]=c[8558]&~(1<<d);break}}else{f=g+16|0;c[((c[f>>2]|0)==(h|0)?f:g+20|0)>>2]=a;if(!a)break}c[a+24>>2]=g;d=h+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(d){c[a+20>>2]=d;c[d+24>>2]=a}}}else h=a;while(0);a=i+4|0;e=c[a>>2]|0;if(!(e&2)){if((c[8563]|0)==(i|0)){i=(c[8560]|0)+b|0;c[8560]=i;c[8563]=h;c[h+4>>2]=i|1;if((h|0)!=(c[8562]|0))return;c[8562]=0;c[8559]=0;return}if((c[8562]|0)==(i|0)){i=(c[8559]|0)+b|0;c[8559]=i;c[8562]=h;c[h+4>>2]=i|1;c[h+i>>2]=i;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){a=c[i+8>>2]|0;b=c[i+12>>2]|0;if((b|0)==(a|0)){c[8557]=c[8557]&~(1<<d);break}else{c[a+12>>2]=b;c[b+8>>2]=a;break}}else{g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+16|0;d=a+4|0;b=c[d>>2]|0;if(!b){b=c[a>>2]|0;if(!b){d=0;break}}else a=d;while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);if(g|0){b=c[i+28>>2]|0;a=34532+(b<<2)|0;if((c[a>>2]|0)==(i|0)){c[a>>2]=d;if(!d){c[8558]=c[8558]&~(1<<b);break}}else{e=g+16|0;c[((c[e>>2]|0)==(i|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;b=i+16|0;a=c[b>>2]|0;if(a|0){c[d+16>>2]=a;c[a+24>>2]=d}b=c[b+4>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}}while(0);c[h+4>>2]=f|1;c[h+f>>2]=f;if((h|0)==(c[8562]|0)){c[8559]=f;return}}else{c[a>>2]=e&-2;c[h+4>>2]=b|1;c[h+b>>2]=b;f=b}b=f>>>3;if(f>>>0<256){d=34268+(b<<1<<2)|0;a=c[8557]|0;b=1<<b;if(!(a&b)){c[8557]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=h;c[b+12>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{g=(b+1048320|0)>>>16&8;i=b<<g;d=(i+520192|0)>>>16&4;i=i<<d;e=(i+245760|0)>>>16&2;e=14-(d|g|e)+(i<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=34532+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[h+16>>2]=0;a=c[8558]|0;d=1<<e;if(!(a&d)){c[8558]=a|d;c[b>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}b=c[b>>2]|0;a:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break a}else{e=e<<1;b=a}}c[d>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}while(0);g=b+8|0;i=c[g>>2]|0;c[i+12>>2]=h;c[g>>2]=h;c[h+8>>2]=i;c[h+12>>2]=b;c[h+24>>2]=0;return}function Qg(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=Vg(c[a+60>>2]|0)|0;a=Tg(pa(6,d|0)|0)|0;l=b;return a|0}function Rg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+32|0;g=n+16|0;f=n;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=Tg(na(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=b+(o<<31>>31)|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=Tg(na(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function Sg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if((Tg(ma(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function Tg(a){a=a|0;if(a>>>0>4294963200){c[(Ug()|0)>>2]=0-a;a=-1}return a|0}function Ug(){return 34788}function Vg(a){a=a|0;return a|0}function Wg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=1;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,oa(54,f|0)|0):0)a[b+75>>0]=-1;f=Rg(b,d,e)|0;l=g;return f|0}function Xg(a){a=a|0;return (a+-48|0)>>>0<10|0}function Yg(){return 13300}function Zg(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function _g(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=5;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=5;break}}}while(0);if((e|0)==5){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function $g(a,b){a=a|0;b=b|0;bh(a,b)|0;return a|0}function ah(a,b){a=a|0;b=b|0;$g(a+(_g(a)|0)|0,b)|0;return a|0}function bh(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=10}else f=10;while(0);if((f|0)==10){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function ch(b,c){b=b|0;c=c|0;b=eh(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function dh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else i=16;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)==g<<24>>24)if(!e){i=16;break}else break;f=N(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break c;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break}}else i=11;while(0);if((i|0)==11)if(!e){i=16;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;e=e+-1|0;if(!e){i=16;break}else b=b+1|0}}while(0);if((i|0)==16)b=0;return b|0}function eh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(_g(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=N(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function fh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f;c[g>>2]=e;e=gh(a,b,d,g)|0;l=f;return e|0}function gh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=13544;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(Ug()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=hh(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function hh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+208|0;p=s+160|0;q=s+80|0;r=s;f=p;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((ih(0,d,n,q,p)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)o=jh(b)|0;else o=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=ih(b,d,n,q,p)|0;if(h){Xa[c[b+36>>2]&31](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=ih(b,d,n,q,p)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(o|0)kh(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function ih(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+64|0;D=I+56|0;E=I+40|0;A=I;G=I+48|0;H=I+60|0;c[D>>2]=e;w=(d|0)!=0;x=A+40|0;z=x;A=A+39|0;B=G+4|0;j=0;e=0;m=0;a:while(1){do{do if((e|0)>-1)if((j|0)>(2147483647-e|0)){c[(Ug()|0)>>2]=75;e=-1;break}else{e=j+e|0;break}while(0);s=c[D>>2]|0;j=a[s>>0]|0;if(!(j<<24>>24)){v=94;break a}k=s;b:while(1){switch(j<<24>>24){case 37:{v=10;break b}case 0:{j=k;break b}default:{}}u=k+1|0;c[D>>2]=u;j=a[u>>0]|0;k=u}c:do if((v|0)==10){v=0;j=k;do{if((a[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;c[D>>2]=k}while((a[k>>0]|0)==37)}while(0);j=j-s|0;if(w)lh(d,s,j)}while((j|0)!=0);u=(Xg(a[(c[D>>2]|0)+1>>0]|0)|0)==0;k=c[D>>2]|0;if(!u?(a[k+2>>0]|0)==36:0){q=(a[k+1>>0]|0)+-48|0;o=1;j=3}else{q=-1;o=m;j=1}j=k+j|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>31|(1<<m&75913|0)==0)n=0;else{n=0;do{n=1<<m|n;j=j+1|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0}while(!(m>>>0>31|(1<<m&75913|0)==0))}if(k<<24>>24==42){if((Xg(a[j+1>>0]|0)|0)!=0?(F=c[D>>2]|0,(a[F+2>>0]|0)==36):0){j=F+1|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;m=1;k=F+3|0}else{if(o|0){e=-1;break}if(w){u=(c[f>>2]|0)+(4-1)&~(4-1);j=c[u>>2]|0;c[f>>2]=u+4}else j=0;m=0;k=(c[D>>2]|0)+1|0}c[D>>2]=k;u=(j|0)<0;t=u?0-j|0:j;n=u?n|8192:n;u=m}else{j=mh(D)|0;if((j|0)<0){e=-1;break}t=j;u=o;k=c[D>>2]|0}do if((a[k>>0]|0)==46){j=k+1|0;if((a[j>>0]|0)!=42){c[D>>2]=j;j=mh(D)|0;k=c[D>>2]|0;break}if(Xg(a[k+2>>0]|0)|0?(C=c[D>>2]|0,(a[C+3>>0]|0)==36):0){j=C+2|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;k=C+4|0;c[D>>2]=k;break}if(u|0){e=-1;break a}if(w){r=(c[f>>2]|0)+(4-1)&~(4-1);j=c[r>>2]|0;c[f>>2]=r+4}else j=0;k=(c[D>>2]|0)+2|0;c[D>>2]=k}else j=-1;while(0);r=0;while(1){if(((a[k>>0]|0)+-65|0)>>>0>57){e=-1;break a}m=k;k=k+1|0;c[D>>2]=k;m=a[(a[m>>0]|0)+-65+(10304+(r*58|0))>>0]|0;o=m&255;if((o+-1|0)>>>0>=8)break;else r=o}if(!(m<<24>>24)){e=-1;break}p=(q|0)>-1;do if(m<<24>>24==19)if(p){e=-1;break a}else v=54;else{if(p){c[i+(q<<2)>>2]=o;p=g+(q<<3)|0;q=c[p+4>>2]|0;v=E;c[v>>2]=c[p>>2];c[v+4>>2]=q;v=54;break}if(!w){e=0;break a}nh(E,o,f);k=c[D>>2]|0;v=55}while(0);if((v|0)==54){v=0;if(w)v=55;else j=0}d:do if((v|0)==55){v=0;k=a[k+-1>>0]|0;k=(r|0)!=0&(k&15|0)==3?k&-33:k;m=n&-65537;q=(n&8192|0)==0?n:m;e:do switch(k|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[E>>2]>>2]=e;j=0;break d}case 1:{c[c[E>>2]>>2]=e;j=0;break d}case 2:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}case 3:{b[c[E>>2]>>1]=e;j=0;break d}case 4:{a[c[E>>2]>>0]=e;j=0;break d}case 6:{c[c[E>>2]>>2]=e;j=0;break d}case 7:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}default:{j=0;break d}}case 112:{k=120;j=j>>>0>8?j:8;m=q|8;v=67;break}case 88:case 120:{m=q;v=67;break}case 111:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;p=ph(k,m,x)|0;v=z-p|0;n=0;o=19018;j=(q&8|0)==0|(j|0)>(v|0)?j:v+1|0;v=73;break}case 105:case 100:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;if((m|0)<0){k=qi(0,0,k|0,m|0)|0;m=y;n=E;c[n>>2]=k;c[n+4>>2]=m;n=1;o=19018;v=72;break e}else{n=(q&2049|0)!=0&1;o=(q&2048|0)==0?((q&1|0)==0?19018:19020):19019;v=72;break e}}case 117:{m=E;n=0;o=19018;k=c[m>>2]|0;m=c[m+4>>2]|0;v=72;break}case 99:{a[A>>0]=c[E>>2];r=A;n=0;o=19018;p=1;j=z;break}case 109:{k=rh(c[(Ug()|0)>>2]|0)|0;v=77;break}case 115:{k=c[E>>2]|0;k=(k|0)==0?19028:k;v=77;break}case 67:{c[G>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=G;o=-1;v=81;break}case 83:{if(!j){sh(d,32,t,0,q);j=0;v=91}else{o=j;v=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=uh(d,+h[E>>3],t,j,q,k)|0;break d}default:{r=s;n=0;o=19018;p=j;m=q;j=z}}while(0);f:do if((v|0)==67){s=E;r=c[s>>2]|0;s=c[s+4>>2]|0;p=oh(r,s,x,k&32)|0;o=(m&8|0)==0|(r|0)==0&(s|0)==0;n=o?0:2;o=o?19018:19018+(k>>>4)|0;q=m;k=r;m=s;v=73}else if((v|0)==72){p=qh(k,m,x)|0;v=73}else if((v|0)==77){v=0;s=dh(k,0,j)|0;q=(s|0)==0;r=k;n=0;o=19018;p=q?j:s-k|0;j=q?k+j|0:s}else if((v|0)==81){v=0;n=c[E>>2]|0;j=0;while(1){k=c[n>>2]|0;if(!k)break;k=th(H,k)|0;m=(k|0)<0;if(m|k>>>0>(o-j|0)>>>0){v=85;break}j=k+j|0;if(o>>>0>j>>>0)n=n+4|0;else break}if((v|0)==85){v=0;if(m){e=-1;break a}}sh(d,32,t,j,q);if(!j){j=0;v=91}else{m=c[E>>2]|0;n=0;while(1){k=c[m>>2]|0;if(!k){v=91;break f}k=th(H,k)|0;n=k+n|0;if((n|0)>(j|0)){v=91;break f}lh(d,H,k);if(n>>>0>=j>>>0){v=91;break}else m=m+4|0}}}while(0);if((v|0)==73){v=0;m=(k|0)!=0|(m|0)!=0;s=(j|0)!=0|m;m=z-p+((m^1)&1)|0;r=s?p:x;p=s?((j|0)>(m|0)?j:m):0;m=(j|0)>-1?q&-65537:q;j=z}else if((v|0)==91){v=0;sh(d,32,t,j,q^8192);j=(t|0)>(j|0)?t:j;break}q=j-r|0;p=(p|0)<(q|0)?q:p;s=p+n|0;j=(t|0)<(s|0)?s:t;sh(d,32,j,s,m);lh(d,o,n);sh(d,48,j,s,m^65536);sh(d,48,p,q,0);lh(d,r,q);sh(d,32,j,s,m^8192)}while(0);m=u}g:do if((v|0)==94)if(!d)if(!m)e=0;else{e=1;while(1){j=c[i+(e<<2)>>2]|0;if(!j)break;nh(g+(e<<3)|0,j,f);e=e+1|0;if(e>>>0>=10){e=1;break g}}while(1){if(c[i+(e<<2)>>2]|0){e=-1;break g}e=e+1|0;if(e>>>0>=10){e=1;break}}}while(0);l=I;return e|0}function jh(a){a=a|0;return 0}function kh(a){a=a|0;return}function lh(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))Gh(b,d,a)|0;return}function mh(b){b=b|0;var d=0,e=0;if(!(Xg(a[c[b>>2]>>0]|0)|0))d=0;else{d=0;do{e=c[b>>2]|0;d=(d*10|0)+-48+(a[e>>0]|0)|0;e=e+1|0;c[b>>2]=e}while((Xg(a[e>>0]|0)|0)!=0)}return d|0}function nh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function oh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[10768+(b&15)>>0]|0|f;b=Ai(b|0,c|0,4)|0;c=y}while(!((b|0)==0&(c|0)==0));return e|0}function ph(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Ai(b|0,c|0,3)|0;c=y}while(!((b|0)==0&(c|0)==0));return d|0}function qh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){do{e=b;b=xi(b|0,c|0,10,0)|0;f=c;c=y;g=vi(b|0,c|0,10,0)|0;g=qi(e|0,f|0,g|0,y|0)|0;d=d+-1|0;a[d>>0]=g&255|48}while(f>>>0>9|(f|0)==9&e>>>0>4294967295);c=b}else c=b;if(c)do{g=c;c=(c>>>0)/10|0;d=d+-1|0;a[d>>0]=g-(c*10|0)|48}while(g>>>0>=10);return d|0}function rh(a){a=a|0;return Bh(a,c[(Ah()|0)+188>>2]|0)|0}function sh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Fi(f|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{lh(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}lh(a,f,e)}l=g;return}function th(a,b){a=a|0;b=b|0;if(!a)a=0;else a=yh(a,b,0)|0;return a|0}function uh(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+32|0;v=H+536|0;G=H;F=G;n=H+540|0;c[v>>2]=0;E=n+12|0;vh(e)|0;j=y;if((j|0)<0){e=-e;vh(e)|0;D=1;C=19035;j=y}else{D=(h&2049|0)!=0&1;C=(h&2048|0)==0?((h&1|0)==0?19036:19041):19038}do if(0==0&(j&2146435072|0)==2146435072){G=(i&32|0)!=0;j=D+3|0;sh(b,32,f,j,h&-65537);lh(b,C,D);lh(b,e!=e|0.0!=0.0?(G?19062:19066):G?19054:19058,3);sh(b,32,f,j,h^8192)}else{r=+wh(e,v)*2.0;j=r!=0.0;if(j)c[v>>2]=(c[v>>2]|0)+-1;u=i|32;if((u|0)==97){p=i&32;s=(p|0)==0?C:C+9|0;q=D|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[s>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[v>>2]|0;j=(k|0)<0?0-k|0:k;j=qh(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;k=(g|0)<1;m=(h&8|0)==0;n=G;do{D=~~e;j=n+1|0;a[n>>0]=p|d[10768+D>>0];e=(e-+(D|0))*16.0;if((j-F|0)==1?!(m&(k&e==0.0)):0){a[j>>0]=46;n=n+2|0}else n=j}while(e!=0.0);if((g|0)!=0?(-2-F+n|0)<(g|0):0){k=E;m=o;j=g+2+k-m|0}else{k=E;m=o;j=k-F-m+n|0}E=j+q|0;sh(b,32,f,E,h);lh(b,s,q);sh(b,48,f,E,h^65536);F=n-F|0;lh(b,G,F);G=k-m|0;sh(b,48,j-(F+G)|0,0,0);lh(b,o,G);sh(b,32,f,E,h^8192);j=E;break}k=(g|0)<0?6:g;if(j){j=(c[v>>2]|0)+-28|0;c[v>>2]=j;e=r*268435456.0}else{e=r;j=c[v>>2]|0}B=(j|0)<0?m:m+288|0;m=B;do{z=~~e>>>0;c[m>>2]=z;m=m+4|0;e=(e-+(z>>>0))*1.0e9}while(e!=0.0);z=B;if((j|0)>0){p=B;while(1){o=(j|0)<29?j:29;j=m+-4|0;if(j>>>0>=p>>>0){n=0;do{t=Bi(c[j>>2]|0,0,o|0)|0;t=pi(t|0,y|0,n|0,0)|0;w=y;n=xi(t|0,w|0,1e9,0)|0;x=vi(n|0,y|0,1e9,0)|0;x=qi(t|0,w|0,x|0,y|0)|0;c[j>>2]=x;j=j+-4|0}while(j>>>0>=p>>>0);if(n){x=p+-4|0;c[x>>2]=n;n=x}else n=p}else n=p;a:do if(m>>>0>n>>>0){j=m;while(1){m=j+-4|0;if(c[m>>2]|0){m=j;break a}if(m>>>0>n>>>0)j=m;else break}}while(0);j=(c[v>>2]|0)-o|0;c[v>>2]=j;if((j|0)>0)p=n;else break}}else n=B;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(u|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0<m>>>0){o=(1<<s)+-1|0;p=1e9>>>s;q=0;j=n;do{x=c[j>>2]|0;c[j>>2]=(x>>>s)+q;q=N(x&o,p)|0;j=j+4|0}while(j>>>0<m>>>0);n=(c[n>>2]|0)==0?n+4|0:n;if(q){c[m>>2]=q;m=m+4|0}}else n=(c[n>>2]|0)==0?n+4|0:n;j=t?B:n;m=(m-j>>2|0)>(g|0)?j+(g<<2)|0:m;j=(c[v>>2]|0)+s|0;c[v>>2]=j}while((j|0)<0);t=n}else t=n;if(t>>>0<m>>>0){j=(z-t>>2)*9|0;o=c[t>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;j=j+1|0}while(o>>>0>=n>>>0)}}else j=0;w=(u|0)==103;x=(k|0)!=0;n=k-((u|0)==102?0:j)+((x&w)<<31>>31)|0;if((n|0)<(((m-z>>2)*9|0)+-9|0)){v=n+9216|0;n=(v|0)/9|0;g=B+4+(n+-1024<<2)|0;n=v-(n*9|0)|0;if((n|0)<8){o=10;while(1){o=o*10|0;if((n|0)<7)n=n+1|0;else break}}else o=10;q=c[g>>2]|0;n=(q>>>0)/(o>>>0)|0;s=q-(N(n,o)|0)|0;p=(g+4|0)==(m|0);if(!(p&(s|0)==0)){r=(n&1|0)==0?9007199254740992.0:9007199254740994.0;v=o>>>1;e=s>>>0<v>>>0?.5:p&(s|0)==(v|0)?1.0:1.5;if(D){v=(a[C>>0]|0)==45;e=v?-e:e;r=v?-r:r}n=q-s|0;c[g>>2]=n;if(r+e!=r){v=n+o|0;c[g>>2]=v;if(v>>>0>999999999){o=g;j=t;while(1){n=o+-4|0;c[o>>2]=0;if(n>>>0<j>>>0){j=j+-4|0;c[j>>2]=0}v=(c[n>>2]|0)+1|0;c[n>>2]=v;if(v>>>0>999999999)o=n;else{o=j;break}}}else{n=g;o=t}j=(z-o>>2)*9|0;q=c[o>>2]|0;if(q>>>0>=10){p=10;do{p=p*10|0;j=j+1|0}while(q>>>0>=p>>>0)}}else{n=g;o=t}}else{n=g;o=t}v=n+4|0;m=m>>>0>v>>>0?v:m}else o=t;g=0-j|0;b:do if(m>>>0>o>>>0)while(1){n=m+-4|0;if(c[n>>2]|0){v=m;u=1;break b}if(n>>>0>o>>>0)m=n;else{v=n;u=0;break}}else{v=m;u=0}while(0);do if(w){k=k+((x^1)&1)|0;if((k|0)>(j|0)&(j|0)>-5){p=i+-1|0;k=k+-1-j|0}else{p=i+-2|0;k=k+-1|0}if(!(h&8)){if(u?(A=c[v+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){n=0;m=10;do{m=m*10|0;n=n+1|0}while(!((A>>>0)%(m>>>0)|0|0))}else n=0;else n=9;m=((v-z>>2)*9|0)+-9|0;if((p|32|0)==102){i=m-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}else{i=m+j-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}}}else p=i;while(0);t=(k|0)!=0;q=t?1:h>>>3&1;s=(p|32|0)==102;if(s){w=0;j=(j|0)>0?j:0}else{m=(j|0)<0?g:j;m=qh(m,((m|0)<0)<<31>>31,E)|0;n=E;if((n-m|0)<2)do{m=m+-1|0;a[m>>0]=48}while((n-m|0)<2);a[m+-1>>0]=(j>>31&2)+43;j=m+-2|0;a[j>>0]=p;w=j;j=n-j|0}j=D+1+k+q+j|0;sh(b,32,f,j,h);lh(b,C,D);sh(b,48,f,j,h^65536);if(s){q=o>>>0>B>>>0?B:o;s=G+9|0;o=s;p=G+8|0;n=q;do{m=qh(c[n>>2]|0,0,s)|0;if((n|0)==(q|0)){if((m|0)==(s|0)){a[p>>0]=48;m=p}}else if(m>>>0>G>>>0){Fi(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}lh(b,m,o-m|0);n=n+4|0}while(n>>>0<=B>>>0);if(!((h&8|0)==0&(t^1)))lh(b,19070,1);if(n>>>0<v>>>0&(k|0)>0)while(1){m=qh(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){Fi(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}lh(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0<v>>>0&(k|0)>9)){k=m;break}else k=m}sh(b,48,k+9|0,9,0)}else{v=u?v:o+4|0;if(o>>>0<v>>>0&(k|0)>-1){g=G+9|0;t=(h&8|0)==0;u=g;q=0-F|0;s=G+8|0;p=o;do{m=qh(c[p>>2]|0,0,g)|0;if((m|0)==(g|0)){a[s>>0]=48;m=s}do if((p|0)==(o|0)){n=m+1|0;lh(b,m,1);if(t&(k|0)<1){m=n;break}lh(b,19070,1);m=n}else{if(m>>>0<=G>>>0)break;Fi(G|0,48,m+q|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=u-m|0;lh(b,m,(k|0)>(F|0)?F:k);k=k-F|0;p=p+4|0}while(p>>>0<v>>>0&(k|0)>-1)}sh(b,48,k+18|0,18,0);lh(b,w,E-w|0)}sh(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function vh(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;y=c[j+4>>2]|0;return b|0}function wh(a,b){a=+a;b=b|0;return +(+xh(a,b))}function xh(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Ai(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+xh(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function yh(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(zh()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(Ug()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(Ug()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function zh(){return Yg()|0}function Ah(){return Yg()|0}function Bh(b,e){b=b|0;e=e|0;var f=0,g=0;f=0;while(1){if((d[10784+f>>0]|0)==(b|0)){g=4;break}f=f+1|0;if((f|0)==87){b=87;g=5;break}}if((g|0)==4)if(!f)f=10880;else{b=f;g=5}if((g|0)==5){f=10880;do{do{g=f;f=f+1|0}while((a[g>>0]|0)!=0);b=b+-1|0}while((b|0)!=0)}return Ch(f,c[e+20>>2]|0)|0}function Ch(a,b){a=a|0;b=b|0;return Dh(a,b)|0}function Dh(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Eh(c[b>>2]|0,c[b+4>>2]|0,a)|0;return ((b|0)==0?a:b)|0}function Eh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=Fh(c[b+8>>2]|0,o)|0;f=Fh(c[b+12>>2]|0,o)|0;g=Fh(c[b+16>>2]|0,o)|0;a:do if((h>>>0<d>>>2>>>0?(n=d-(h<<2)|0,f>>>0<n>>>0&g>>>0<n>>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=Fh(c[b+(g<<2)>>2]|0,o)|0;g=Fh(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<d>>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=Zg(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}l=f?l:k;h=f?j:h-j|0}f=i+m|0;g=Fh(c[b+(f<<2)>>2]|0,o)|0;f=Fh(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0<d>>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Fh(a,b){a=a|0;b=b|0;var c=0;c=Ci(a|0)|0;return ((b|0)==0?a:c)|0}function Gh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Hh(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0<d>>>0){f=Xa[c[e+36>>2]&31](e,b,d)|0;break}b:do if((a[e+75>>0]|0)<0|(d|0)==0){h=0;g=b}else{i=d;while(1){g=i+-1|0;if((a[b+g>>0]|0)==10)break;if(!g){h=0;g=b;break b}else i=g}f=Xa[c[e+36>>2]&31](e,b,i)|0;if(f>>>0<i>>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}while(0);Ei(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}function Hh(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function Ih(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;Ei(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Jh(a,b){a=a|0;b=b|0;return Kh(a,b,(_g(a)|0)+1|0)|0}function Kh(b,c,d){b=b|0;c=c|0;d=d|0;a:do if(!d)d=0;else{c=c&255;while(1){d=d+-1|0;if((a[b+d>>0]|0)==c<<24>>24)break;if(!d){d=0;break a}}d=b+d|0}while(0);return d|0}function Lh(a){a=a|0;var b=0,c=0;b=(_g(a)|0)+1|0;c=Lg(b)|0;if(!c)a=0;else a=Ei(c|0,a|0,b|0)|0;return a|0}function Mh(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=ch(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=Nh(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=Oh(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=Ph(b,c)|0;break}else{b=Qh(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function Nh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c>>0]|0)<<8|(d[c+1>>0]|0);c=b+1|0;e=a[c>>0]|0;a:do if(!(e<<24>>24))c=0;else{e=(d[b>>0]|0)<<8|e&255;while(1){b=e&65535;if((b|0)==(f|0))break;c=c+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){c=0;break a}else e=b<<8|e&255}c=c+-1|0}while(0);return c|0}function Oh(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=(b|c&255)<<8;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-2|0)|0}function Ph(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);e=b+3|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|c&255;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=b<<8|c&255;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-3|0)|0} +function Uf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+32|0;s=x+8|0;t=x;u=x+16|0;if(!f){l=x;return}v=21712;v=pi(c[v>>2]|0,c[v+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;w=y;c[5427]=f;h=c[5449]&c[5450];if(h){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f){g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1}else i=12}else i=12;a:do if((i|0)==12){c[5431]=-1;c[5356]=0;c[5357]=0;r=21160;h=c[r+4>>2]|0;f=21432;c[f>>2]=c[r>>2];c[f+4>>2]=h;f=0;h=0;b:while(1){if(f>>>0<(c[5357]|0)>>>0)f=e[f+2>>1]<<16|e[f>>1];else{j=21432;j=pi(c[j>>2]|0,c[j+4>>2]|0,h|0,0)|0;k=y;r=21160;c[r>>2]=j;c[r+4>>2]=k;if((c[5427]|0)<1){i=40;break}h=c[5449]&c[5450];if(h|0){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f|0){i=21;break}}f=Ai(j|0,k|0,12)|0;f=f&255;r=30080+(f<<4)|0;if((c[r>>2]|0)==(j&-4096|0)?(c[r+4>>2]|0)==(k|0):0){h=(c[30080+(f<<4)+8>>2]|0)+j|0;i=h;c[u>>2]=i;f=j}else{if(Xf(u,j,k)|0){i=39;break}h=c[u>>2]|0;i=h;f=j}c[5356]=h;r=4094-(f&4095)|0;c[5357]=i+r;q=qi(j|0,k|0,h|0,0)|0;f=21432;c[f>>2]=q;c[f+4>>2]=y;f=e[h>>1]|0;if((r|0)<=0){if((f&3|0)==3){h=pi(j|0,k|0,2,0)|0;i=y;j=Ai(h|0,i|0,12)|0;j=j&255;r=30080+(j<<4)|0;if((c[r>>2]|0)==(h&-4096|0)?(c[r+4>>2]|0)==(i|0):0){h=(c[30080+(j<<4)+8>>2]|0)+h|0;c[s>>2]=h}else{if(Xf(s,h,i)|0){i=35;break}h=c[s>>2]|0}f=e[h>>1]<<16|f}}else f=e[i+2>>1]<<16|f}h=(c[5427]|0)+-1|0;c[5427]=h;j=f>>>7;r=j&31;p=f>>>15&31;o=f>>>20;q=o&31;c:do switch(f&127){case 124:case 120:case 116:case 112:case 108:case 104:case 100:case 96:case 92:case 88:case 84:case 80:case 76:case 72:case 68:case 64:case 60:case 56:case 52:case 48:case 44:case 40:case 36:case 32:case 28:case 24:case 20:case 16:case 12:case 8:case 4:case 0:{h=f>>>2;m=h&7|8;d:do switch(f>>>13&7){case 0:{h=j&48|f>>>1&960|f>>>4&4|h&8;if(!h){i=504;break b}q=h+(c[5296]|0)|0;r=21168+(m<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break}case 1:{if(!(a[21703]|0)){i=504;break b}f=(j&56|f<<1&192)+(c[21168+((j&7|8)<<3)>>2]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4089|0)?(c[r+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,s,f,h,3)|0){i=52;break b}h=s;f=c[h>>2]|0;h=c[h+4>>2]|0}r=21440+(m<<3)|0;c[r>>2]=f;c[r+4>>2]=h;a[21703]=3;break}case 2:{f=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4093|0)?(c[r+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=58;break b}f=c[s>>2]|0}r=21168+(m<<3)|0;c[r>>2]=f;c[r+4>>2]=((f|0)<0)<<31>>31;break}case 3:{if(!(a[21703]|0)){i=504;break b}f=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4093|0)?(c[r+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=65;break b}f=c[s>>2]|0}r=21440+(m<<3)|0;c[r>>2]=f;c[r+4>>2]=-1;a[21703]=3;break}case 5:{if(!(a[21703]|0)){i=504;break b}j=(j&56|f<<1&192)+(c[21168+((j&7|8)<<3)>>2]|0)|0;k=((j|0)<0)<<31>>31;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;r=25984+(i<<4)|0;if(!((c[r>>2]|0)==(j&-4089|0)?(c[r+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break d;else{i=506;break b}else{r=(c[25984+(i<<4)+8>>2]|0)+j|0;c[r>>2]=f;c[r+4>>2]=h;break d}}case 6:{i=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;j=((i|0)<0)<<31>>31;f=c[21168+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break d;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break d}}case 7:{if(!(a[21703]|0)){i=504;break b}i=(j&56|f>>>4&4|f<<1&64)+(c[21168+((j&7|8)<<3)>>2]|0)|0;j=((i|0)<0)<<31>>31;f=c[21440+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break d;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break d}}default:{i=504;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 125:case 121:case 117:case 113:case 109:case 105:case 101:case 97:case 93:case 89:case 85:case 81:case 77:case 73:case 69:case 65:case 61:case 57:case 53:case 49:case 45:case 41:case 37:case 33:case 29:case 25:case 21:case 17:case 13:case 9:case 5:case 1:{e:do switch(f>>>13&7){case 0:{if(r|0){r=21168+(r<<3)|0;q=((j&32|f>>>2&31)<<26>>26)+(c[r>>2]|0)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}break}case 1:{h=f>>>1;q=c[5356]|0;o=21432;r=c[o>>2]|0;o=c[o+4>>2]|0;p=21176;c[p>>2]=pi(pi(q|0,0,2,0)|0,y|0,r|0,o|0)|0;c[p+4>>2]=y;r=q+((h&2048|j&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)+r|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}case 2:{if(r|0){q=(j&32|f>>>2&31)<<26>>26;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}break}case 3:{switch(j&31){case 0:break e;case 2:break;default:{q=(f<<19&-2147483648|f<<24&2080374784)>>14;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break e}}h=f>>>3&512|f>>>2&16|f<<1&64|f<<4&384|f<<3&32;if(!h){i=504;break b}q=(h<<22>>22)+(c[5296]|0)|0;r=21184;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break}case 4:{i=f>>>10;k=j&7|8;switch(i&3){case 1:case 0:{r=j&32;j=r|f>>>2&31;if(r|0){i=504;break b}h=21168+(k<<3)|0;i=c[h>>2]|0;if(!(f&3072)){q=i>>>j;r=h;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break e}else{q=i>>j;r=h;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31;break e}}case 2:{p=(j&32|f>>>2&31)<<26>>26;r=21168+(k<<3)|0;o=r;q=c[o+4>>2]&((p|0)<0)<<31>>31;c[r>>2]=c[o>>2]&p;c[r+4>>2]=q;break e}case 3:{h=f>>>2&7|8;switch((f>>>5&3|i&4)&7){case 0:{r=21168+(k<<3)|0;p=r;q=21168+(h<<3)|0;c[r>>2]=zi(0,qi(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0)|0,32)|0;c[r+4>>2]=y;break e}case 1:{r=21168+(k<<3)|0;p=r;o=21168+(h<<3)|0;q=c[o+4>>2]^c[p+4>>2];c[r>>2]=c[o>>2]^c[p>>2];c[r+4>>2]=q;break e}case 2:{r=21168+(k<<3)|0;p=r;o=21168+(h<<3)|0;q=c[o+4>>2]|c[p+4>>2];c[r>>2]=c[o>>2]|c[p>>2];c[r+4>>2]=q;break e}case 3:{r=21168+(k<<3)|0;p=r;o=21168+(h<<3)|0;q=c[o+4>>2]&c[p+4>>2];c[r>>2]=c[o>>2]&c[p>>2];c[r+4>>2]=q;break e}default:{i=504;break b}}}default:{i=105;break b}}}case 5:{r=f>>>1;r=(c[5356]|0)+((r&2048|j&16|r&768|f<<2&1024|r&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}case 6:{r=21168+((j&7|8)<<3)|0;if((c[r>>2]|0)==0&(c[r+4>>2]|0)==0){r=(c[5356]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}break}case 7:{r=21168+((j&7|8)<<3)|0;if(!((c[r>>2]|0)==0&(c[r+4>>2]|0)==0)){r=(c[5356]|0)+((f>>>4&256|j&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}break}default:{i=500;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 126:case 122:case 118:case 114:case 110:case 106:case 102:case 98:case 94:case 90:case 86:case 82:case 78:case 74:case 70:case 66:case 62:case 58:case 54:case 50:case 46:case 42:case 38:case 34:case 30:case 26:case 22:case 18:case 14:case 10:case 6:case 2:{h=f>>>2;m=h&31;f:do switch(f>>>13&7){case 0:{h=j&32;if(h|0){i=504;break b}if(r|0){r=21168+(r<<3)|0;q=r;q=Bi(c[q>>2]|0,c[q+4>>2]|0,h|m|0)|0;q=zi(0,q|0,32)|0;c[r>>2]=q;c[r+4>>2]=y}break}case 1:{if(!(a[21703]|0)){i=504;break b}f=(j&32|h&24|f<<4&448)+(c[5296]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;q=21888+(i<<4)|0;if((c[q>>2]|0)==(f&-4089|0)?(c[q+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,s,f,h,3)|0){i=117;break b}h=s;f=c[h>>2]|0;h=c[h+4>>2]|0}r=21440+(r<<3)|0;c[r>>2]=f;c[r+4>>2]=h;a[21703]=3;break}case 2:{f=(j&32|h&28|f<<4&192)+(c[5296]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;q=21888+(i<<4)|0;if((c[q>>2]|0)==(f&-4093|0)?(c[q+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=124;break b}f=c[s>>2]|0}if(r|0){r=21168+(r<<3)|0;c[r>>2]=f;c[r+4>>2]=((f|0)<0)<<31>>31}break}case 3:{if(!(a[21703]|0)){i=504;break b}f=(j&32|h&28|f<<4&192)+(c[5296]|0)|0;h=((f|0)<0)<<31>>31;i=f>>>12&255;q=21888+(i<<4)|0;if((c[q>>2]|0)==(f&-4093|0)?(c[q+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,s,f,h,2)|0){i=131;break b}f=c[s>>2]|0}r=21440+(r<<3)|0;c[r>>2]=f;c[r+4>>2]=-1;a[21703]=3;break}case 4:{h=(m|0)==0;i=(r|0)==0;if(!(f&4096))if(h){if(i){i=504;break b}r=21168+(r<<3)|0;f=c[r+4>>2]|0;r=c[r>>2]&-2;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}else{if(i)break f;p=21168+(m<<3)|0;q=c[p+4>>2]|0;r=21168+(r<<3)|0;c[r>>2]=c[p>>2];c[r+4>>2]=q;break f}else if(h){if(i){i=140;break b}q=21432;f=c[q>>2]|0;q=c[q+4>>2]|0;h=pi(c[5356]|0,0,2,0)|0;q=pi(h|0,y|0,f|0,q|0)|0;r=21168+(r<<3)|0;f=c[r+4>>2]|0;r=c[r>>2]&-2;h=21160;c[h>>2]=r;c[h+4>>2]=f;h=21176;c[h>>2]=q;c[h+4>>2]=y;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}else{if(i)break f;r=21168+(r<<3)|0;q=r;p=21168+(m<<3)|0;q=pi(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0)|0;q=zi(0,q|0,32)|0;c[r>>2]=q;c[r+4>>2]=y;break f}}case 5:{if(!(a[21703]|0)){i=504;break b}j=(j&56|f>>>1&448)+(c[5296]|0)|0;k=((j|0)<0)<<31>>31;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=j>>>12&255;r=25984+(i<<4)|0;if(!((c[r>>2]|0)==(j&-4089|0)?(c[r+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break f;else{i=506;break b}else{r=(c[25984+(i<<4)+8>>2]|0)+j|0;c[r>>2]=f;c[r+4>>2]=h;break f}}case 6:{i=(j&60|f>>>1&192)+(c[5296]|0)|0;j=((i|0)<0)<<31>>31;f=c[21168+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break f;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break f}}case 7:{if(!(a[21703]|0)){i=504;break b}i=(j&60|f>>>1&192)+(c[5296]|0)|0;j=((i|0)<0)<<31>>31;f=c[21440+(m<<3)>>2]|0;h=i>>>12&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break f;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break f}}default:{i=501;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 55:{if(r|0){q=f&-4096;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 23:{if(r|0){q=(c[5356]|0)+(f&-4096)+(c[5358]|0)|0;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=((q|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 111:{if(r|0){q=21432;p=c[q>>2]|0;q=c[q+4>>2]|0;n=pi(c[5356]|0,0,4,0)|0;q=pi(n|0,y|0,p|0,q|0)|0;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=y}r=(c[5356]|0)+((o&2046|f&1044480|f>>>11&1048576|f>>>9&2048)<<11>>11)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break}case 103:{i=c[5356]|0;k=21432;j=c[k>>2]|0;k=c[k+4>>2]|0;f=(f>>20)+(c[21168+(p<<3)>>2]|0)&-2;h=((f|0)<0)<<31>>31;q=21160;c[q>>2]=f;c[q+4>>2]=h;if(r|0){q=pi(i|0,0,4,0)|0;q=pi(q|0,y|0,j|0,k|0)|0;r=21168+(r<<3)|0;c[r>>2]=q;c[r+4>>2]=y}c[5356]=0;c[5357]=0;r=21432;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break}case 99:{switch(f>>>13&3){case 0:{r=21168+(p<<3)|0;h=21168+(q<<3)|0;h=(c[r>>2]|0)==(c[h>>2]|0)?(c[r+4>>2]|0)==(c[h+4>>2]|0):0;break}case 2:{r=21168+(p<<3)|0;p=c[r+4>>2]|0;h=21168+(q<<3)|0;q=c[h+4>>2]|0;h=(p|0)<(q|0)|((p|0)==(q|0)?(c[r>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}case 3:{r=21168+(p<<3)|0;p=c[r+4>>2]|0;h=21168+(q<<3)|0;q=c[h+4>>2]|0;h=p>>>0<q>>>0|((p|0)==(q|0)?(c[r>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}default:{i=504;break b}}if((f&4096|0)!=0^h){r=(c[5356]|0)+((f>>>19&4096|o&2016|j&30|f<<4&2048)<<19>>19)+(c[5358]|0)|0;f=((r|0)<0)<<31>>31;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}else{f=(c[5356]|0)+4|0;c[5356]=f;h=f;break c}}case 3:{h=f>>20;i=21168+(p<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;switch(f>>>12&7){case 0:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4096|0)?(c[q+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,s,h,i,0)|0){i=181;break b}f=c[s>>2]&255}f=f<<24>>24;h=f;f=((f|0)<0)<<31>>31;break}case 1:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4095|0)?(c[q+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,s,h,i,1)|0){i=187;break b}f=c[s>>2]&65535}f=f<<16>>16;h=f;f=((f|0)<0)<<31>>31;break}case 2:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4093|0)?(c[q+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,s,h,i,2)|0){i=193;break b}f=c[s>>2]|0}h=f;f=((f|0)<0)<<31>>31;break}case 4:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4096|0)?(c[q+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,s,h,i,0)|0){i=199;break b}f=c[s>>2]&255}h=f&255;f=0;break}case 5:{f=(Ai(h|0,i|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(h&-4095|0)?(c[q+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,s,h,i,1)|0){i=205;break b}f=c[s>>2]&65535}h=f&65535;f=0;break}default:{i=504;break b}}if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 35:{i=(r|o&4064)<<20>>20;j=21168+(p<<3)|0;i=pi(c[j>>2]|0,c[j+4>>2]|0,i|0,((i|0)<0)<<31>>31|0)|0;j=y;h=c[21168+(q<<3)>>2]|0;g:do switch(f>>>12&7){case 0:{f=(Ai(i|0,j|0,12)|0)&255;r=25984+(f<<4)|0;if(!((c[r>>2]|0)==(i&-4096|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,h&255,0,0)|0))break g;else{i=506;break b}else{a[(c[25984+(f<<4)+8>>2]|0)+i>>0]=h;break g}}case 1:{f=(Ai(i|0,j|0,12)|0)&255;r=25984+(f<<4)|0;if(!((c[r>>2]|0)==(i&-4095|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,h&65535,0,1)|0))break g;else{i=506;break b}else{b[(c[25984+(f<<4)+8>>2]|0)+i>>1]=h;break g}}case 2:{f=(Ai(i|0,j|0,12)|0)&255;r=25984+(f<<4)|0;if(!((c[r>>2]|0)==(i&-4093|0)?(c[r+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,h,0,2)|0))break g;else{i=506;break b}else{c[(c[25984+(f<<4)+8>>2]|0)+i>>2]=h;break g}}default:{i=504;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 19:{j=f>>20;h:do switch(f>>>12&7){case 0:{f=j+(c[21168+(p<<3)>>2]|0)|0;h=f;f=((f|0)<0)<<31>>31;break}case 1:{if(j>>>0>31){i=504;break b}h=21168+(p<<3)|0;h=zi(0,Bi(c[h>>2]|0,c[h+4>>2]|0,j&31|0)|0,32)|0;f=y;break}case 2:{h=21168+(p<<3)|0;q=c[h+4>>2]|0;f=((j|0)<0)<<31>>31;h=((q|0)<(f|0)|((q|0)==(f|0)?(c[h>>2]|0)>>>0<j>>>0:0))&1;f=0;break}case 3:{h=21168+(p<<3)|0;q=c[h+4>>2]|0;f=((j|0)<0)<<31>>31;h=(q>>>0<f>>>0|((q|0)==(f|0)?(c[h>>2]|0)>>>0<j>>>0:0))&1;f=0;break}case 4:{f=21168+(p<<3)|0;h=c[f>>2]^j;f=c[f+4>>2]^((j|0)<0)<<31>>31;break}case 5:{if(j&-1056|0){i=504;break b}i=c[21168+(p<<3)>>2]|0;h=j&31;if(!(f&1073741824)){f=i>>>h;h=f;f=((f|0)<0)<<31>>31;break h}else{f=i>>h;h=f;f=((f|0)<0)<<31>>31;break h}}case 6:{f=21168+(p<<3)|0;h=c[f>>2]|j;f=c[f+4>>2]|((j|0)<0)<<31>>31;break}default:{f=21168+(p<<3)|0;h=c[f>>2]&j;f=c[f+4>>2]&((j|0)<0)<<31>>31}}while(0);if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 51:{k=21168+(p<<3)|0;i=c[k>>2]|0;k=c[k+4>>2]|0;j=21168+(q<<3)|0;h=c[j>>2]|0;j=c[j+4>>2]|0;q=t;c[q>>2]=h;c[q+4>>2]=j;i:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{f=N(h,i)|0;h=f;f=((f|0)<0)<<31>>31;break i}case 1:{q=zi(0,i|0,32)|0;f=y;h=zi(vi(zi(0,h|0,32)|0,y|0,q|0,f|0)|0,y|0,32)|0;f=y;break i}case 2:{h=zi(vi(h|0,0,zi(0,i|0,32)|0,y|0)|0,y|0,32)|0;f=y;break i}case 3:{vi(h|0,0,i|0,0)|0;h=y;f=0;break i}case 4:{if(h)if((i|0)==-2147483648&(h|0)==-1)f=-2147483648;else f=(i|0)/(h|0)|0;else f=-1;h=f;f=((f|0)<0)<<31>>31;break i}case 5:{if(!h)f=-1;else f=(i>>>0)/(h>>>0)|0;h=f;f=((f|0)<0)<<31>>31;break i}case 6:{if(h)if((i|0)==-2147483648&(h|0)==-1)f=0;else f=(i|0)%(h|0)|0;else f=i;h=f;f=((f|0)<0)<<31>>31;break i}case 7:{if(!h)f=i;else f=(i>>>0)%(h>>>0)|0;h=f;f=((f|0)<0)<<31>>31;break i}default:{i=502;break b}}else{if(f&-1107296256|0){i=504;break b}do switch((f>>>12&7|f>>>27&8)&15){case 0:{h=zi(0,pi(h|0,j|0,i|0,k|0)|0,32)|0;f=y;break i}case 8:{h=zi(0,qi(i|0,k|0,h|0,j|0)|0,32)|0;f=y;break i}case 1:{h=zi(0,Bi(i|0,k|0,h&31|0)|0,32)|0;f=y;break i}case 2:{h=((k|0)<(j|0)|(k|0)==(j|0)&i>>>0<h>>>0)&1;f=0;break i}case 3:{h=(k>>>0<j>>>0|(k|0)==(j|0)&i>>>0<h>>>0)&1;f=0;break i}case 4:{h=h^i;f=j^k;break i}case 5:{f=i>>>(h&31);h=f;f=((f|0)<0)<<31>>31;break i}case 13:{f=i>>(h&31);h=f;f=((f|0)<0)<<31>>31;break i}case 6:{h=h|i;f=j|k;break i}case 7:{h=h&i;f=j&k;break i}default:{i=504;break b}}while(0)}while(0);if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 115:{if(!(f&16384)){n=21168+(p<<3)|0;m=c[n>>2]|0;n=c[n+4>>2]|0}else{m=p;n=0}i=f&12288;j:do switch(f>>>12&3){case 1:{q=21712;c[q>>2]=qi(v|0,w|0,h|0,((h|0)<0)<<31>>31|0)|0;c[q+4>>2]=y;if(_f(t,o,1)|0){i=504;break b}h=zi(0,c[t>>2]|0,32)|0;j=y;i=t;c[i>>2]=h;c[i+4>>2]=j;i=$f(o,m,n)|0;if((i|0)<0){i=504;break b}if(r|0){r=21168+(r<<3)|0;c[r>>2]=h;c[r+4>>2]=j}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;r=pi(c[5356]|0,0,4,0)|0;f=pi(r|0,y|0,h|0,f|0)|0;h=y;r=21160;c[r>>2]=f;c[r+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;r=21432;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break c}break}case 3:case 2:{q=21712;c[q>>2]=qi(v|0,w|0,h|0,((h|0)<0)<<31>>31|0)|0;c[q+4>>2]=y;h=(p|0)!=0;if(_f(t,o,h&1)|0){i=504;break b}j=zi(0,c[t>>2]|0,32)|0;k=y;q=t;c[q>>2]=j;c[q+4>>2]=k;if(h){h=(i|0)==8192;h=$f(o,h?j|m:j&~m,h?k|n:k&~n)|0;if((h|0)<0){i=504;break b}else i=h}else i=0;if(r|0){r=21168+(r<<3)|0;c[r>>2]=j;c[r+4>>2]=k}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;r=pi(c[5356]|0,0,4,0)|0;f=pi(r|0,y|0,h|0,f|0)|0;h=y;r=21160;c[r>>2]=f;c[r+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;r=21432;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break c}break}case 0:{switch(o&4095){case 0:{i=291;break b}case 1:{i=293;break b}case 258:{i=295;break b}case 770:{i=301;break b}case 261:{if((f&32640|0)!=0|(a[21702]|0)==0){i=504;break b}if(!(c[5449]&c[5450])){i=313;break b}else break j}default:{}}if((f&-33521792|0)!=301989888|(a[21702]|0)==0){i=504;break b}if(!p){f=0;do{r=21888+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=25984+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=30080+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;f=f+1|0}while((f|0)!=256)}else{f=0;do{r=21888+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=25984+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;r=30080+(f<<4)|0;c[r>>2]=-1;c[r+4>>2]=-1;f=f+1|0}while((f|0)!=256)}r=21432;f=c[r>>2]|0;r=c[r+4>>2]|0;h=pi(c[5356]|0,0,4,0)|0;r=pi(h|0,y|0,f|0,r|0)|0;f=y;h=21160;c[h>>2]=r;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=r;c[h+4>>2]=f;h=0;f=0;break c}default:{i=503;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 15:{switch(f>>>12&7){case 0:{if(f&-267387008|0){i=504;break b}break}case 1:{if((f|0)!=4111){i=504;break b}break}default:{i=504;break b}}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 47:{if((f&28672|0)!=8192){i=504;break b}p=21168+(p<<3)|0;o=c[p>>2]|0;p=c[p+4>>2]|0;j=f>>>27&255;k:do switch(j&31){case 2:{if(q|0){i=504;break b}f=(Ai(o|0,p|0,12)|0)&255;q=21888+(f<<4)|0;if((c[q>>2]|0)==(o&-4093|0)?(c[q+4>>2]|0)==(p|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,s,o,p,2)|0){i=333;break b}f=c[s>>2]|0}h=21872;c[h>>2]=o;c[h+4>>2]=p;h=f;f=((f|0)<0)<<31>>31;break}case 3:{n=21872;if((c[n>>2]|0)==(o|0)?(c[n+4>>2]|0)==(p|0):0){f=c[21168+(q<<3)>>2]|0;h=Ai(o|0,p|0,12)|0;h=h&255;q=25984+(h<<4)|0;if(!((c[q>>2]|0)==(o&-4093|0)?(c[q+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){h=0;f=0;break k}else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+o>>2]=f;h=0;f=0;break k}}else{h=1;f=0}break}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{k=(Ai(o|0,p|0,12)|0)&255;n=21888+(k<<4)|0;m=o&-4093;if((c[n>>2]|0)==(m|0)?(c[n+4>>2]|0)==(p|0):0)h=c[(c[21888+(k<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,s,o,p,2)|0){i=343;break b}h=c[s>>2]|0}n=((h|0)<0)<<31>>31;z=21168+(q<<3)|0;i=c[z>>2]|0;z=c[z+4>>2]|0;q=t;c[q>>2]=i;c[q+4>>2]=z;switch(j&31){case 1:{f=i;break}case 0:{f=h+i|0;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 4:{f=h^i;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 12:{f=h&i;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 8:{f=h|i;q=((f|0)<0)<<31>>31;z=t;c[z>>2]=f;c[z+4>>2]=q;break}case 16:{if((h|0)<(i|0)){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 20:{if((h|0)>(i|0)){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 24:{if(h>>>0<i>>>0){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 28:{if(h>>>0>i>>>0){f=t;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}default:{i=504;break b}}z=25984+(k<<4)|0;if(!((c[z>>2]|0)==(m|0)?(c[z+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){f=n;break k}else{i=506;break b}else{c[(c[25984+(k<<4)+8>>2]|0)+o>>2]=f;f=n;break k}}default:{i=504;break b}}while(0);if(r|0){z=21168+(r<<3)|0;c[z>>2]=h;c[z+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 7:{if(!(a[21703]|0)){i=504;break b}h=f>>20;i=21168+(p<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;l:do switch(f>>>12&7){case 2:{f=(Ai(h|0,i|0,12)|0)&255;z=21888+(f<<4)|0;if((c[z>>2]|0)==(h&-4093|0)?(c[z+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,s,h,i,2)|0){i=370;break b}f=c[s>>2]|0}h=-1;break}case 3:{f=(Ai(h|0,i|0,12)|0)&255;z=21888+(f<<4)|0;if((c[z>>2]|0)==(h&-4089|0)?(c[z+4>>2]|0)==(i|0):0){h=(c[21888+(f<<4)+8>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break l}if(Yf(21152,s,h,i,3)|0){i=375;break b}h=s;f=c[h>>2]|0;h=c[h+4>>2]|0;break}default:{i=504;break b}}while(0);z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 39:{if(!(a[21703]|0)){i=504;break b}j=(r|o&4064)<<20>>20;k=21168+(p<<3)|0;j=pi(c[k>>2]|0,c[k+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;k=y;m:do switch(f>>>12&7){case 2:{f=c[21440+(q<<3)>>2]|0;h=(Ai(j|0,k|0,12)|0)&255;z=25984+(h<<4)|0;if(!((c[z>>2]|0)==(j&-4093|0)?(c[z+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,0,2)|0))break m;else{i=506;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+j>>2]=f;break m}}case 3:{h=21440+(q<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;z=25984+(i<<4)|0;if(!((c[z>>2]|0)==(j&-4089|0)?(c[z+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break m;else{i=506;break b}else{z=(c[25984+(i<<4)+8>>2]|0)+j|0;c[z>>2]=f;c[z+4>>2]=h;break m}}default:{i=504;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 67:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]|0,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 71:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]|0,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 75:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]^-2147483648,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]^-2147483648,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 79:{if(!(a[21703]|0)){i=504;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=504;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(p<<3)>>2]^-2147483648,c[21440+(q<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{p=21440+(p<<3)|0;z=21440+(q<<3)|0;f=21440+(i<<3)|0;f=bc(c[p>>2]|0,c[p+4>>2]^-2147483648,c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 83:{if(!(a[21703]|0)){i=504;break b}h=f>>>12;i=h&7;do switch(f>>>25&127){case 0:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Cb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 4:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Eb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 8:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Fb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 12:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Hb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 44:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((q|0)!=0|(h|0)<0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=Ib(c[21440+(p<<3)>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 16:{switch(h&7){case 0:{h=21440+(q<<3)|0;f=c[h>>2]&-2147483648|c[21440+(p<<3)>>2]&2147483647;h=c[h+4>>2]|0;break}case 1:{h=21440+(q<<3)|0;f=(c[h>>2]&-2147483648|c[21440+(p<<3)>>2]&2147483647)^-2147483648;h=~c[h+4>>2];break}case 2:{h=21440+(p<<3)|0;z=21440+(q<<3)|0;f=c[z>>2]&-2147483648^c[h>>2];h=c[z+4>>2]^c[h+4>>2];break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;break}case 20:{switch(h&7){case 0:{f=Jb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696,2)|0;break}case 1:{f=Kb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696,2)|0;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=-1;a[21703]=3;break}case 96:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=Pb(c[21440+(p<<3)>>2]|0,h,21696)|0;break}case 1:{f=Rb(c[21440+(p<<3)>>2]|0,h,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 80:{switch(h&7){case 0:{f=Mb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696)|0;break}case 1:{f=Nb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696)|0;break}case 2:{f=Lb(c[21440+(p<<3)>>2]|0,c[21440+(q<<3)>>2]|0,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 104:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=Sb(c[21168+(p<<3)>>2]|0,h,21696)|0;break}case 1:{f=Tb(c[21168+(p<<3)>>2]|0,h,21696)|0;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=-1;a[21703]=3;break}case 32:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if(!((q|0)==1&(h|0)>-1)){i=504;break b}q=21440+(p<<3)|0;z=21440+(r<<3)|0;c[z>>2]=lc(c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=-1;a[21703]=3;break}case 112:{if(q|0){i=504;break b}switch(h&7){case 0:{f=zi(0,c[21440+(p<<3)>>2]|0,32)|0;h=y;break}case 1:{f=Ob(c[21440+(p<<3)>>2]|0)|0;h=0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h}break}case 120:{if(q|i|0){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=zi(0,c[21168+(p<<3)>>2]|0,32)|0;c[z+4>>2]=y;a[21703]=3;break}case 1:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=Zb(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 5:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=$b(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 9:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=ac(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 13:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}p=21440+(p<<3)|0;q=21440+(q<<3)|0;z=21440+(r<<3)|0;c[z>>2]=cc(c[p>>2]|0,c[p+4>>2]|0,c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 45:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((q|0)!=0|(h|0)<0){i=504;break b}q=21440+(p<<3)|0;z=21440+(r<<3)|0;c[z>>2]=dc(c[q>>2]|0,c[q+4>>2]|0,h,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 17:{switch(h&7){case 0:{f=21440+(p<<3)|0;h=c[f>>2]|0;f=c[21440+(q<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647;break}case 1:{f=21440+(p<<3)|0;h=c[f>>2]|0;f=(c[21440+(q<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647)^-2147483648;break}case 2:{f=21440+(p<<3)|0;h=c[f>>2]|0;f=c[21440+(q<<3)+4>>2]&-2147483648^c[f+4>>2];break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=h;c[z+4>>2]=f;a[21703]=3;break}case 21:{switch(h&7){case 0:{h=21440+(p<<3)|0;f=21440+(q<<3)|0;f=ec(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}case 1:{h=21440+(p<<3)|0;f=21440+(q<<3)|0;f=fc(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;break}case 97:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=21440+(p<<3)|0;f=mc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}case 1:{f=21440+(p<<3)|0;f=oc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 81:{switch(h&7){case 0:{z=21440+(p<<3)|0;f=21440+(q<<3)|0;f=hc(c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 1:{z=21440+(p<<3)|0;f=21440+(q<<3)|0;f=ic(c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 2:{z=21440+(p<<3)|0;f=21440+(q<<3)|0;f=gc(c[z>>2]|0,c[z+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}default:{i=504;break b}}if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=((f|0)<0)<<31>>31}break}case 105:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=504;break b}switch(o&31){case 0:{f=pc(c[21168+(p<<3)>>2]|0,h,21696)|0;h=y;break}case 1:{f=qc(c[21168+(p<<3)>>2]|0,h,21696)|0;h=y;break}default:{i=504;break b}}z=21440+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=h;a[21703]=3;break}case 33:{if(!((q|0)==0&((i|0)==7|i>>>0<5))){i=504;break b}z=21440+(r<<3)|0;c[z>>2]=kc(c[21440+(p<<3)>>2]|0,21696)|0;c[z+4>>2]=y;a[21703]=3;break}case 113:{if(!((q|0)==0&(i|0)==1)){i=504;break b}f=21440+(p<<3)|0;f=jc(c[f>>2]|0,c[f+4>>2]|0)|0;if(r|0){z=21168+(r<<3)|0;c[z>>2]=f;c[z+4>>2]=0}break}default:{i=504;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}default:{i=504;break b}}while(0)}switch(i|0){case 21:{g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1;i=40;break}case 35:{i=39;break}case 52:{i=506;break}case 58:{i=506;break}case 65:{i=506;break}case 105:break;case 117:{i=506;break}case 124:{i=506;break}case 131:{i=506;break}case 140:{c[5431]=3;g=3;i=505;break}case 181:{i=506;break}case 187:{i=506;break}case 193:{i=506;break}case 199:{i=506;break}case 205:{i=506;break}case 291:{if(!(f&1048448)){g=(d[21702]|0)+8|0;c[5431]=g;i=505}else i=504;break}case 293:{if(!(f&1048448)){c[5431]=3;g=3;i=505}else i=504;break}case 295:{g=a[21702]|0;if((f&1048448|0)!=0|g<<24>>24==0)i=504;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,8)|0;i=i&1;t=Ai(f|0,h|0,5)|0;u=1<<i^-289;z=21736;c[z>>2]=f&u|((t&1)<<i&-289|32);c[z+4>>2]=h&((u|0)<0)<<31>>31;if((i|0)!=(g&255|0)){g=0;do{z=21888+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=25984+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=30080+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;g=g+1|0}while((g|0)!=256);z=Ai(f|0,h|0,i<<1|32|0)|0;a[21701]=16<<(z&3);a[21702]=i}t=21832;u=c[t+4>>2]|0;z=21160;c[z>>2]=c[t>>2];c[z+4>>2]=u;break a}break}case 301:{g=a[21702]|0;if((f&1048448|0)!=0|(g&255)<3)i=504;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,11)|0;j=i&3;t=Ai(f|0,h|0,7)|0;u=1<<j^-6273;z=21736;c[z>>2]=f&u|((t&1)<<j&-6273|128);c[z+4>>2]=h&((u|0)<0)<<31>>31;if((j|0)!=(g&255|0)){g=0;do{z=21888+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=25984+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;z=30080+(g<<4)|0;c[z>>2]=-1;c[z+4>>2]=-1;g=g+1|0}while((g|0)!=256);switch(i&3){case 1:{g=(Ai(f|0,h|0,34)|0)&3;break}case 0:{g=h&3;break}default:g=d[21704]|0}a[21701]=16<<g;a[21702]=j}t=21760;u=c[t+4>>2]|0;z=21160;c[z>>2]=c[t>>2];c[z+4>>2]=u;break a}break}case 313:{c[5430]=1;u=21432;z=c[u>>2]|0;u=c[u+4>>2]|0;t=pi(c[5356]|0,0,4,0)|0;u=pi(t|0,y|0,z|0,u|0)|0;z=21160;c[z>>2]=u;c[z+4>>2]=y;break a}case 333:{i=506;break}case 343:{i=506;break}case 370:{i=506;break}case 375:{i=506;break}case 500:break;case 501:break;case 502:break;case 503:break}if((i|0)==39)i=506;else if((i|0)==40)break;else if((i|0)==504){c[5431]=2;g=21728;c[g>>2]=f;c[g+4>>2]=0;g=2;i=505}if((i|0)==505){u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;z=21160;c[z>>2]=u;c[z+4>>2]=y}else if((i|0)==506){g=c[5431]|0;u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;z=21160;c[z>>2]=u;c[z+4>>2]=y;if((g|0)<=-1)break}c[5427]=(c[5427]|0)+-1;z=21728;Wf(g,c[z>>2]|0,c[z+4>>2]|0)}while(0);z=c[5427]|0;w=qi(v|0,w|0,z|0,((z|0)<0)<<31>>31|0)|0;z=21712;c[z>>2]=w;c[z+4>>2]=y;l=x;return}function Vf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;z=l;l=l+32|0;t=z+8|0;u=z;v=z+16|0;if(!f){l=z;return}w=21712;w=pi(c[w>>2]|0,c[w+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;x=y;c[5427]=f;h=c[5449]&c[5450];if(h){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f){g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1}else i=12}else i=12;a:do if((i|0)==12){c[5431]=-1;c[5356]=0;c[5357]=0;s=21160;h=c[s+4>>2]|0;f=21432;c[f>>2]=c[s>>2];c[f+4>>2]=h;f=0;h=0;b:while(1){if(f>>>0<(c[5357]|0)>>>0)f=e[f+2>>1]<<16|e[f>>1];else{j=21432;j=pi(c[j>>2]|0,c[j+4>>2]|0,h|0,0)|0;k=y;s=21160;c[s>>2]=j;c[s+4>>2]=k;if((c[5427]|0)<1){i=40;break}h=c[5449]&c[5450];if(h|0){switch(a[21702]|0){case 3:{if((c[5434]&8|0)==0&0==0)f=0;else f=~c[5452];break}case 1:{f=(c[5434]&2|0)==0&0==0?~c[5452]:-1;break}default:f=-1}f=f&h;if(f|0){i=21;break}}f=Ai(j|0,k|0,12)|0;f=f&255;s=30080+(f<<4)|0;if((c[s>>2]|0)==(j&-4096|0)?(c[s+4>>2]|0)==(k|0):0){h=(c[30080+(f<<4)+8>>2]|0)+j|0;i=h;c[v>>2]=i;f=j}else{if(Xf(v,j,k)|0){i=39;break}h=c[v>>2]|0;i=h;f=j}c[5356]=h;s=4094-(f&4095)|0;c[5357]=i+s;r=qi(j|0,k|0,h|0,0)|0;f=21432;c[f>>2]=r;c[f+4>>2]=y;f=e[h>>1]|0;if((s|0)<=0){if((f&3|0)==3){h=pi(j|0,k|0,2,0)|0;i=y;j=Ai(h|0,i|0,12)|0;j=j&255;s=30080+(j<<4)|0;if((c[s>>2]|0)==(h&-4096|0)?(c[s+4>>2]|0)==(i|0):0){h=(c[30080+(j<<4)+8>>2]|0)+h|0;c[t>>2]=h}else{if(Xf(t,h,i)|0){i=35;break}h=c[t>>2]|0}f=e[h>>1]<<16|f}}else f=e[i+2>>1]<<16|f}h=(c[5427]|0)+-1|0;c[5427]=h;k=f>>>7;s=k&31;m=f>>>15&31;o=f>>>20;r=o&31;c:do switch(f&127){case 124:case 120:case 116:case 112:case 108:case 104:case 100:case 96:case 92:case 88:case 84:case 80:case 76:case 72:case 68:case 64:case 60:case 56:case 52:case 48:case 44:case 40:case 36:case 32:case 28:case 24:case 20:case 16:case 12:case 8:case 4:case 0:{h=f>>>2;m=h&7|8;d:do switch(f>>>13&7){case 0:{h=k&48|f>>>1&960|f>>>4&4|h&8;if(!h){i=592;break b}r=21184;s=21168+(m<<3)|0;c[s>>2]=pi(c[r>>2]|0,c[r+4>>2]|0,h|0,0)|0;c[s+4>>2]=y;break}case 1:{if(!(a[21703]|0)){i=592;break b}h=21168+((k&7|8)<<3)|0;f=pi(c[h>>2]|0,c[h+4>>2]|0,k&56|f<<1&192|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;s=21888+(i<<4)|0;if((c[s>>2]|0)==(f&-4089|0)?(c[s+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=52;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}s=21440+(m<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 2:{h=21168+((k&7|8)<<3)|0;f=pi(c[h>>2]|0,c[h+4>>2]|0,k&56|f>>>4&4|f<<1&64|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;s=21888+(i<<4)|0;if((c[s>>2]|0)==(f&-4093|0)?(c[s+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,t,f,h,2)|0){i=58;break b}f=c[t>>2]|0}s=21168+(m<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31;break}case 3:{h=21168+((k&7|8)<<3)|0;f=pi(c[h>>2]|0,c[h+4>>2]|0,k&56|f<<1&192|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;s=21888+(i<<4)|0;if((c[s>>2]|0)==(f&-4089|0)?(c[s+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=64;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}s=21168+(m<<3)|0;c[s>>2]=f;c[s+4>>2]=h;break}case 5:{if(!(a[21703]|0)){i=592;break b}j=21168+((k&7|8)<<3)|0;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f<<1&192|0,0)|0;k=y;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break d;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break d}}case 6:{i=21168+((k&7|8)<<3)|0;i=pi(c[i>>2]|0,c[i+4>>2]|0,k&56|f>>>4&4|f<<1&64|0,0)|0;j=y;f=c[21168+(m<<3)>>2]|0;h=(Ai(i|0,j|0,12)|0)&255;s=25984+(h<<4)|0;if(!((c[s>>2]|0)==(i&-4093|0)?(c[s+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break d;else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break d}}case 7:{j=21168+((k&7|8)<<3)|0;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f<<1&192|0,0)|0;k=y;h=21168+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break d;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break d}}default:{i=592;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 125:case 121:case 117:case 113:case 109:case 105:case 101:case 97:case 93:case 89:case 85:case 81:case 77:case 73:case 69:case 65:case 61:case 57:case 53:case 49:case 45:case 41:case 37:case 33:case 29:case 25:case 21:case 17:case 13:case 9:case 5:case 1:{e:do switch(f>>>13&7){case 0:{if(s|0){r=(k&32|f>>>2&31)<<26>>26;s=21168+(s<<3)|0;q=s;r=pi(c[q>>2]|0,c[q+4>>2]|0,r|0,((r|0)<0)<<31>>31|0)|0;c[s>>2]=r;c[s+4>>2]=y}break}case 1:{if(s|0){s=21168+(s<<3)|0;r=((k&32|f>>>2&31)<<26>>26)+(c[s>>2]|0)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31}break}case 2:{if(s|0){r=(k&32|f>>>2&31)<<26>>26;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31}break}case 3:{switch(k&31){case 0:break e;case 2:break;default:{r=(f<<19&-2147483648|f<<24&2080374784)>>14;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31;break e}}h=f>>>3&512|f>>>2&16|f<<1&64|f<<4&384|f<<3&32;if(!h){i=592;break b}r=h<<22>>22;q=21184;s=21184;c[s>>2]=pi(c[q>>2]|0,c[q+4>>2]|0,r|0,((r|0)<0)<<31>>31|0)|0;c[s+4>>2]=y;break}case 4:{i=f>>>10;j=k&7|8;switch(i&3){case 1:case 0:{k=k&32|f>>>2&31;h=21168+(j<<3)|0;j=h;i=c[j>>2]|0;j=c[j+4>>2]|0;if(!(f&3072)){r=Ai(i|0,j|0,k|0)|0;s=h;c[s>>2]=r;c[s+4>>2]=y;break e}else{r=zi(i|0,j|0,k|0)|0;s=h;c[s>>2]=r;c[s+4>>2]=y;break e}}case 2:{q=(k&32|f>>>2&31)<<26>>26;s=21168+(j<<3)|0;p=s;r=c[p+4>>2]&((q|0)<0)<<31>>31;c[s>>2]=c[p>>2]&q;c[s+4>>2]=r;break e}case 3:{h=f>>>2&7|8;switch((f>>>5&3|i&4)&7){case 0:{s=21168+(j<<3)|0;q=s;r=21168+(h<<3)|0;c[s>>2]=qi(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0;c[s+4>>2]=y;break e}case 1:{s=21168+(j<<3)|0;q=s;p=21168+(h<<3)|0;r=c[p+4>>2]^c[q+4>>2];c[s>>2]=c[p>>2]^c[q>>2];c[s+4>>2]=r;break e}case 2:{s=21168+(j<<3)|0;q=s;p=21168+(h<<3)|0;r=c[p+4>>2]|c[q+4>>2];c[s>>2]=c[p>>2]|c[q>>2];c[s+4>>2]=r;break e}case 3:{s=21168+(j<<3)|0;q=s;p=21168+(h<<3)|0;r=c[p+4>>2]&c[q+4>>2];c[s>>2]=c[p>>2]&c[q>>2];c[s+4>>2]=r;break e}case 4:{s=21168+(j<<3)|0;q=s;r=21168+(h<<3)|0;c[s>>2]=zi(0,qi(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0,32)|0;c[s+4>>2]=y;break e}case 5:{s=21168+(j<<3)|0;r=s;q=21168+(h<<3)|0;c[s>>2]=zi(0,pi(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0,32)|0;c[s+4>>2]=y;break e}default:{i=592;break b}}}default:{i=105;break b}}}case 5:{h=f>>>1;h=(h&2048|k&16|h&768|f<<2&1024|h&64|f<<1&128|f>>>2&14|f<<3&32)<<20>>20;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;s=pi(pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}case 6:{s=21168+((k&7|8)<<3)|0;if((c[s>>2]|0)==0&(c[s+4>>2]|0)==0){h=(f>>>4&256|k&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}break}case 7:{s=21168+((k&7|8)<<3)|0;if(!((c[s>>2]|0)==0&(c[s+4>>2]|0)==0)){h=(f>>>4&256|k&24|f<<1&192|f>>>2&6|f<<3&32)<<23>>23;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}break}default:{i=588;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 126:case 122:case 118:case 114:case 110:case 106:case 102:case 98:case 94:case 90:case 86:case 82:case 78:case 74:case 70:case 66:case 62:case 58:case 54:case 50:case 46:case 42:case 38:case 34:case 30:case 26:case 22:case 18:case 14:case 10:case 6:case 2:{h=f>>>2;m=h&31;f:do switch(f>>>13&7){case 0:{f=21168+(s<<3)|0;if(s|0){r=f;r=Bi(c[r>>2]|0,c[r+4>>2]|0,k&32|m|0)|0;s=f;c[s>>2]=r;c[s+4>>2]=y}break}case 1:{if(!(a[21703]|0)){i=592;break b}i=21184;f=pi(c[i>>2]|0,c[i+4>>2]|0,k&32|h&24|f<<4&448|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4089|0)?(c[r+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=116;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 2:{i=21184;f=pi(c[i>>2]|0,c[i+4>>2]|0,k&32|h&28|f<<4&192|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4093|0)?(c[r+4>>2]|0)==(h|0):0)f=c[(c[21888+(i<<4)+8>>2]|0)+f>>2]|0;else{if(Yf(21152,t,f,h,2)|0){i=123;break b}f=c[t>>2]|0}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}break}case 3:{i=21184;f=pi(c[i>>2]|0,c[i+4>>2]|0,k&32|h&24|f<<4&448|0,0)|0;h=y;i=(Ai(f|0,h|0,12)|0)&255;r=21888+(i<<4)|0;if((c[r>>2]|0)==(f&-4089|0)?(c[r+4>>2]|0)==(h|0):0){h=(c[21888+(i<<4)+8>>2]|0)+f|0;f=c[h>>2]|0;h=c[h+4>>2]|0}else{if(Yf(21152,t,f,h,3)|0){i=130;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 4:{h=(m|0)==0;i=(s|0)==0;if(!(f&4096))if(h){if(i){i=592;break b}s=21168+(s<<3)|0;f=c[s+4>>2]|0;s=c[s>>2]&-2;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}else{if(i)break f;q=21168+(m<<3)|0;r=c[q+4>>2]|0;s=21168+(s<<3)|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;break f}else if(h){if(i){i=139;break b}r=21432;f=c[r>>2]|0;r=c[r+4>>2]|0;h=pi(c[5356]|0,0,2,0)|0;r=pi(h|0,y|0,f|0,r|0)|0;s=21168+(s<<3)|0;f=c[s+4>>2]|0;s=c[s>>2]&-2;h=21160;c[h>>2]=s;c[h+4>>2]=f;h=21176;c[h>>2]=r;c[h+4>>2]=y;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}else{f=21168+(s<<3)|0;if(i)break f;r=f;s=21168+(m<<3)|0;r=pi(c[s>>2]|0,c[s+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0)|0;s=f;c[s>>2]=r;c[s+4>>2]=y;break f}}case 5:{if(!(a[21703]|0)){i=592;break b}j=21184;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f>>>1&448|0,0)|0;k=y;h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break f;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break f}}case 6:{i=21184;i=pi(c[i>>2]|0,c[i+4>>2]|0,k&60|f>>>1&192|0,0)|0;j=y;f=c[21168+(m<<3)>>2]|0;h=(Ai(i|0,j|0,12)|0)&255;s=25984+(h<<4)|0;if(!((c[s>>2]|0)==(i&-4093|0)?(c[s+4>>2]|0)==(j|0):0))if(!(Zf(21152,i,j,f,0,2)|0))break f;else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+i>>2]=f;break f}}case 7:{j=21184;j=pi(c[j>>2]|0,c[j+4>>2]|0,k&56|f>>>1&448|0,0)|0;k=y;h=21168+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break f;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break f}}default:{i=589;break b}}while(0);f=(c[5356]|0)+2|0;c[5356]=f;h=f;break}case 55:{if(s|0){r=f&-4096;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=((r|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 23:{if(s|0){r=21432;q=c[r>>2]|0;r=c[r+4>>2]|0;p=f&-4096;p=pi(c[5356]|0,0,p|0,((p|0)<0)<<31>>31|0)|0;r=pi(p|0,y|0,q|0,r|0)|0;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=y}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 111:{f=(o&2046|f&1044480|f>>>11&1048576|f>>>9&2048)<<11>>11;if(s|0){r=21432;q=c[r>>2]|0;r=c[r+4>>2]|0;p=pi(c[5356]|0,0,4,0)|0;r=pi(p|0,y|0,q|0,r|0)|0;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=y}s=21432;h=c[s>>2]|0;s=c[s+4>>2]|0;s=pi(pi(c[5356]|0,0,f|0,((f|0)<0)<<31>>31|0)|0,y|0,h|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break}case 103:{h=f>>20;i=c[5356]|0;k=21432;j=c[k>>2]|0;k=c[k+4>>2]|0;f=21168+(m<<3)|0;h=pi(c[f>>2]|0,c[f+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;f=y;h=h&-2;r=21160;c[r>>2]=h;c[r+4>>2]=f;if(s|0){r=pi(i|0,0,4,0)|0;r=pi(r|0,y|0,j|0,k|0)|0;s=21168+(s<<3)|0;c[s>>2]=r;c[s+4>>2]=y}c[5356]=0;c[5357]=0;s=21432;c[s>>2]=h;c[s+4>>2]=f;h=0;f=0;break}case 99:{switch(f>>>13&3){case 0:{s=21168+(m<<3)|0;h=21168+(r<<3)|0;h=(c[s>>2]|0)==(c[h>>2]|0)?(c[s+4>>2]|0)==(c[h+4>>2]|0):0;break}case 2:{s=21168+(m<<3)|0;q=c[s+4>>2]|0;h=21168+(r<<3)|0;r=c[h+4>>2]|0;h=(q|0)<(r|0)|((q|0)==(r|0)?(c[s>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}case 3:{s=21168+(m<<3)|0;q=c[s+4>>2]|0;h=21168+(r<<3)|0;r=c[h+4>>2]|0;h=q>>>0<r>>>0|((q|0)==(r|0)?(c[s>>2]|0)>>>0<(c[h>>2]|0)>>>0:0);break}default:{i=592;break b}}if((f&4096|0)!=0^h){h=(f>>>19&4096|o&2016|k&30|f<<4&2048)<<19>>19;s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,h|0,((h|0)<0)<<31>>31|0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}else{f=(c[5356]|0)+4|0;c[5356]=f;h=f;break c}}case 3:{h=f>>20;i=21168+(m<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;g:do switch(f>>>12&7){case 0:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4096|0)?(c[r+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,t,h,i,0)|0){i=179;break b}f=c[t>>2]&255}h=f<<24>>24;f=h;h=((h|0)<0)<<31>>31;break}case 1:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4095|0)?(c[r+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,t,h,i,1)|0){i=185;break b}f=c[t>>2]&65535}h=f<<16>>16;f=h;h=((h|0)<0)<<31>>31;break}case 2:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4093|0)?(c[r+4>>2]|0)==(i|0):0)h=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,t,h,i,2)|0){i=191;break b}h=c[t>>2]|0}f=h;h=((h|0)<0)<<31>>31;break}case 4:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4096|0)?(c[r+4>>2]|0)==(i|0):0)f=a[(c[21888+(f<<4)+8>>2]|0)+h>>0]|0;else{if(Yf(21152,t,h,i,0)|0){i=197;break b}f=c[t>>2]&255}f=f&255;h=0;break}case 5:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4095|0)?(c[r+4>>2]|0)==(i|0):0)f=b[(c[21888+(f<<4)+8>>2]|0)+h>>1]|0;else{if(Yf(21152,t,h,i,1)|0){i=203;break b}f=c[t>>2]&65535}f=f&65535;h=0;break}case 3:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4089|0)?(c[r+4>>2]|0)==(i|0):0){h=(c[21888+(f<<4)+8>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break g}if(Yf(21152,t,h,i,3)|0){i=208;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0;break}case 6:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4093|0)?(c[r+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,t,h,i,2)|0){i=214;break b}f=c[t>>2]|0}h=0;break}default:{i=592;break b}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 35:{j=(s|o&4064)<<20>>20;k=21168+(m<<3)|0;j=pi(c[k>>2]|0,c[k+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;k=y;h=21168+(r<<3)|0;i=c[h>>2]|0;h=c[h+4>>2]|0;h:do switch(f>>>12&7){case 0:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4096|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i&255,0,0)|0))break h;else{i=594;break b}else{a[(c[25984+(f<<4)+8>>2]|0)+j>>0]=i;break h}}case 1:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4095|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i&65535,0,1)|0))break h;else{i=594;break b}else{b[(c[25984+(f<<4)+8>>2]|0)+j>>1]=i;break h}}case 2:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4093|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i,0,2)|0))break h;else{i=594;break b}else{c[(c[25984+(f<<4)+8>>2]|0)+j>>2]=i;break h}}case 3:{f=(Ai(j|0,k|0,12)|0)&255;s=25984+(f<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,i,h,3)|0))break h;else{i=594;break b}else{s=(c[25984+(f<<4)+8>>2]|0)+j|0;c[s>>2]=i;c[s+4>>2]=h;break h}}default:{i=592;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 19:{k=f>>20;i:do switch(f>>>12&7){case 0:{h=21168+(m<<3)|0;h=pi(c[h>>2]|0,c[h+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;f=y;break}case 1:{if(k>>>0>63){i=592;break b}h=21168+(m<<3)|0;h=Bi(c[h>>2]|0,c[h+4>>2]|0,k&63|0)|0;f=y;break}case 2:{h=21168+(m<<3)|0;r=c[h+4>>2]|0;f=((k|0)<0)<<31>>31;h=((r|0)<(f|0)|((r|0)==(f|0)?(c[h>>2]|0)>>>0<k>>>0:0))&1;f=0;break}case 3:{h=21168+(m<<3)|0;r=c[h+4>>2]|0;f=((k|0)<0)<<31>>31;h=(r>>>0<f>>>0|((r|0)==(f|0)?(c[h>>2]|0)>>>0<k>>>0:0))&1;f=0;break}case 4:{f=21168+(m<<3)|0;h=c[f>>2]^k;f=c[f+4>>2]^((k|0)<0)<<31>>31;break}case 5:{if(k&-1088|0){i=592;break b}j=21168+(m<<3)|0;i=c[j>>2]|0;j=c[j+4>>2]|0;h=k&63;if(!(f&1073741824)){h=Ai(i|0,j|0,h|0)|0;f=y;break i}else{h=zi(i|0,j|0,h|0)|0;f=y;break i}}case 6:{f=21168+(m<<3)|0;h=c[f>>2]|k;f=c[f+4>>2]|((k|0)<0)<<31>>31;break}default:{f=21168+(m<<3)|0;h=c[f>>2]&k;f=c[f+4>>2]&((k|0)<0)<<31>>31}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 27:{i=f>>20;h=21168+(m<<3)|0;j=c[h>>2]|0;j:do switch(f>>>12&7){case 0:{f=i+j|0;break}case 1:{if(i>>>0>31){i=592;break b}f=Bi(j|0,c[h+4>>2]|0,i&31|0)|0;break}case 5:{if(i&-1056|0){i=592;break b}h=i&31;if(!(f&1073741824)){f=j>>>h;break j}else{f=j>>h;break j}}default:{i=592;break b}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 51:{k=21168+(m<<3)|0;h=c[k>>2]|0;k=c[k+4>>2]|0;j=21168+(r<<3)|0;i=c[j>>2]|0;j=c[j+4>>2]|0;r=u;c[r>>2]=i;c[r+4>>2]=j;k:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{h=vi(i|0,j|0,h|0,k|0)|0;f=y;break k}case 1:{vi(i|0,0,h|0,0)|0;m=y;n=vi(j|0,0,h|0,0)|0;r=y;p=vi(i|0,0,k|0,0)|0;o=y;f=vi(j|0,0,k|0,0)|0;q=y;pi(pi(m|0,0,n|0,0)|0,y|0,p|0,0)|0;p=y;p=pi(pi(pi(o|0,0,r|0,0)|0,y|0,f|0,0)|0,y|0,p|0,0)|0;pi(0,y&7|0,f|0,q|0)|0;q=y;f=(k|0)<0;r=(j|0)<0;h=qi(p|0,q|0,pi((r?i:0)|0,(r?j:0)|0,(f?h:0)|0,(f?k:0)|0)|0,y|0)|0;f=y;break k}case 2:{vi(i|0,0,h|0,0)|0;m=y;n=vi(j|0,0,h|0,0)|0;p=y;r=vi(i|0,0,k|0,0)|0;o=y;q=vi(j|0,0,k|0,0)|0;f=y;pi(pi(m|0,0,n|0,0)|0,y|0,r|0,0)|0;r=y;r=pi(pi(pi(o|0,0,p|0,0)|0,y|0,q|0,0)|0,y|0,r|0,0)|0;pi(0,y&7|0,q|0,f|0)|0;f=(k|0)<0;h=qi(r|0,y|0,(f?h:0)|0,(f?k:0)|0)|0;f=y;break k}case 3:{vi(i|0,0,h|0,0)|0;n=y;o=vi(j|0,0,h|0,0)|0;q=y;h=vi(i|0,0,k|0,0)|0;p=y;r=vi(j|0,0,k|0,0)|0;f=y;pi(pi(n|0,0,o|0,0)|0,y|0,h|0,0)|0;h=y;h=pi(pi(pi(p|0,0,q|0,0)|0,y|0,r|0,0)|0,y|0,h|0,0)|0;pi(0,y&7|0,r|0,f|0)|0;f=y;break k}case 4:{if((i|0)==0&(j|0)==0){h=-1;f=-1;break k}if((h|0)==0&(k|0)==-2147483648&((i|0)==-1&(j|0)==-1)){h=0;f=-2147483648;break k}h=ti(h|0,k|0,i|0,j|0)|0;f=y;break k}case 5:{if((i|0)==0&(j|0)==0){h=-1;f=-1;break k}h=xi(h|0,k|0,i|0,j|0)|0;f=y;break k}case 6:{if((i|0)==0&(j|0)==0){f=k;break k}if((h|0)==0&(k|0)==-2147483648&((i|0)==-1&(j|0)==-1)){h=0;f=0;break k}h=wi(h|0,k|0,i|0,j|0)|0;f=y;break k}case 7:{if((i|0)==0&(j|0)==0){f=k;break k}h=yi(h|0,k|0,i|0,j|0)|0;f=y;break k}default:{i=590;break b}}else{if(f&-1107296256|0){i=592;break b}do switch((f>>>12&7|f>>>27&8)&15){case 0:{h=pi(i|0,j|0,h|0,k|0)|0;f=y;break k}case 8:{h=qi(h|0,k|0,i|0,j|0)|0;f=y;break k}case 1:{h=Bi(h|0,k|0,i&63|0)|0;f=y;break k}case 2:{h=((k|0)<(j|0)|(k|0)==(j|0)&h>>>0<i>>>0)&1;f=0;break k}case 3:{h=(k>>>0<j>>>0|(k|0)==(j|0)&h>>>0<i>>>0)&1;f=0;break k}case 4:{h=i^h;f=j^k;break k}case 5:{h=Ai(h|0,k|0,i&63|0)|0;f=y;break k}case 13:{h=zi(h|0,k|0,i&63|0)|0;f=y;break k}case 6:{h=i|h;f=j|k;break k}case 7:{h=i&h;f=j&k;break k}default:{i=592;break b}}while(0)}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 59:{k=21168+(m<<3)|0;j=c[k>>2]|0;k=c[k+4>>2]|0;i=21168+(r<<3)|0;h=c[i>>2]|0;i=c[i+4>>2]|0;r=u;c[r>>2]=h;c[r+4>>2]=i;l:do if((f&-33554432|0)==33554432)switch(f>>>12&7){case 0:{f=N(h,j)|0;break l}case 4:{if(!h){f=-1;break l}if((j|0)==-2147483648&(h|0)==-1){f=-2147483648;break l}f=(j|0)/(h|0)|0;break l}case 5:{if(!h){f=-1;break l}f=(j>>>0)/(h>>>0)|0;break l}case 6:{if(!h){f=j;break l}if((j|0)==-2147483648&(h|0)==-1){f=0;break l}f=(j|0)%(h|0)|0;break l}case 7:{if(!h){f=j;break l}f=(j>>>0)%(h>>>0)|0;break l}default:{i=592;break b}}else{if(f&-1107296256|0){i=592;break b}switch((f>>>12&7|f>>>27&8)&15){case 0:{f=pi(h|0,i|0,j|0,k|0)|0;break l}case 8:{f=qi(j|0,k|0,h|0,i|0)|0;break l}case 1:{f=j<<(h&31);break l}case 5:{f=j>>>(h&31);break l}case 13:{f=j>>(h&31);break l}default:{i=592;break b}}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 115:{if(!(f&16384)){k=21168+(m<<3)|0;j=c[k>>2]|0;k=c[k+4>>2]|0}else{j=m;k=0}i=f&12288;m:do switch(f>>>12&3){case 1:{r=21712;c[r>>2]=qi(w|0,x|0,h|0,((h|0)<0)<<31>>31|0)|0;c[r+4>>2]=y;if(_f(u,o,1)|0){i=592;break b}i=$f(o,j,k)|0;if((i|0)<0){i=592;break b}if(s|0){q=u;r=c[q+4>>2]|0;s=21168+(s<<3)|0;c[s>>2]=c[q>>2];c[s+4>>2]=r}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;s=pi(c[5356]|0,0,4,0)|0;f=pi(s|0,y|0,h|0,f|0)|0;h=y;s=21160;c[s>>2]=f;c[s+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;s=21432;c[s>>2]=f;c[s+4>>2]=h;h=0;f=0;break c}break}case 3:case 2:{r=21712;c[r>>2]=qi(w|0,x|0,h|0,((h|0)<0)<<31>>31|0)|0;c[r+4>>2]=y;h=(m|0)!=0;if(_f(u,o,h&1)|0){i=592;break b}n=u;m=c[n>>2]|0;n=c[n+4>>2]|0;if(h){h=(i|0)==8192;h=$f(o,h?m|j:m&~j,h?n|k:n&~k)|0;if((h|0)<0){i=592;break b}else i=h}else i=0;if(s|0){s=21168+(s<<3)|0;c[s>>2]=m;c[s+4>>2]=n}if((i|0)>0){f=21432;h=c[f>>2]|0;f=c[f+4>>2]|0;s=pi(c[5356]|0,0,4,0)|0;f=pi(s|0,y|0,h|0,f|0)|0;h=y;s=21160;c[s>>2]=f;c[s+4>>2]=h;if((i|0)!=2)break a;c[5356]=0;c[5357]=0;s=21432;c[s>>2]=f;c[s+4>>2]=h;h=0;f=0;break c}break}case 0:{switch(o&4095){case 0:{i=333;break b}case 1:{i=335;break b}case 258:{i=337;break b}case 770:{i=343;break b}case 261:{if((f&32640|0)!=0|(a[21702]|0)==0){i=592;break b}if(!(c[5449]&c[5450])){i=355;break b}else break m}default:{}}if((f&-33521792|0)!=301989888|(a[21702]|0)==0){i=592;break b}if(!m){f=0;do{s=21888+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=25984+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=30080+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;f=f+1|0}while((f|0)!=256)}else{f=0;do{s=21888+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=25984+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;s=30080+(f<<4)|0;c[s>>2]=-1;c[s+4>>2]=-1;f=f+1|0}while((f|0)!=256)}s=21432;f=c[s>>2]|0;s=c[s+4>>2]|0;h=pi(c[5356]|0,0,4,0)|0;s=pi(h|0,y|0,f|0,s|0)|0;f=y;h=21160;c[h>>2]=s;c[h+4>>2]=f;c[5356]=0;c[5357]=0;h=21432;c[h>>2]=s;c[h+4>>2]=f;h=0;f=0;break c}default:{i=591;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 15:{switch(f>>>12&7){case 0:{if(f&-267387008|0){i=592;break b}break}case 1:{if((f|0)!=4111){i=592;break b}break}default:{i=592;break b}}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 47:{n:do switch(f>>>12&7){case 2:{p=21168+(m<<3)|0;o=c[p>>2]|0;p=c[p+4>>2]|0;j=f>>>27&255;switch(j&31){case 2:{if(r|0){i=592;break b}f=(Ai(o|0,p|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(o&-4093|0)?(c[r+4>>2]|0)==(p|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,t,o,p,2)|0){i=375;break b}f=c[t>>2]|0}h=21872;c[h>>2]=o;c[h+4>>2]=p;h=f;f=((f|0)<0)<<31>>31;break n}case 3:{q=21872;if(!((c[q>>2]|0)==(o|0)?(c[q+4>>2]|0)==(p|0):0)){h=1;f=0;break n}f=c[21168+(r<<3)>>2]|0;h=(Ai(o|0,p|0,12)|0)&255;r=25984+(h<<4)|0;if(!((c[r>>2]|0)==(o&-4093|0)?(c[r+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){h=0;f=0;break n}else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+o>>2]=f;h=0;f=0;break n}}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{k=(Ai(o|0,p|0,12)|0)&255;q=21888+(k<<4)|0;m=o&-4093;if((c[q>>2]|0)==(m|0)?(c[q+4>>2]|0)==(p|0):0)h=c[(c[21888+(k<<4)+8>>2]|0)+o>>2]|0;else{if(Yf(21152,t,o,p,2)|0){i=385;break b}h=c[t>>2]|0}n=((h|0)<0)<<31>>31;q=21168+(r<<3)|0;i=c[q>>2]|0;q=c[q+4>>2]|0;r=u;c[r>>2]=i;c[r+4>>2]=q;switch(j&31){case 1:{f=i;break}case 0:{f=h+i|0;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 4:{f=h^i;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 12:{f=h&i;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 8:{f=h|i;q=((f|0)<0)<<31>>31;r=u;c[r>>2]=f;c[r+4>>2]=q;break}case 16:{if((h|0)<(i|0)){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 20:{if((h|0)>(i|0)){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 24:{if(h>>>0<i>>>0){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}case 28:{if(h>>>0>i>>>0){f=u;c[f>>2]=h;c[f+4>>2]=n;f=h}else f=i;break}default:{i=592;break b}}r=25984+(k<<4)|0;if(!((c[r>>2]|0)==(m|0)?(c[r+4>>2]|0)==(p|0):0))if(!(Zf(21152,o,p,f,0,2)|0)){f=n;break n}else{i=594;break b}else{c[(c[25984+(k<<4)+8>>2]|0)+o>>2]=f;f=n;break n}}default:{i=592;break b}}}case 3:{q=21168+(m<<3)|0;p=c[q>>2]|0;q=c[q+4>>2]|0;k=f>>>27&255;switch(k&31){case 2:{if(r|0){i=592;break b}f=(Ai(p|0,q|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(p&-4089|0)?(c[r+4>>2]|0)==(q|0):0){f=(c[21888+(f<<4)+8>>2]|0)+p|0;h=c[f>>2]|0;f=c[f+4>>2]|0}else{if(Yf(21152,t,p,q,3)|0){i=408;break b}f=t;h=c[f>>2]|0;f=c[f+4>>2]|0}r=21872;c[r>>2]=p;c[r+4>>2]=q;break n}case 3:{o=21872;if(!((c[o>>2]|0)==(p|0)?(c[o+4>>2]|0)==(q|0):0)){h=1;f=0;break n}h=21168+(r<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(p|0,q|0,12)|0)&255;r=25984+(i<<4)|0;if(!((c[r>>2]|0)==(p&-4089|0)?(c[r+4>>2]|0)==(q|0):0))if(!(Zf(21152,p,q,f,h,3)|0)){h=0;f=0;break n}else{i=594;break b}else{r=(c[25984+(i<<4)+8>>2]|0)+p|0;c[r>>2]=f;c[r+4>>2]=h;h=0;f=0;break n}}case 28:case 24:case 20:case 16:case 8:case 12:case 4:case 0:case 1:{m=(Ai(p|0,q|0,12)|0)&255;o=21888+(m<<4)|0;n=p&-4089;if((c[o>>2]|0)==(n|0)?(c[o+4>>2]|0)==(q|0):0){o=(c[21888+(m<<4)+8>>2]|0)+p|0;h=c[o>>2]|0;o=c[o+4>>2]|0}else{if(Yf(21152,t,p,q,3)|0){i=418;break b}o=t;h=c[o>>2]|0;o=c[o+4>>2]|0}j=21168+(r<<3)|0;i=c[j>>2]|0;j=c[j+4>>2]|0;r=u;c[r>>2]=i;c[r+4>>2]=j;switch(k&31){case 1:{f=j;break}case 0:{i=pi(i|0,j|0,h|0,o|0)|0;f=y;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 4:{i=i^h;f=j^o;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 12:{i=i&h;f=j&o;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 8:{i=i|h;f=j|o;r=u;c[r>>2]=i;c[r+4>>2]=f;break}case 16:{if((o|0)<(j|0)|(o|0)==(j|0)&h>>>0<i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}case 20:{if((o|0)>(j|0)|(o|0)==(j|0)&h>>>0>i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}case 24:{if(o>>>0<j>>>0|(o|0)==(j|0)&h>>>0<i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}case 28:{if(o>>>0>j>>>0|(o|0)==(j|0)&h>>>0>i>>>0){i=u;c[i>>2]=h;c[i+4>>2]=o;i=h;f=o}else f=j;break}default:{i=592;break b}}r=25984+(m<<4)|0;if(!((c[r>>2]|0)==(n|0)?(c[r+4>>2]|0)==(q|0):0))if(!(Zf(21152,p,q,i,f,3)|0)){f=o;break n}else{i=594;break b}else{r=(c[25984+(m<<4)+8>>2]|0)+p|0;c[r>>2]=i;c[r+4>>2]=f;f=o;break n}}default:{i=592;break b}}}default:{i=592;break b}}while(0);if(s|0){s=21168+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f}f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 7:{if(!(a[21703]|0)){i=592;break b}h=f>>20;i=21168+(m<<3)|0;h=pi(c[i>>2]|0,c[i+4>>2]|0,h|0,((h|0)<0)<<31>>31|0)|0;i=y;o:do switch(f>>>12&7){case 2:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4093|0)?(c[r+4>>2]|0)==(i|0):0)f=c[(c[21888+(f<<4)+8>>2]|0)+h>>2]|0;else{if(Yf(21152,t,h,i,2)|0){i=445;break b}f=c[t>>2]|0}h=-1;break}case 3:{f=(Ai(h|0,i|0,12)|0)&255;r=21888+(f<<4)|0;if((c[r>>2]|0)==(h&-4089|0)?(c[r+4>>2]|0)==(i|0):0){h=(c[21888+(f<<4)+8>>2]|0)+h|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break o}if(Yf(21152,t,h,i,3)|0){i=450;break b}h=t;f=c[h>>2]|0;h=c[h+4>>2]|0;break}default:{i=592;break b}}while(0);s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 39:{if(!(a[21703]|0)){i=592;break b}j=(s|o&4064)<<20>>20;k=21168+(m<<3)|0;j=pi(c[k>>2]|0,c[k+4>>2]|0,j|0,((j|0)<0)<<31>>31|0)|0;k=y;p:do switch(f>>>12&7){case 2:{f=c[21440+(r<<3)>>2]|0;h=(Ai(j|0,k|0,12)|0)&255;s=25984+(h<<4)|0;if(!((c[s>>2]|0)==(j&-4093|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,0,2)|0))break p;else{i=594;break b}else{c[(c[25984+(h<<4)+8>>2]|0)+j>>2]=f;break p}}case 3:{h=21440+(r<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;i=(Ai(j|0,k|0,12)|0)&255;s=25984+(i<<4)|0;if(!((c[s>>2]|0)==(j&-4089|0)?(c[s+4>>2]|0)==(k|0):0))if(!(Zf(21152,j,k,f,h,3)|0))break p;else{i=594;break b}else{s=(c[25984+(i<<4)+8>>2]|0)+j|0;c[s>>2]=f;c[s+4>>2]=h;break p}}default:{i=592;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 67:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 71:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 75:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]^-2147483648,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]|0,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]^-2147483648,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 79:{if(!(a[21703]|0)){i=592;break b}i=f>>>27;h=f>>>12&7;h=(h|0)==7?d[21700]|0:h>>>0>4?-1:h;if((h|0)<0){i=592;break b}switch(f>>>25&3){case 0:{f=Gb(c[21440+(m<<3)>>2]^-2147483648,c[21440+(r<<3)>>2]|0,c[21440+(i<<3)>>2]^-2147483648,h,21696)|0;h=-1;break}case 1:{q=21440+(m<<3)|0;r=21440+(r<<3)|0;f=21440+(i<<3)|0;f=bc(c[q>>2]|0,c[q+4>>2]^-2147483648,c[r>>2]|0,c[r+4>>2]|0,c[f>>2]|0,c[f+4>>2]^-2147483648,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}case 83:{if(!(a[21703]|0)){i=592;break b}h=f>>>12;i=h&7;do switch(f>>>25&127){case 0:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Cb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 4:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Eb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 8:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Fb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 12:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Hb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 44:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((r|0)!=0|(h|0)<0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=Ib(c[21440+(m<<3)>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 16:{switch(h&7){case 0:{h=21440+(r<<3)|0;f=c[h>>2]&-2147483648|c[21440+(m<<3)>>2]&2147483647;h=c[h+4>>2]|0;break}case 1:{h=21440+(r<<3)|0;f=(c[h>>2]&-2147483648|c[21440+(m<<3)>>2]&2147483647)^-2147483648;h=~c[h+4>>2];break}case 2:{h=21440+(m<<3)|0;r=21440+(r<<3)|0;f=c[r>>2]&-2147483648^c[h>>2];h=c[r+4>>2]^c[h+4>>2];break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 20:{switch(h&7){case 0:{f=Jb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696,2)|0;break}case 1:{f=Kb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696,2)|0;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=-1;a[21703]=3;break}case 96:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{h=Pb(c[21440+(m<<3)>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 1:{h=Rb(c[21440+(m<<3)>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 2:{f=Ub(c[21440+(m<<3)>>2]|0,h,21696)|0;h=y;break}case 3:{f=Wb(c[21440+(m<<3)>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 80:{switch(h&7){case 0:{f=Mb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696)|0;break}case 1:{f=Nb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696)|0;break}case 2:{f=Lb(c[21440+(m<<3)>>2]|0,c[21440+(r<<3)>>2]|0,21696)|0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}break}case 104:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{f=Sb(c[21168+(m<<3)>>2]|0,h,21696)|0;break}case 1:{f=Tb(c[21168+(m<<3)>>2]|0,h,21696)|0;break}case 2:{f=21168+(m<<3)|0;f=Xb(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}case 3:{f=21168+(m<<3)|0;f=Yb(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=-1;a[21703]=3;break}case 32:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if(!((r|0)==1&(h|0)>-1)){i=592;break b}r=21440+(m<<3)|0;s=21440+(s<<3)|0;c[s>>2]=lc(c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=-1;a[21703]=3;break}case 112:{if(r|0){i=592;break b}switch(h&7){case 0:{f=zi(0,c[21440+(m<<3)>>2]|0,32)|0;h=y;break}case 1:{f=Ob(c[21440+(m<<3)>>2]|0)|0;h=0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 120:{if(r|i|0){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=zi(0,c[21168+(m<<3)>>2]|0,32)|0;c[s+4>>2]=y;a[21703]=3;break}case 1:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=Zb(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 5:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=$b(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 9:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=ac(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 13:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}q=21440+(m<<3)|0;r=21440+(r<<3)|0;s=21440+(s<<3)|0;c[s>>2]=cc(c[q>>2]|0,c[q+4>>2]|0,c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 45:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((r|0)!=0|(h|0)<0){i=592;break b}r=21440+(m<<3)|0;s=21440+(s<<3)|0;c[s>>2]=dc(c[r>>2]|0,c[r+4>>2]|0,h,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 17:{switch(h&7){case 0:{f=21440+(m<<3)|0;h=c[f>>2]|0;f=c[21440+(r<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647;break}case 1:{f=21440+(m<<3)|0;h=c[f>>2]|0;f=(c[21440+(r<<3)+4>>2]&-2147483648|c[f+4>>2]&2147483647)^-2147483648;break}case 2:{f=21440+(m<<3)|0;h=c[f>>2]|0;f=c[21440+(r<<3)+4>>2]&-2147483648^c[f+4>>2];break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=h;c[s+4>>2]=f;a[21703]=3;break}case 21:{switch(h&7){case 0:{h=21440+(m<<3)|0;f=21440+(r<<3)|0;f=ec(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}case 1:{h=21440+(m<<3)|0;f=21440+(r<<3)|0;f=fc(c[h>>2]|0,c[h+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696,2)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 97:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{f=21440+(m<<3)|0;h=mc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 1:{f=21440+(m<<3)|0;h=oc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;f=h;h=((h|0)<0)<<31>>31;break}case 2:{f=21440+(m<<3)|0;f=rc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}case 3:{f=21440+(m<<3)|0;f=tc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 81:{switch(h&7){case 0:{q=21440+(m<<3)|0;f=21440+(r<<3)|0;f=hc(c[q>>2]|0,c[q+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 1:{q=21440+(m<<3)|0;f=21440+(r<<3)|0;f=ic(c[q>>2]|0,c[q+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}case 2:{q=21440+(m<<3)|0;f=21440+(r<<3)|0;f=gc(c[q>>2]|0,c[q+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,21696)|0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=((f|0)<0)<<31>>31}break}case 105:{h=(i|0)==7?d[21700]|0:i>>>0>4?-1:i;if((h|0)<0){i=592;break b}switch(o&31){case 0:{f=pc(c[21168+(m<<3)>>2]|0,h,21696)|0;h=y;break}case 1:{f=qc(c[21168+(m<<3)>>2]|0,h,21696)|0;h=y;break}case 2:{f=21168+(m<<3)|0;f=uc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}case 3:{f=21168+(m<<3)|0;f=vc(c[f>>2]|0,c[f+4>>2]|0,h,21696)|0;h=y;break}default:{i=592;break b}}s=21440+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h;a[21703]=3;break}case 33:{if(!((r|0)==0&((i|0)==7|i>>>0<5))){i=592;break b}s=21440+(s<<3)|0;c[s>>2]=kc(c[21440+(m<<3)>>2]|0,21696)|0;c[s+4>>2]=y;a[21703]=3;break}case 113:{if(r|0){i=592;break b}switch(h&7){case 0:{h=21440+(m<<3)|0;f=c[h>>2]|0;h=c[h+4>>2]|0;break}case 1:{f=21440+(m<<3)|0;f=jc(c[f>>2]|0,c[f+4>>2]|0)|0;h=0;break}default:{i=592;break b}}if(s|0){s=21168+(s<<3)|0;c[s>>2]=f;c[s+4>>2]=h}break}case 121:{if(r|i|0){i=592;break b}q=21168+(m<<3)|0;r=c[q+4>>2]|0;s=21440+(s<<3)|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;a[21703]=3;break}default:{i=592;break b}}while(0);f=(c[5356]|0)+4|0;c[5356]=f;h=f;break}default:{i=592;break b}}while(0)}switch(i|0){case 21:{g=0;while(1){if(1<<g&f|0)break;g=g+1|0;if(g>>>0>=32){g=32;break}}Wf(g|-2147483648,0,0);c[5427]=(c[5427]|0)+-1;i=40;break}case 35:{i=39;break}case 52:{i=594;break}case 58:{i=594;break}case 64:{i=594;break}case 105:break;case 116:{i=594;break}case 123:{i=594;break}case 130:{i=594;break}case 139:{c[5431]=3;g=3;i=593;break}case 179:{i=594;break}case 185:{i=594;break}case 191:{i=594;break}case 197:{i=594;break}case 203:{i=594;break}case 208:{i=594;break}case 214:{i=594;break}case 333:{if(!(f&1048448)){g=(d[21702]|0)+8|0;c[5431]=g;i=593}else i=592;break}case 335:{if(!(f&1048448)){c[5431]=3;g=3;i=593}else i=592;break}case 337:{g=a[21702]|0;if((f&1048448|0)!=0|g<<24>>24==0)i=592;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,8)|0;i=i&1;t=Ai(f|0,h|0,5)|0;u=1<<i^-289;v=21736;c[v>>2]=f&u|((t&1)<<i&-289|32);c[v+4>>2]=h&((u|0)<0)<<31>>31;if((i|0)!=(g&255|0)){g=0;do{v=21888+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=25984+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=30080+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;g=g+1|0}while((g|0)!=256);v=Ai(f|0,h|0,i<<1|32|0)|0;a[21701]=16<<(v&3);a[21702]=i}t=21832;u=c[t+4>>2]|0;v=21160;c[v>>2]=c[t>>2];c[v+4>>2]=u;break a}break}case 343:{g=a[21702]|0;if((f&1048448|0)!=0|(g&255)<3)i=592;else{f=21432;f=pi(c[f>>2]|0,c[f+4>>2]|0,c[5356]|0,0)|0;h=21160;c[h>>2]=f;c[h+4>>2]=y;h=21736;f=c[h>>2]|0;h=c[h+4>>2]|0;i=Ai(f|0,h|0,11)|0;j=i&3;t=Ai(f|0,h|0,7)|0;u=1<<j^-6273;v=21736;c[v>>2]=f&u|((t&1)<<j&-6273|128);c[v+4>>2]=h&((u|0)<0)<<31>>31;if((j|0)!=(g&255|0)){g=0;do{v=21888+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=25984+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;v=30080+(g<<4)|0;c[v>>2]=-1;c[v+4>>2]=-1;g=g+1|0}while((g|0)!=256);switch(i&3){case 1:{g=(Ai(f|0,h|0,34)|0)&3;break}case 0:{g=h&3;break}default:g=d[21704]|0}a[21701]=16<<g;a[21702]=j}t=21760;u=c[t+4>>2]|0;v=21160;c[v>>2]=c[t>>2];c[v+4>>2]=u;break a}break}case 355:{c[5430]=1;u=21432;v=c[u>>2]|0;u=c[u+4>>2]|0;t=pi(c[5356]|0,0,4,0)|0;u=pi(t|0,y|0,v|0,u|0)|0;v=21160;c[v>>2]=u;c[v+4>>2]=y;break a}case 375:{i=594;break}case 385:{i=594;break}case 408:{i=594;break}case 418:{i=594;break}case 445:{i=594;break}case 450:{i=594;break}case 588:break;case 589:break;case 590:break;case 591:break}if((i|0)==39)i=594;else if((i|0)==40)break;else if((i|0)==592){c[5431]=2;g=21728;c[g>>2]=f;c[g+4>>2]=0;g=2;i=593}if((i|0)==593){u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;v=21160;c[v>>2]=u;c[v+4>>2]=y}else if((i|0)==594){g=c[5431]|0;u=21432;u=pi(c[u>>2]|0,c[u+4>>2]|0,c[5356]|0,0)|0;v=21160;c[v>>2]=u;c[v+4>>2]=y;if((g|0)<=-1)break}c[5427]=(c[5427]|0)+-1;v=21728;Wf(g,c[v>>2]|0,c[v+4>>2]|0)}while(0);v=c[5427]|0;w=qi(w|0,x|0,v|0,((v|0)<0)<<31>>31|0)|0;x=21712;c[x>>2]=w;c[x+4>>2]=y;l=z;return}function Wf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;k=a[21702]|0;do if((k&255)<2)if((b|0)<0){h=(c[5452]|0)>>>(b&63)&1;g=b&2147483647;i=0;j=6;break}else{h=(c[5451]|0)>>>b&1;b=b&2147483647;g=0;j=7;break}else{g=b&2147483647;if((b|0)<0){h=0;i=0;j=6}else{b=g;g=0}}while(0);if((j|0)==6){b=Bi(1,0,(d[21701]|0)+-1|0)|0;b=b|g;g=y|i;j=7}if((j|0)==7)if(h){j=21840;c[j>>2]=b;c[j+4>>2]=g;j=21160;b=c[j+4>>2]|0;h=21832;c[h>>2]=c[j>>2];c[h+4>>2]=b;h=21848;c[h>>2]=e;c[h+4>>2]=f;h=21736;b=c[h>>2]|0;h=c[h+4>>2]|0;f=Ai(b|0,h|0,k&255|0)|0;f=Bi(f|0,y|0,5)|0;j=21736;c[j>>2]=b&-291|(k&255)<<8|f&32;c[j+4>>2]=h;if(k<<24>>24==1){j=21816;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}g=0;do{k=21888+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;g=g+1|0}while((g|0)!=256);j=Ai(b|0,h|0,34)|0;a[21701]=16<<(j&3);a[21702]=1;j=21816;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}h=21768;c[h>>2]=b;c[h+4>>2]=g;h=21160;j=c[h+4>>2]|0;i=21760;c[i>>2]=c[h>>2];c[i+4>>2]=j;i=21776;c[i>>2]=e;c[i+4>>2]=f;f=21736;i=c[f>>2]|0;f=c[f+4>>2]|0;e=Ai(i|0,f|0,k&255|0)|0;e=Bi(e|0,y|0,7)|0;j=21736;c[j>>2]=i&-6281|(k&255)<<11|e&128;c[j+4>>2]=f;if(k<<24>>24==3){j=21744;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}g=0;do{k=21888+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(g<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;g=g+1|0}while((g|0)!=256);a[21701]=16<<(d[21704]|0);a[21702]=3;j=21744;e=j;e=c[e>>2]|0;j=j+4|0;j=c[j>>2]|0;k=21160;f=k;c[f>>2]=e;k=k+4|0;c[k>>2]=j;return}function Xf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=l;l=l+16|0;e=h;if(ag(21152,e,b,d,2)|0){a=21728;c[a>>2]=b;c[a+4>>2]=d;c[5431]=12;d=-1;l=h;return d|0}f=e;e=c[f>>2]|0;f=c[f+4>>2]|0;g=qf(c[5470]|0,e,f)|0;if(g|0?c[g+32>>2]|0:0){i=Ai(b|0,d|0,12)|0;i=i&255;j=c[g+40>>2]|0;g=g+8|0;g=qi(e|0,f|0,c[g>>2]|0,c[g+4>>2]|0)|0;g=j+g|0;f=30080+(i<<4)|0;c[f>>2]=b&-4096;c[f+4>>2]=d;c[30080+(i<<4)+8>>2]=g-b;c[a>>2]=g;d=0;l=h;return d|0}j=21728;c[j>>2]=b;c[j+4>>2]=d;c[5431]=1;j=-1;l=h;return j|0}function Yf(b,f,g,h,i){b=b|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+16|0;r=s+8|0;j=s;o=1<<i;q=o+-1&g;a:do if(!q){if(ag(b,j,g,h,0)|0){f=b+576|0;c[f>>2]=g;c[f+4>>2]=h;c[b+572>>2]=13;f=-1;l=s;return f|0}k=j;j=c[k>>2]|0;k=c[k+4>>2]|0;m=qf(c[b+728>>2]|0,j,k)|0;if(!m){f=0;l=s;return f|0}if(!(c[m+32>>2]|0)){b=m+8|0;k=qi(j|0,k|0,c[b>>2]|0,c[b+4>>2]|0)|0;j=c[m+76>>2]|0;if(j&o|0){p=Xa[c[m+68>>2]&31](c[m+64>>2]|0,k,i)|0;n=0;break}if(!((i|0)==3&(j&4|0)!=0)){p=0;n=0;break}b=m+68|0;n=m+64|0;p=Xa[c[b>>2]&31](c[n>>2]|0,k,2)|0;n=Xa[c[b>>2]&31](c[n>>2]|0,k+4|0,2)|0;break}r=Ai(g|0,h|0,12)|0;r=r&255;q=c[m+40>>2]|0;o=m+8|0;j=qi(j|0,k|0,c[o>>2]|0,c[o+4>>2]|0)|0;j=q+j|0;q=b+736+(r<<4)|0;c[q>>2]=g&-4096;c[q+4>>2]=h;c[b+736+(r<<4)+8>>2]=j-g;switch(i|0){case 0:{p=d[j>>0]|0;n=0;break a}case 1:{p=e[j>>1]|0;n=0;break a}case 2:{p=c[j>>2]|0;n=0;break a}case 3:{n=j;p=c[n>>2]|0;n=c[n+4>>2]|0;break a}default:ra()}}else switch(i|0){case 1:{j=(Ai(g|0,h|0,12)|0)&255;q=b+736+(j<<4)|0;do if((c[q>>2]|0)==(g&-4096|0)?(c[q+4>>2]|0)==(h|0):0)n=a[(c[b+736+(j<<4)+8>>2]|0)+g>>0]|0;else{j=Yf(b,r,g,h,0)|0;if(!j){n=c[r>>2]&255;break}f=j;l=s;return f|0}while(0);j=pi(g|0,h|0,1,0)|0;k=y;m=(Ai(j|0,k|0,12)|0)&255;q=b+736+(m<<4)|0;do if((c[q>>2]|0)==(j&-4096|0)?(c[q+4>>2]|0)==(k|0):0)j=a[(c[b+736+(m<<4)+8>>2]|0)+j>>0]|0;else{j=Yf(b,r,j,k,0)|0;if(!j){j=c[r>>2]&255;break}f=j;l=s;return f|0}while(0);p=(j&255)<<8|n&255;n=0;break a}case 2:{k=qi(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;m=y;j=(Ai(k|0,m|0,12)|0)&255;h=b+736+(j<<4)|0;do if((c[h>>2]|0)==(k&-4093|0)?(c[h+4>>2]|0)==(m|0):0)n=c[(c[b+736+(j<<4)+8>>2]|0)+k>>2]|0;else{j=Yf(b,r,k,m,2)|0;if(!j){n=c[r>>2]|0;break}f=j;l=s;return f|0}while(0);j=pi(k|0,m|0,4,0)|0;k=y;m=(Ai(j|0,k|0,12)|0)&255;h=b+736+(m<<4)|0;do if(!((c[h>>2]|0)==(j&-4093|0)?(c[h+4>>2]|0)==(k|0):0)){j=Yf(b,r,j,k,2)|0;if(!j){m=c[r>>2]|0;j=0;break}else{m=0;break}}else{m=c[(c[b+736+(m<<4)+8>>2]|0)+j>>2]|0;j=0}while(0);k=q<<3;if(!j){p=m<<32-k|n>>>k;n=0;break a}l=s;return j|0}case 3:{k=qi(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;m=y;j=(Ai(k|0,m|0,12)|0)&255;h=b+736+(j<<4)|0;do if((c[h>>2]|0)==(k&-4089|0)?(c[h+4>>2]|0)==(m|0):0){p=(c[b+736+(j<<4)+8>>2]|0)+k|0;n=c[p>>2]|0;p=c[p+4>>2]|0}else{j=Yf(b,r,k,m,3)|0;if(!j){p=r;n=c[p>>2]|0;p=c[p+4>>2]|0;break}f=j;l=s;return f|0}while(0);j=pi(k|0,m|0,8,0)|0;k=y;m=(Ai(j|0,k|0,12)|0)&255;h=b+736+(m<<4)|0;do if(!((c[h>>2]|0)==(j&-4089|0)?(c[h+4>>2]|0)==(k|0):0)){j=Yf(b,r,j,k,3)|0;if(!j){o=r;j=0;k=c[o>>2]|0;o=c[o+4>>2]|0;break}else{k=0;o=0;break}}else{o=(c[b+736+(m<<4)+8>>2]|0)+j|0;j=0;k=c[o>>2]|0;o=c[o+4>>2]|0}while(0);b=q<<3;m=Ai(n|0,p|0,b|0)|0;n=y;k=Bi(k|0,o|0,64-b|0)|0;if(!j){p=k|m;n=y|n;break a}l=s;return j|0}default:ra()}while(0);c[f>>2]=p;c[f+4>>2]=n;f=0;l=s;return f|0}function Zf(d,e,f,g,h,i){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;j=r;q=1<<i;p=q+-1|0;if(!((p&e|0)==0&(((p|0)<0)<<31>>31&f|0)==0)){if((i|0)==31){h=0;l=r;return h|0}o=0;while(1){j=pi(o|0,0,e|0,f|0)|0;k=y;m=Ai(g|0,h|0,o<<3|0)|0;n=Ai(j|0,k|0,12)|0;n=n&255;i=d+4832+(n<<4)|0;if(!((c[i>>2]|0)==(j&-4096|0)?(c[i+4>>2]|0)==(k|0):0)){j=Zf(d,j,k,m&255,0,0)|0;if(j|0){k=24;break}}else a[(c[d+4832+(n<<4)+8>>2]|0)+j>>0]=m;o=o+1|0;if((o|0)>=(q|0)){j=0;k=24;break}}if((k|0)==24){l=r;return j|0}}if(ag(d,j,e,f,1)|0){h=d+576|0;c[h>>2]=e;c[h+4>>2]=f;c[d+572>>2]=15;h=-1;l=r;return h|0}m=j;k=c[m>>2]|0;m=c[m+4>>2]|0;p=qf(c[d+728>>2]|0,k,m)|0;if(!p){h=0;l=r;return h|0}j=(c[p+32>>2]|0)==0;n=p+8|0;o=n;o=qi(k|0,m|0,c[o>>2]|0,c[o+4>>2]|0)|0;if(j){j=c[p+76>>2]|0;if(j&q|0){fb[c[p+72>>2]&31](c[p+64>>2]|0,o,g,i);h=0;l=r;return h|0}if(!((i|0)==3&(j&4|0)!=0)){h=0;l=r;return h|0}e=p+72|0;f=p+64|0;fb[c[e>>2]&31](c[f>>2]|0,o,g,2);fb[c[e>>2]&31](c[f>>2]|0,o+4|0,h,2);h=0;l=r;return h|0}q=c[p+48>>2]|0;j=q+(o>>>17<<2)|0;if(!q)j=o;else{c[j>>2]=c[j>>2]|1<<(o>>>12&31);j=n;j=qi(k|0,m|0,c[j>>2]|0,c[j+4>>2]|0)|0}q=Ai(e|0,f|0,12)|0;q=q&255;j=(c[p+40>>2]|0)+j|0;p=d+4832+(q<<4)|0;c[p>>2]=e&-4096;c[p+4>>2]=f;c[d+4832+(q<<4)+8>>2]=j-e;switch(i|0){case 0:{a[j>>0]=g;h=0;l=r;return h|0}case 1:{b[j>>1]=g;h=0;l=r;return h|0}case 2:{c[j>>2]=g;h=0;l=r;return h|0}case 3:{f=j;c[f>>2]=g;c[f+4>>2]=h;h=0;l=r;return h|0}default:ra()}return 0}function _f(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;if((e&3072|0)==3072&(f|0)!=0){b=-1;return b|0}f=a[21702]|0;if((e>>>8&3)>>>0>(f&255)>>>0){b=-1;return b|0}a:do switch(e|0){case 1:if(!(a[21703]|0)){b=-1;return b|0}else{f=c[5424]|0;e=0;g=46;break a}case 2:if(!(a[21703]|0)){b=-1;return b|0}else{f=d[21700]|0;e=0;g=46;break a}case 3:if(!(a[21703]|0)){b=-1;return b|0}else{f=d[21700]<<5|c[5424];e=0;g=46;break a}case 3074:case 3072:{if((f&255)<3?((f<<24>>24==0?c[5466]|0:c[5453]|0)&1<<(e&31)|0)==0:0){g=45;break a}e=21712;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 3202:case 3200:{if((a[21701]|0)==32){if((f&255)<3?((f<<24>>24==0?c[5466]|0:c[5453]|0)&1<<(e&31)|0)==0:0){g=45;break a}f=c[5429]|0;e=0;g=46}else g=45;break}case 256:{e=21736;g=c[e>>2]|d[21703]<<13;f=g&909619;e=c[e+4>>2]&3;if((g&24576|0)==24576&0==0|(g&98304|0)==98304&0==0){g=Bi(1,0,(d[21701]|0)+-1|0)|0;f=g|f;e=y|e;g=46}else g=46;break}case 260:{f=c[5452]&c[5449];e=0;g=46;break}case 261:{e=21816;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 262:{f=c[5466]|0;e=0;g=46;break}case 320:{e=21824;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 321:{e=21832;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 322:{e=21840;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 323:{e=21848;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 324:{f=c[5452]&c[5450];e=0;g=46;break}case 384:{e=21856;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 768:{f=21736;e=c[f+4>>2]|0;f=c[f>>2]|d[21703]<<13;if((f&24576|0)==24576&0==0|(f&98304|0)==98304&0==0){g=Bi(1,0,(d[21701]|0)+-1|0)|0;f=g|f;e=y|e;g=46}else g=46;break}case 769:{f=c[5448]|(Bi(d[21704]|0,0,(d[21701]|0)+-2|0)|0);e=y;g=46;break}case 770:{f=c[5451]|0;e=0;g=46;break}case 771:{f=c[5452]|0;e=0;g=46;break}case 772:{f=c[5449]|0;e=0;g=46;break}case 773:{e=21744;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 774:{f=c[5453]|0;e=0;g=46;break}case 832:{e=21752;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 833:{e=21760;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 834:{e=21768;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 835:{e=21776;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 836:{f=c[5450]|0;e=0;g=46;break}case 2818:case 2816:{e=21712;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}case 2946:case 2944:{if((a[21701]|0)==32){f=c[5429]|0;e=0;g=46}else g=45;break}case 3860:{e=21784;f=c[e>>2]|0;e=c[e+4>>2]|0;g=46;break}default:g=45}while(0);if((g|0)==45){c[b>>2]=0;c[b+4>>2]=0;b=-1;return b|0}else if((g|0)==46){c[b>>2]=f;c[b+4>>2]=e;b=0;return b|0}return 0}function $f(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0;do switch(b|0){case 1:{c[5424]=e&31;a[21703]=3;f=0;return f|0}case 2:{f=e&7;a[21700]=f>>>0>4?0:f&255;a[21703]=3;f=0;return f|0}case 3:{f=(Ai(e|0,f|0,5)|0)&7;a[21700]=f>>>0>4?0:f&255;c[5424]=e&31;a[21703]=3;f=0;return f|0}case 256:{h=21736;g=c[h>>2]|0;h=c[h+4>>2]|0;i=g&-909620|e&909619;j=h&-4|f&3;b=i^g;if(!((b&917504|0)==0&0==0?(g&131072|0)==0&0==0|(b&6144|0)==0&0==0:0)){b=0;do{k=21888+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;b=b+1|0}while((b|0)!=256)}e=Ai(e|0,f|0,13)|0;a[21703]=e&3;f=f&3;f=(f|0)==0|(f|0)==3;e=f?924091:924091;f=f?0:15;k=21736;c[k>>2]=i&e|g&~e;c[k+4>>2]=j&f|h&~f;k=0;return k|0}case 260:{k=c[5452]|0;c[5449]=~k&c[5449]|k&e;k=0;return k|0}case 261:{k=21816;c[k>>2]=e&-4;c[k+4>>2]=f;k=0;return k|0}case 262:{c[5466]=e&5;k=0;return k|0}case 320:{k=21824;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 321:{k=21832;c[k>>2]=e&-2;c[k+4>>2]=f;k=0;return k|0}case 322:{k=21840;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 323:{k=21848;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 324:{k=c[5452]|0;c[5450]=~k&c[5450]|k&e;k=0;return k|0}case 384:{b=Ai(e|0,f|0,60)|0;if((b|0)!=0?(g=21856,g=Ai(c[g>>2]|0,c[g+4>>2]|0,60)|0,(b&14|0)!=8):0)b=g;k=Bi(b|0,0,60)|0;b=21856;c[b>>2]=k|e;c[b+4>>2]=y|f&4095;b=0;do{k=21888+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;b=b+1|0}while((b|0)!=256);b=2;return b|0}case 768:{h=21736;g=c[h>>2]|0;h=c[h+4>>2]|0;k=g^e;if(!((k&917504|0)==0&0==0?(g&131072|0)==0&0==0|(k&6144|0)==0&0==0:0)){b=0;do{k=21888+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=25984+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;k=30080+(b<<4)|0;c[k>>2]=-1;c[k+4>>2]=-1;b=b+1|0}while((b|0)!=256)}j=Ai(e|0,f|0,13)|0;a[21703]=j&3;j=f&3;j=(j|0)==0|(j|0)==3;i=j?924091:924091;j=j?0:15;k=21736;c[k>>2]=g&~i|i&e;c[k+4>>2]=h&~j|j&f;k=0;return k|0}case 769:{k=Ai(e|0,f|0,(d[21701]|0)+-2|0)|0;b=k&3;switch(k&3){case 3:case 0:{k=0;return k|0}default:{}}if((b|0)==(d[21704]|0|0)){k=0;return k|0}a[21704]=b;a[21701]=1<<(b|4);k=1;return k|0}case 770:{c[5451]=c[5451]&-65536|e&65535;k=0;return k|0}case 771:{c[5452]=c[5452]&-547|e&546;k=0;return k|0}case 772:{c[5449]=c[5449]&-683|e&682;k=0;return k|0}case 773:{k=21744;c[k>>2]=e&-4;c[k+4>>2]=f;k=0;return k|0}case 774:{c[5453]=e&5;k=0;return k|0}case 832:{k=21752;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 833:{k=21760;c[k>>2]=e&-2;c[k+4>>2]=f;k=0;return k|0}case 834:{k=21768;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 835:{k=21776;c[k>>2]=e;c[k+4>>2]=f;k=0;return k|0}case 836:{c[5450]=c[5450]&-35|e&34;k=0;return k|0}default:{k=-1;return k|0}}while(0);return 0} +function Yd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;h=k;i=k+12|0;if((f|0)<0){c[h>>2]=0-e;Xd(15755,h)}f=Lg(e+1|0)|0;_a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;db[c[b+4>>2]&15](b,d);Xa[c[b+76>>2]&31](b,c[g+16>>2]|0,15637)|0;if((Ee(f)|0)==1?(e=Ae(f)|0,c[i>>2]=e,e|0):0)if(!(Zd(b,i,c[b+144>>2]|0,34812)|0)){c[g+24>>2]=0;_d(b,0,0,g);l=k;return}else Xd(15796,j);Xd(15796,j)}function Zd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;K=l;l=l+2080|0;D=K+2056|0;E=K+1024|0;F=K;J=K+2076|0;G=K+2072|0;H=K+2068|0;o=K+2064|0;p=K+2048|0;c[J>>2]=c[d>>2];q=b+128|0;r=b+88|0;s=b+92|0;t=b+96|0;u=D+4|0;v=b+140|0;w=b+136|0;x=b+112|0;z=e+16|0;A=e+24|0;B=e+56|0;C=e+64|0;a:while(1){g=c[J>>2]|0;b:do switch(a[g>>0]|0){case 0:{h=44;break a}case 46:{h=5;break a}case 35:{re(J);break}default:{if((te(G,J,8)|0)<0){h=7;break a}m=c[G>>2]|0;n=m>>>12;c[G>>2]=m&4095;if((ve(H,J)|0)<0){h=9;break a}if((ve(o,J)|0)<0){h=11;break a}h=c[G>>2]|0;k=c[H>>2]|0;m=c[o>>2]|0;i=vf(104)|0;g=i+16|0;c[g>>2]=1;c[i+20>>2]=0;M=q;j=c[M+4>>2]|0;L=i+8|0;c[L>>2]=c[M>>2];c[L+4>>2]=j;L=q;j=q;c[j>>2]=pi(c[L>>2]|0,c[L+4>>2]|0,1,0)|0;c[j+4>>2]=y;j=i+24|0;c[j>>2]=n;c[i+28>>2]=h&4095;c[i+32>>2]=k;c[i+36>>2]=m;switch(n&1048575|0){case 8:{Ga(i+64|0);break}case 4:{M=i+56|0;c[M>>2]=M;c[i+60>>2]=M;break}default:{}}k=c[s>>2]|0;c[s>>2]=i;c[i>>2]=r;c[i+4>>2]=k;c[k>>2]=i;k=t;L=t;c[L>>2]=pi(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[L+4>>2]=y;Oa(D|0,0)|0;L=c[D>>2]|0;k=i+40|0;c[k>>2]=L;M=(c[u>>2]|0)*1e3|0;m=i+48|0;c[m>>2]=M;c[i+44>>2]=L;c[i+52>>2]=M;M=p;c[M>>2]=0;c[M+4>>2]=0;switch(n&1048575|0){case 6:case 2:{if((ve(i+56|0,J)|0)<0){h=17;break a}if((ve(i+60|0,J)|0)<0){h=19;break a}break}case 8:{if((ue(p,J)|0)<0){h=21;break a}break}case 4:{c[g>>2]=(c[g>>2]|0)+1;if((c[j>>2]|0)!=4){h=23;break a}M=vf(18)|0;c[M+8>>2]=i;g=M+13|0;a[g>>0]=46;a[g+1>>0]=0;g=i+56|0;h=i+64|0;R=c[h>>2]|0;L=R+18|0;S=pi(c[v>>2]|0,0,-1,-1)|0;N=y;P=pi(S|0,N|0,L|0,((L|0)<0)<<31>>31|0)|0;Q=c[w>>2]|0;P=Ai(P|0,y|0,Q|0)|0;O=y;Q=Ai(pi(S|0,N|0,R|0,((R|0)<0)<<31>>31|0)|0,y|0,Q|0)|0;R=x;N=x;c[N>>2]=pi(qi(c[R>>2]|0,c[R+4>>2]|0,Q|0,y|0)|0,y|0,P|0,O|0)|0;c[N+4>>2]=y;c[h>>2]=L;L=c[g>>2]|0;c[L+4>>2]=M;c[M>>2]=L;c[M+4>>2]=g;c[g>>2]=M;c[z>>2]=(c[z>>2]|0)+1;if((c[j>>2]|0)!=4){h=25;break a}S=vf(19)|0;c[S+8>>2]=e;M=S+13|0;a[M>>0]=a[14342]|0;a[M+1>>0]=a[14343]|0;a[M+2>>0]=a[14344]|0;M=c[h>>2]|0;R=M+19|0;L=pi(c[v>>2]|0,0,-1,-1)|0;Q=y;O=pi(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Ai(O|0,y|0,N|0)|0;P=y;N=Ai(pi(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=pi(qi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[h>>2]=R;R=c[g>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=g;c[g>>2]=S;break}default:{}}if((we(k,m,J)|0)<0){h=28;break a}if((se(E,1024,J)|0)<0){h=30;break a}if((c[A>>2]|0)!=4){h=32;break a}M=_g(E)|0;R=M+17|0;S=vf(R)|0;c[S+8>>2]=i;Ei(S+13|0,E|0,M+1|0)|0;M=c[C>>2]|0;R=M+R|0;L=pi(c[v>>2]|0,0,-1,-1)|0;Q=y;O=pi(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Ai(O|0,y|0,N|0)|0;P=y;N=Ai(pi(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=pi(qi(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[C>>2]=R;R=c[B>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=B;c[B>>2]=S;do if((n|0)!=10){S=p;if(!((n|0)==8&((c[S>>2]|0)!=0|(c[S+4>>2]|0)!=0))){re(J);if((n|0)!=4)break b;S=pe(f,E)|0;g=Zd(b,J,i,S)|0;Mg(S);if(!g)break b;else{h=46;break a}}else{if((xe(D,J)|0)<0){h=40;break a}R=D;S=p;Pd(b,i,15635,c[R>>2]|0,c[R+4>>2]|0,c[S>>2]|0,c[S+4>>2]|0)|0;break}}else{if((se(F,1024,J)|0)<0){h=35;break a}c[i+56>>2]=Lh(F)|0}while(0);re(J)}}while(0)}switch(h|0){case 5:{c[J>>2]=g+1;re(J);I=c[J>>2]|0;break}case 7:{di(15963,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 9:{di(15977,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 11:{di(15990,12,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 17:{di(16003,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 19:{di(16018,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 21:{di(15932,13,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 23:{ja(14301,14319,456,14328);break}case 25:{ja(14301,14319,456,14328);break}case 28:{di(16033,14,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 30:{di(15857,17,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 32:{ja(14301,14319,456,14328);break}case 35:{di(16048,21,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 40:{di(15946,16,1,c[3261]|0)|0;S=-1;l=K;return S|0}case 44:{I=g;break}case 46:{l=K;return g|0}}c[d>>2]=I;S=0;l=K;return S|0}function _d(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;f=h;g=e+20|0;b=c[g>>2]|0;if(b|0){db[c[a+4>>2]&15](a,b);c[g>>2]=0}b=e+24|0;d=c[b>>2]|0;if((d|0)<=1){i=c[e+16>>2]|0;c[b>>2]=d+1;b=ld(a,i,c[12960+(d<<2)>>2]|0)|0;c[g>>2]=b;if(b|0?(_a[c[a+24>>2]&15](a,f,b,0,6,e)|0)>=1:0){l=h;return}_d(a,0,0,e);l=h;return}if(($d(a,15826,1)|0)<0)$d(a,15848,0)|0;db[c[a+4>>2]&15](a,c[e+16>>2]|0);b=c[e+8>>2]|0;if(b|0)cb[b&15](c[e+12>>2]|0);Mg(e);l=h;return}function $d(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=l;l=l+1072|0;h=t+1056|0;o=t+1048|0;n=t+1040|0;q=t+1060|0;r=t;k=t+1032|0;m=t+1024|0;d=Od(b,d)|0;if(!d){s=-1;l=t;return s|0}if((c[d+24>>2]|0)!=8){s=-1;l=t;return s|0}if((c[d+56>>2]|0)!=3){s=-1;l=t;return s|0}j=c[d+60>>2]|0;p=Lg(j+1|0)|0;Ha(d+64|0,0,p|0,j|0);a[p+j>>0]=0;if(!e){c[q>>2]=p;f=c[3261]|0;g=b+176|0;d=p;a:while(1)b:do switch(a[d>>0]|0){case 0:break a;case 9:case 32:{d=d+1|0;c[q>>2]=d;break}case 10:{d=d+1|0;c[q>>2]=d;break}default:{if((se(r,1024,q)|0)<0){s=49;break a}d=Od(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0){o=vf(24)|0;m=d+80|0;n=c[m+4>>2]|0;e=o+8|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;e=o+16|0;c[e>>2]=e;c[o+20>>2]=e;n=c[g>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=g;c[g>>2]=o;while(1){d=c[q>>2]|0;c:while(1){switch(a[d>>0]|0){case 10:case 0:break b;case 9:case 32:break;default:break c}o=d+1|0;c[q>>2]=o;d=o}if((se(r,1024,q)|0)<0){s=61;break a}o=vf(16)|0;c[o+12>>2]=Lh(r)|0;n=c[e>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=e;c[e>>2]=o}}c[h>>2]=r;fi(f,15875,h)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:break b;default:{}}o=d+1|0;c[q>>2]=o;d=o}}}while(0);if((s|0)==49)di(15857,17,1,f)|0;else if((s|0)==61)di(15857,17,1,f)|0}else{c[q>>2]=p;h=c[3261]|0;i=b+176|0;j=b+184|0;e=0;g=0;d=p;d:while(1){f=e;e:while(1){f:while(1){e=a[d>>0]|0;g:while(1)switch(e<<24>>24){case 0:break d;case 64:{s=12;break e}case 10:break f;case 35:break;case 9:case 32:break g;default:{e=0;break e}}e=d+1|0;c[q>>2]=e;d=e}d=d+1|0;c[q>>2]=d;f=0}if((s|0)==12){c[q>>2]=d+1;e=1}if((se(r,1024,q)|0)<0){s=14;break}d=c[q>>2]|0;h:while(1){switch(a[d>>0]|0){case 58:{s=18;break h}case 9:case 32:break;default:{s=27;break h}}s=d+1|0;c[q>>2]=s;d=s}i:do if((s|0)==18){s=0;c[q>>2]=d+1;d=Od(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0)if(!e){f=vf(24)|0;d=d+80|0;e=c[d+4>>2]|0;g=f+8|0;c[g>>2]=c[d>>2];c[g+4>>2]=e;g=f+16|0;c[g>>2]=g;c[f+20>>2]=g;g=c[i>>2]|0;c[g+4>>2]=f;c[f>>2]=g;c[f+4>>2]=i;c[i>>2]=f;g=0;break}else{g=vf(20)|0;c[g+8>>2]=Lh(r)|0;f=g+12|0;c[f>>2]=f;c[g+16>>2]=f;f=c[j>>2]|0;c[f+4>>2]=g;c[g>>2]=f;c[g+4>>2]=j;c[j>>2]=g;f=0;break}c[n>>2]=r;fi(h,15875,n)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:{f=0;g=0;break i}default:{}}g=d+1|0;c[q>>2]=g;d=g}}else if((s|0)==27){s=0;d=(g|0)!=0;if(!(d|(f|0)!=0)){s=28;break d}if(!d){d=vf(16)|0;c[d+12>>2]=Lh(r)|0;c[d+8>>2]=e;g=f+16|0;e=c[g>>2]|0;c[e+4>>2]=d;c[d>>2]=e;c[d+4>>2]=g;c[g>>2]=d;g=0;break}if((ue(m,q)|0)<0){s=31;break d}if((xe(k,q)|0)<0){s=33;break d}d=vf(32)|0;c[d+24>>2]=Lh(r)|0;e=k;u=c[e+4>>2]|0;v=d+8|0;c[v>>2]=c[e>>2];c[v+4>>2]=u;v=m;u=c[v+4>>2]|0;e=d+16|0;c[e>>2]=c[v>>2];c[e+4>>2]=u;e=g+12|0;u=c[e>>2]|0;c[u+4>>2]=d;c[d>>2]=u;c[d+4>>2]=e;c[e>>2]=d}while(0);d=c[q>>2]|0;v=a[d>>0]|0;e=v<<24>>24==10;if(e^v<<24>>24!=0)do{d=d+1|0;c[q>>2]=d;v=a[d>>0]|0;e=v<<24>>24==10}while(e^v<<24>>24!=0);if(e){d=d+1|0;c[q>>2]=d}e=f}if((s|0)==14)di(15857,17,1,h)|0;else if((s|0)==28){c[o>>2]=r;fi(h,15903,o)|0}else if((s|0)==31)di(15932,13,1,h)|0;else if((s|0)==33)di(15946,16,1,h)|0}Mg(p);v=0;l=t;return v|0}function ae(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=l;l=l+32|0;d=f+16|0;e=f;if((c[a>>2]|0)!=9)ja(16078,14319,2865,16092);if(_a[c[a+12>>2]&15](a,d,e,0,34812,34812)|0)ja(15194,14319,2867,16092);if(!($a[c[a+28>>2]&3](a,e,c[d>>2]|0,16107,514,384,0)|0)){h=c[a+52>>2]|0;g=c[d>>2]|0;e=_g(b)|0;_a[h&15](a,g,0,0,b,e)|0;db[c[a+4>>2]&15](a,c[d>>2]|0);l=f;return}else ja(16118,14319,2869,16092)}function be(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;f=i+16|0;g=i;h=c[8555]|0;if(!h){Mg(b);l=i;return}if(_a[c[h+12>>2]&15](h,f,g,1e3,34812,34812)|0)ja(16199,14319,2892,16248);e=ld(h,c[f>>2]|0,c[h+200>>2]|0)|0;if(e|0){Gd(h,c[f>>2]|0,a)|0;if(($a[c[h+28>>2]&3](h,g,e,a,514,384,0)|0)>=0)_a[c[h+52>>2]&15](h,e,0,0,b,d)|0;db[c[h+4>>2]&15](h,e)}a=c[f>>2]|0;if(a|0)db[c[h+4>>2]&15](h,a);Mg(b);l=i;return}function ce(){return}function de(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[8556]|0;c[8556]=f+-1;a=(f|0)>1;if((f|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,0,d,e);return}function ee(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[8556]|0;c[8556]=e+-1;a=(e|0)>1;if((e|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;fb[a&31](c[b>>2]|0,(d|0)<1?-404:0-d|0,0,0);return}function fe(a){a=a|0;c[a+4>>2]=0;c[a>>2]=0;return}function ge(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=vf(8)|0;c[g>>2]=e;c[g+4>>2]=f;f=c[8556]|0;c[8556]=f+1;if(!f)Na(1);wa(a|0,16268,b|0,d|0,0,0,g|0,1,7,8,0)|0;return g|0}function he(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=vf(4132)|0;c[e>>2]=b;c[e+4>>2]=d;c[e+16>>2]=a;return e|0}function ie(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!e){q=0;return q|0}l=b+8|0;m=b+12|0;n=b+36|0;o=b+16|0;p=b+20|0;q=b+4|0;k=b+40|0;j=d;a:while(1){switch(c[l>>2]|0){case 0:{i=c[m>>2]|0;d=20-i|0;d=(e|0)<(d|0)?e:d;Ei(b+36+i|0,j|0,d|0)|0;i=d+(c[m>>2]|0)|0;c[m>>2]=i;if((i|0)>19){if(Rh(n,16326,4)|0){d=-1;e=12;break a}f=p;g=k;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[l>>2]=1;c[m>>2]=0}break}case 1:{d=c[m>>2]|0;i=4096-d|0;i=(e|0)<(i|0)?e:i;Ei(b+36+d|0,j|0,i|0)|0;d=i+(c[m>>2]|0)|0;c[m>>2]=d;if((d|0)>4095){d=d+-16|0;Ef(n,n,d,c[o>>2]|0,p,0);d=Xa[c[b>>2]&31](c[q>>2]|0,n,d)|0;if((d|0)<0){e=12;break a}f=n;g=(c[m>>2]|0)+(b+36)+-16|0;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[m>>2]=16;d=i}else d=i;break}default:{e=10;break a}}e=e-d|0;if(!e){d=0;e=12;break}else j=j+d|0}if((e|0)==10)ra();else if((e|0)==12)return d|0;return 0}function je(b){b=b|0;var d=0,e=0,f=0,g=0;if((c[b+8>>2]|0)!=1){g=-1;return g|0}d=b+12|0;e=c[d>>2]|0;if(!((e|0)!=0&(e&15|0)==0)){g=-1;return g|0}g=b+36|0;Ef(g,g,e,c[b+16>>2]|0,b+20|0,0);d=a[(c[d>>2]|0)+-1+(b+36)>>0]|0;if((d+-1&255)>15){g=-1;return g|0}d=e-(d&255)|0;if(d|0?(f=Xa[c[b>>2]&31](c[b+4>>2]|0,g,d)|0,(f|0)<0):0){g=f;return g|0}g=0;return g|0}function ke(a){a=a|0;Mg(a);return}function le(a,b,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=vf(48)|0;c[m>>2]=a;c[m+4>>2]=b;b=m+8|0;c[b>>2]=0;c[b+4>>2]=0;c[m+16>>2]=j;c[m+20>>2]=k;b=m+24|0;c[b>>2]=g;k=m+32|0;g=k;c[g>>2]=0;c[g+4>>2]=0;if(l|0){g=vf(4132)|0;c[g>>2]=15;c[g+4>>2]=m;c[g+16>>2]=l;c[m+40>>2]=g}l=vf(8)|0;c[l>>2]=m;c[l+4>>2]=9;g=(h|0)!=0|(i|0)!=0;if(g){a=Lg(h)|0;j=c[m>>2]|0;b=c[b>>2]|0;if((b|0)!=0?(n=k,n=_a[c[j+48>>2]&15](j,b,c[n>>2]|0,c[n+4>>2]|0,a,h)|0,(n|0)>=0):0){b=k;n=pi(c[b>>2]|0,c[b+4>>2]|0,n|0,((n|0)<0)<<31>>31|0)|0;b=k;c[b>>2]=n;c[b+4>>2]=y;b=16263}else b=16263}else{a=0;b=16268}n=c[8556]|0;c[8556]=n+1;if(!n)Na(1);wa(d|0,b|0,e|0,f|0,a|0,h|0,l|0,1,7,8,0)|0;if(!g)return;Mg(a);return}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=c[a>>2]|0;e=a+8|0;f=e;a=_a[c[g+52>>2]&15](g,c[a+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,b,d)|0;if((a|0)<0)return a|0;f=e;f=pi(c[f>>2]|0,c[f+4>>2]|0,a|0,((a|0)<0)<<31>>31|0)|0;g=e;c[g>>2]=f;c[g+4>>2]=y;return a|0}function ne(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[b>>2]|0;do if((d|0)<0){h=b+40|0;i=d;g=((d|0)<0)<<31>>31}else{h=b+40|0;g=c[h>>2]|0;do if(!g){i=b+8|0;g=i;g=_a[c[o+52>>2]&15](o,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0,e,f)|0;if((g|0)<0)n=13;else{m=i;m=pi(c[m>>2]|0,c[m+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;n=i;c[n>>2]=m;c[n+4>>2]=y;n=14}}else{g=ie(g,e,f)|0;if(!((d|0)==0&(g|0)>-1))if((g|0)<0){n=13;break}else{n=14;break}g=c[h>>2]|0;if((((c[g+8>>2]|0)==1?(i=g+12|0,j=c[i>>2]|0,(j|0)!=0&(j&15|0)==0):0)?(k=g+36|0,Ef(k,k,j,c[g+16>>2]|0,g+20|0,0),l=a[(c[i>>2]|0)+-1+(g+36)>>0]|0,(l+-1&255)<=15):0)?(m=j-(l&255)|0,m|0):0)Xa[c[g>>2]&31](c[g+4>>2]|0,k,m)|0}while(0);if((n|0)==13){i=g;g=((g|0)<0)<<31>>31;break}if((n|0)==14?d|0:0)return;g=b+8|0;i=c[g>>2]|0;g=c[g+4>>2]|0}while(0);gb[c[b+16>>2]&7](o,c[b+4>>2]|0,i,g,c[b+20>>2]|0);g=c[h>>2]|0;if(g|0)Mg(g);Mg(b);return}function oe(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+288|0;x=A+48|0;y=A;z=A+80|0;if((f|0)>=33)ja(16272,16297,589,16307);if((h|0)<=0){l=A;return}o=y+f|0;p=y+(f+1)|0;q=y+(f+2)|0;r=y+(f+3)|0;s=f+4|0;t=(g|0)>0;u=(d|0)>64;v=z+112|0;w=z+176|0;n=1;while(1){c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;Ei(y|0,e|0,f|0)|0;a[o>>0]=n>>>24;a[p>>0]=n>>>16;a[q>>0]=n>>>8;a[r>>0]=n;if(t){k=s;m=0;while(1){if(u){Jf(b,d,v);j=32}else{Ei(v|0,b|0,d|0)|0;j=d}Fi(z+112+j|0,0,64-j|0)|0;j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^54;j=j+1|0}while((j|0)!=64);Ff(z);Gf(z,v,64);Gf(z,y,k);If(w,z);j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^106;j=j+1|0}while((j|0)!=64);Jf(v,96,y);j=0;do{B=x+j|0;a[B>>0]=a[B>>0]^a[y+j>>0];j=j+1|0}while((j|0)!=32);m=m+1|0;if((m|0)==(g|0))break;else k=32}}j=(h|0)<32?h:32;Ei(i|0,x|0,j|0)|0;h=h-j|0;if((h|0)<=0)break;else{i=i+j|0;n=n+1|0}}l=A;return}function pe(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(!(a[b>>0]|0)){f=Lh(c)|0;return f|0}g=_g(b)|0;e=_g(c)|0;f=Lg(g+2+e|0)|0;Ei(f|0,b|0,g|0)|0;d=f+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ei(d|0,c|0,e+1|0)|0;g=f;return g|0}function qe(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(ch(c,58)|0){f=Lh(c)|0;return f|0}if(!(a[b>>0]|0)){f=Lh(c)|0;return f|0}g=_g(b)|0;f=_g(c)|0;e=Lg(g+2+f|0)|0;Ei(e|0,b|0,g|0)|0;d=e+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ei(d|0,c|0,f+1|0)|0;g=e;return g|0}function re(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){g=a[d>>0]|0;e=g<<24>>24==10;f=d+1|0;if(e^g<<24>>24!=0)d=f;else break}c[b>>2]=e?f:d;return}function se(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[e>>2]|0;a:while(1){f=a[h>>0]|0;switch(f<<24>>24){case 34:{j=4;break a}case 0:{i=-1;j=26;break a}case 9:case 32:break;default:{j=21;break a}}h=h+1|0}b:do if((j|0)==4){k=b+d+-1|0;f=h+1|0;c:while(1){d=f+1|0;j=a[f>>0]|0;h=j<<24>>24;d:do switch(j<<24>>24){case 34:{g=b;l=d;break b}case 0:case 10:{i=-1;j=26;break c}case 92:{i=f+2|0;h=a[d>>0]|0;switch(h|0){case 92:case 34:case 39:{f=i;break d}case 110:{h=10;f=i;break d}case 114:{h=13;f=i;break d}case 116:{h=9;f=i;break d}case 120:{i=a[i>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{j=d+-87|0;break}else{j=d+-55|0;break}else j=h;while(0);i=a[f+3>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{h=d+-87|0;break}else{h=d+-55|0;break}while(0);h=h|j<<4;f=f+4|0;break d}default:{i=-1;j=26;break c}}}default:f=d}while(0);if(b>>>0>=k>>>0){i=-1;j=26;break}a[b>>0]=h;b=b+1|0}if((j|0)==26)return i|0}else if((j|0)==21){i=b+d+-1|0;g=b;while(1){switch(f<<24>>24){case 10:case 0:case 9:case 32:{l=h;break b}default:{}}if(g>>>0>=i>>>0){i=-1;break}l=h+1|0;a[g>>0]=f;g=g+1|0;h=l;f=a[l>>0]|0}return i|0}else if((j|0)==26)return i|0;while(0);a[g>>0]=0;c[e>>2]=l;e=0;return e|0}function te(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=c[d>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Sh(g,f,e)|0;b=c[f>>2]|0;if((b|0)==(g|0)){d=-1;l=h;return d|0}c[d>>2]=b;d=0;l=h;return d|0}function ue(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=ai(f,e,0)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function ve(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}c[b>>2]=Sh(f,e,0)|0;b=c[e>>2]|0;if((b|0)==(f|0)){d=-1;l=g;return d|0}c[d>>2]=b;d=0;l=g;return d|0}function we(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;g=c[e>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=Sh(g,f,0)|0;b=c[f>>2]|0;if((b|0)==(g|0)){e=-1;l=i;return e|0}if((a[b>>0]|0)==46){b=b+1|0;f=a[b>>0]|0;if((f+-48&255)<10){g=0;h=1e9;do{h=(h>>>0)/10|0;g=(N((f<<24>>24)+-48|0,h)|0)+g|0;b=b+1|0;f=a[b>>0]|0}while((f+-48&255)<10);f=g}else f=0}else f=0;c[d>>2]=f;c[e>>2]=b;e=0;l=i;return e|0}function xe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=ai(f,e,16)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function ye(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=f;c[g>>2]=b;c[g+4>>2]=d;Th(a,16330,f)|0;l=e;return a|0}function ze(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if((d|0)<=0){d=0;return d|0}j=0;a:while(1){h=j<<1;f=a[c+h>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{i=g+-87|0;break}else{i=g+-55|0;break}else i=e;while(0);f=a[c+(h|1)>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{e=g+-87|0;break}else{e=g+-55|0;break}while(0);a[b+j>>0]=e|i<<4;j=j+1|0;if((j|0)>=(d|0)){e=0;f=12;break}}if((f|0)==12)return e|0;return 0}function Ae(a){a=a|0;a=Mh(a,16338)|0;return ((a|0)==0?0:a+2|0)|0}function Be(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+128|0;i=k;j=i;a:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 10:case 0:{d=-1;f=18;break a}default:{}}f=i;b:while(1){switch(g<<24>>24){case 0:case 10:case 58:break b;default:{}}if((f-j|0)>>>0<127){a[f>>0]=g;f=f+1|0}g=d+1|0;d=g;g=a[g>>0]|0}a[f>>0]=0;if((a[d>>0]|0)!=58){d=-1;f=18;break}c:while(1){d=d+1|0;switch(a[d>>0]|0){case 9:case 32:break;default:break c}}f=ch(d,10)|0;g=(f|0)!=0;if(g)h=f-d|0;else h=_g(d)|0;if(!(Zg(i,e)|0)){f=16;break}if(g)d=f+1|0;else{d=-1;f=18;break}}if((f|0)==16){c=(h|0)<(c|0)?h:c+-1|0;Ei(b|0,d|0,c|0)|0;a[b+c>>0]=0;c=0;l=k;return c|0}else if((f|0)==18){l=k;return d|0}return 0}function Ce(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Be(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=ai(f,g,0)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function De(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Be(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=ai(f,g,16)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function Ee(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+80|0;e=f+64|0;d=f;if(Be(d,64,b,16341)|0){l=f;return -1}a:while(1){switch(a[d>>0]|0){case 9:case 32:break;default:break a}d=d+1|0}b=ai(d,e,0)|0;l=f;return ((c[e>>2]|0)==(d|0)?-1:b)|0}function Fe(a){a=a|0;if(wf(a,16349,0)|0){a=1;return a|0}if(wf(a,16355,0)|0){a=1;return a|0}a=(wf(a,16362,0)|0)!=0&1;return a|0}function Ge(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[e>>2]|0;o=Wa[c[o+2576>>2]&3](o,e)|0;if((f|0)<=0)return;m=a+8|0;n=a+4|0;l=0;h=0;e=0;while(1){g=c[o+(l>>>5<<2)>>2]|0;if(!g)g=h;else{i=0;k=e;while(1){j=i;while(1){e=1<<j;if(!(e&g))j=j+1|0;else break}g=g&~e;e=j+l<<12;p=c[m>>2]|0;i=(e|0)/(p|0)|0;p=((e|4095|0)/(p|0)|0)+1|0;e=c[n>>2]|0;e=(p|0)<(e|0)?p:e;if((k|0)!=(h|0)){if((i|0)>(k+3|0)){hb[b&1](a,d,0,h,c[a>>2]|0,k-h|0);h=i}}else h=i;if(!g){g=h;break}else{i=j;k=e}}}l=l+32|0;if((l|0)>=(f|0))break;else h=g}if((e|0)==(g|0))return;hb[b&1](a,d,0,g,c[a>>2]|0,e-g|0);return}function He(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=vf(12)|0;c[h>>2]=e;c[e>>2]=f;c[e+4>>2]=g;f=f<<2;c[e+8>>2]=f;f=(N(f,g)|0)+65535&-65536;g=e+16|0;c[g>>2]=f;c[h+4>>2]=f>>12;g=c[g>>2]|0;g=_a[c[a+2568>>2]&15](a,b,d,g,((g|0)<0)<<31>>31,2)|0;c[h+8>>2]=g;c[e+12>>2]=c[g+40>>2];c[e+20>>2]=h;c[e+24>>2]=6;return h|0}function Ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+20>>2]|0;Ge(a,b,d,c[e+8>>2]|0,c[e+4>>2]|0);return}function Je(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;a:do if((e|0)>=0){j=b+4+(e<<2)|0;if(c[j>>2]|0){i=0;return i|0}}else{e=0;while(1){j=b+4+(e<<2)|0;if(!(c[j>>2]|0))break a;e=e+8|0;if(e>>>0>=256){e=0;break}}return e|0}while(0);k=vf(432)|0;c[k>>2]=b;c[k+316>>2]=Lh(d)|0;a[k+4>>0]=e;a[k+56>>0]=f;a[k+57>>0]=(f&65535)>>>8;a[k+58>>0]=g;a[k+59>>0]=(g&65535)>>>8;a[k+64>>0]=h;a[k+66>>0]=i;a[k+67>>0]=(i&65535)>>>8;a[k+70>>0]=0;a[k+312>>0]=64;uf(k+8|0,7,k,0);uf(k+20|0,7,k,1);uf(k+32|0,7,k,2);uf(k+44|0,7,k,3);c[j>>2]=k;i=k;return i|0}function Ke(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a>>2]|0;f=d[a+4>>0]|0;a=b+3+(f>>>3)&3;b=1<<(f&31);if(!e){e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]&~b}else{e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]|b}eb[c[g+1164+(a*12|0)>>2]&15](c[g+1164+(a*12|0)+4>>2]|0,c[g+1164+(a*12|0)+8>>2]|0,(c[g+1036+(a<<5)+28>>2]|(c[g+1036+(a<<5)+24>>2]|(c[g+1036+(a<<5)+20>>2]|(c[g+1036+(a<<5)+16>>2]|(c[g+1036+(a<<5)+12>>2]|(c[g+1036+(a<<5)+8>>2]|(c[g+1036+(a<<5)+4>>2]|c[g+1036+(a<<5)>>2]))))))|0)!=0&1);return}function Le(a,b){a=a|0;b=b|0;if(b>>>0<4)return a+8+(b*12|0)|0;else ja(16368,16380,140,16386);return 0}function Me(a){a=a|0;return c[(c[a>>2]|0)+1028>>2]|0}function Ne(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;if(d>>>0>=7)ja(16405,16380,190,16431);if(e+-1&e|0)ja(16448,16380,191,16431);if(e>>>0<=3)ja(16473,16380,192,16431);i=b+320+(d<<4)|0;if(!(c[i>>2]|0)){c[i>>2]=e;f=f&255;a[b+320+(d<<4)+4>>0]=f;a[b+320+(d<<4)+5>>0]=0;c[b+320+(d<<4)+8>>2]=g;c[b+320+(d<<4)+12>>2]=h;g=(d|0)==6;h=(g?48:(d<<2)+16|0)+(b+56)|0;a[h>>0]=g?0:f;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;return}else ja(16483,16380,194,16431)}function Oe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return tf(c[(c[a>>2]|0)+1028>>2]|0,b,d,e)|0}function Pe(b,c,d){b=b|0;c=c|0;d=d|0;a[(c&255)+(b+56)>>0]=d;return}function Qe(b,c,d){b=b|0;c=c|0;d=d|0;c=(c&255)+(b+56)|0;a[c>>0]=d;a[c+1>>0]=(d&65535)>>>8;return}function Re(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+312|0;f=a[e>>0]|0;g=f&255;h=g+d|0;if((h|0)>256){h=-1;return h|0}a[e>>0]=h;h=b+62|0;a[h>>0]=a[h>>0]|16;Ei(b+56+g|0,c|0,d|0)|0;h=b+108|0;a[g+1+(b+56)>>0]=a[h>>0]|0;a[h>>0]=f;h=g;return h|0}function Se(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((c[b>>2]|0)!=2){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;f=c[b>>2]|0;a:do if((f|0)>0){e=c[b+8>>2]|0;b=0;while(1){if(!(Zg((c[e+(b<<4)+4>>2]|0)+4|0,d)|0))break;b=b+1|0;if((b|0)>=(f|0))break a}if(e+(b<<4)|0){e=e+(b<<4)+8|0;f=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=f;return}}while(0);c[a>>2]=6;c[a+4>>2]=0;return}function Te(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;if((c[a>>2]|0)!=2){d=-1;l=j;return d|0}i=c[a+4>>2]|0;a=c[i>>2]|0;a:do if((a|0)>0){f=c[i+8>>2]|0;e=0;while(1){if(!(Zg((c[f+(e<<4)+4>>2]|0)+4|0,b)|0))break;e=e+1|0;if((e|0)>=(a|0)){h=8;break a}}if(f+(e<<4)|0){a=f+(e<<4)+8|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];Ue(g)}else h=8}else h=8;while(0);if((h|0)==8){e=i+4|0;f=c[e>>2]|0;if((a|0)<(f|0))e=c[i+8>>2]|0;else{g=a+1|0;a=(f*3|0)/2|0;a=(g|0)>(a|0)?g:a;g=i+8|0;h=Ng(c[g>>2]|0,a<<4)|0;c[g>>2]=h;c[e>>2]=a;a=c[i>>2]|0;e=h}c[i>>2]=a+1;h=_g(b)|0;i=Lg(h+5|0)|0;c[i>>2]=h;Ei(i+4|0,b|0,h+1|0)|0;c[e+(a<<4)>>2]=0;c[e+(a<<4)+4>>2]=i;a=e+(a<<4)+8|0}i=d;b=c[i+4>>2]|0;d=a;c[d>>2]=c[i>>2];c[d+4>>2]=b;d=0;l=j;return d|0}function Ue(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=l;l=l+16|0;e=f;switch(c[a>>2]|0){case 7:case 0:{Mg(c[a+4>>2]|0);l=f;return}case 3:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=(c[d>>2]|0)+(a<<3)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ue(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Mg(b);l=f;return}case 2:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=c[d>>2]|0;h=g+(a<<4)|0;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];Ue(e);g=g+(a<<4)+8|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];Ue(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Mg(b);l=f;return}case 6:case 5:case 4:case 1:{l=f;return}default:ra()}}function Ve(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[b>>2]|0)!=3){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;if((c[b>>2]|0)>>>0>d>>>0){e=(c[b+8>>2]|0)+(d<<3)|0;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}else{c[a>>2]=6;c[a+4>>2]=0;return}}function We(a){a=a|0;return ((c[a>>2]|0)==7?(c[a+4>>2]|0)+4|0:0)|0}function Xe(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+272|0;g=e+256|0;f=e;c[g>>2]=d;gh(f,256,b,g)|0;b=_g(f)|0;d=Lg(b+5|0)|0;c[d>>2]=b;Ei(d+4|0,f|0,b+1|0)|0;c[a>>2]=7;c[a+4>>2]=d;l=e;return}function Ye(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+240|0;u=y+224|0;m=y+216|0;i=y+208|0;j=y+200|0;s=y+192|0;p=y+184|0;o=y+176|0;n=y+168|0;h=y+160|0;q=y;w=y+212|0;x=y+152|0;v=y+136|0;k=y+144|0;r=y+128|0;e=c[d>>2]|0;c[w>>2]=e;a:while(1){f=a[e>>0]|0;b:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break a;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break b;default:{}}e=e+1|0}}case 42:break;default:break a}e=e+2|0;c:while(1)switch(a[e>>0]|0){case 0:break b;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break c;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;if(!(f<<24>>24)){Xe(b,16496,h);l=y;return}d:do if((g+-48|0)>>>0<10){u=bi(e,w,0)|0;v=x;c[v>>2]=1;c[v+4>>2]=u}else switch(f<<24>>24){case 34:{Ze(x,w);break d}case 123:{e=e+1|0;c[w>>2]=e;i=vf(12)|0;c[x>>2]=2;c[x+4>>2]=i;i=k+4|0;h=q+1|0;j=q;e:while(1){f=a[e>>0]|0;f:do if(!(Zh(f<<24>>24)|0)){g:do if(f<<24>>24==47){switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break f;default:{}}e=e+1|0}}case 42:break;default:break g}e=e+2|0;h:while(1)switch(a[e>>0]|0){case 0:break f;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break h;else e=f;break}default:e=e+1|0}e=e+2|0;break f}while(0);c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;switch(f<<24>>24){case 125:{t=38;break e}case 34:{Ze(k,w);e=c[i>>2]|0;if((c[k>>2]|0)==7){t=40;break e}break}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){t=48;break e}a[q>>0]=f;e=e+1|0;g=a[e>>0]|0;t=g<<24>>24;if((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26)))){f=e;e=h;do{if((e-j|0)>126){t=48;break e}a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;t=g<<24>>24}while((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26))))}else{f=e;e=h}c[w>>2]=f;a[e>>0]=0;t=_g(q)|0;e=Lg(t+5|0)|0;c[e>>2]=t;Ei(e+4|0,q|0,t+1|0)|0}}if(!(c[e>>2]|0)){t=48;break e}f=c[w>>2]|0;i:while(1){g=a[f>>0]|0;j:do if(!(Zh(g<<24>>24)|0)){if(g<<24>>24!=47)break i;switch(a[f+1>>0]|0){case 47:{f=f+2|0;while(1){switch(a[f>>0]|0){case 10:case 0:break j;default:{}}f=f+1|0}}case 42:break;default:break i}f=f+2|0;k:while(1)switch(a[f>>0]|0){case 0:break j;case 42:{g=f+1|0;if((a[g>>0]|0)==47)break k;else f=g;break}default:f=f+1|0}f=f+2|0}else f=f+1|0;while(0)}c[w>>2]=f;if((a[f>>0]|0)!=58){t=65;break e}c[w>>2]=f+1;Ye(v,w);c[m>>2]=c[x>>2];c[m+4>>2]=c[x+4>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];Te(m,e+4|0,u)|0;e=c[w>>2]|0;l:while(1){f=a[e>>0]|0;m:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break l;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break m;default:{}}e=e+1|0}}case 42:break;default:break l}e=e+2|0;n:while(1)switch(a[e>>0]|0){case 0:break m;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break n;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 125:break f;case 44:break;default:{t=83;break e}}e=e+1|0;c[w>>2]=e}else e=e+1|0;while(0)}if((t|0)==38){c[w>>2]=e+1;break d}else if((t|0)==40){c[b>>2]=7;c[b+4>>2]=e;l=y;return}else if((t|0)==48){Xe(b,16519,n);l=y;return}else if((t|0)==65){Xe(b,16541,o);l=y;return}else if((t|0)==83){Xe(b,16554,p);l=y;return}break}case 91:{e=e+1|0;c[w>>2]=e;n=vf(12)|0;c[x>>2]=3;c[x+4>>2]=n;o=n+8|0;p=n+4|0;m=n+8|0;q=n+8|0;j=0;o:while(1){p:while(1){f=a[e>>0]|0;q:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break p;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break q;default:{}}e=e+1|0}}case 42:break;default:break p}e=e+2|0;r:while(1)switch(a[e>>0]|0){case 0:break q;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break r;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;if((a[e>>0]|0)==93){t=101;break}Ye(r,w);i=r;h=c[i>>2]|0;i=c[i+4>>2]|0;k=v;c[k>>2]=h;c[k+4>>2]=i;k=j+1|0;e=c[n>>2]|0;if(e>>>0<=j>>>0){if((e|0)==(j|0)){e=c[p>>2]|0;if((e|0)>(j|0)){f=k;g=c[m>>2]|0;e=j}else{e=(e*3|0)/2|0;e=(k|0)>(e|0)?k:e;g=Ng(c[q>>2]|0,e<<3)|0;c[q>>2]=g;c[p>>2]=e;e=c[n>>2]|0;f=e+1|0}c[n>>2]=f;e=g+(e<<3)|0;t=109}}else{e=(c[o>>2]|0)+(j<<3)|0;c[u>>2]=c[e>>2];c[u+4>>2]=c[e+4>>2];Ue(u);e=(c[o>>2]|0)+(j<<3)|0;t=109}if((t|0)==109){t=0;j=e;c[j>>2]=h;c[j+4>>2]=i}e=c[w>>2]|0;s:while(1){f=a[e>>0]|0;t:do if(!(Zh(f<<24>>24)|0)){if(f<<24>>24!=47)break s;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break t;default:{}}e=e+1|0}}case 42:break;default:break s}e=e+2|0;u:while(1)switch(a[e>>0]|0){case 0:break t;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break u;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 44:{e=e+1|0;c[w>>2]=e;break}case 93:break;default:break o}j=k}if((t|0)==101){c[w>>2]=e+1;break d}Xe(b,16575,s);l=y;return}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){Xe(b,16637,i);l=y;return}a[q>>0]=f;f=e+1|0;e=q+1|0;g=a[f>>0]|0;v=g<<24>>24;v:do if((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26)))){h=q;while(1){if((e-h|0)>126)break v;a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;v=g<<24>>24;if(!((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26))))){t=134;break}}}else t=134;while(0);if((t|0)==134){c[w>>2]=f;a[e>>0]=0;if(!(Zg(q,16596)|0)){v=x;c[v>>2]=5;c[v+4>>2]=0;break d}if(!(Zg(q,16601)|0)){v=x;c[v>>2]=4;c[v+4>>2]=1;break d}if(!(Zg(q,16606)|0)){v=x;c[v>>2]=4;c[v+4>>2]=0;break d}}c[j>>2]=q;Xe(b,16612,j);l=y;return}}while(0);c[d>>2]=c[w>>2];d=x;w=c[d+4>>2]|0;x=b;c[x>>2]=c[d>>2];c[x+4>>2]=w;l=y;return}function Ze(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4144|0;r=s+4128|0;q=s+4120|0;p=s+4112|0;o=s+4104|0;n=s+4096|0;m=s;j=m+4095|0;e=(c[d>>2]|0)+1|0;k=m;a:while(1){h=e+1|0;i=a[e>>0]|0;f=i<<24>>24;b:do switch(i<<24>>24){case 0:case 10:{e=3;break a}case 34:{e=23;break a}case 92:{g=e+2|0;f=a[h>>0]|0;switch(f|0){case 92:case 34:case 39:{e=g;break b}case 110:{f=10;e=g;break b}case 114:{f=13;e=g;break b}case 116:{f=9;e=g;break b}case 120:{g=a[g>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=12;break a}else{i=h+-87|0;break}else{i=h+-55|0;break}else i=f;while(0);g=a[e+3>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=17;break a}else{f=h+-87|0;break}else{f=h+-55|0;break}while(0);f=f|i<<4;e=e+4|0;break b}default:{e=19;break a}}}default:e=h}while(0);if(k>>>0>=j>>>0){e=21;break}a[k>>0]=f;k=k+1|0}if((e|0)==3){Xe(b,16658,n);l=s;return}else if((e|0)==12){Xe(b,16678,o);l=s;return}else if((e|0)==17){Xe(b,16678,p);l=s;return}else if((e|0)==19){Xe(b,16696,q);l=s;return}else if((e|0)==21){Xe(b,16716,r);l=s;return}else if((e|0)==23){a[k>>0]=0;c[d>>2]=h;q=_g(m)|0;r=Lg(q+5|0)|0;c[r>>2]=q;Ei(r+4|0,m|0,q+1|0)|0;c[b>>2]=0;c[b+4>>2]=r;l=s;return}}function _e(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;k=n+24|0;m=n+16|0;i=n+20|0;j=n+8|0;g=n;c[i>>2]=d;Ye(g,i);h=c[g>>2]|0;g=c[g+4>>2]|0;f=j;c[f>>2]=h;c[f+4>>2]=g;if((h|0)==7){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return}d=c[i>>2]|0;a:while(1){e=a[d>>0]|0;b:do if(!(Zh(e<<24>>24)|0)){if(e<<24>>24!=47){f=19;break a}switch(a[d+1>>0]|0){case 47:{d=d+2|0;while(1){switch(a[d>>0]|0){case 10:case 0:break b;default:{}}d=d+1|0}}case 42:break;default:{f=8;break a}}d=d+2|0;c:while(1)switch(a[d>>0]|0){case 0:break b;case 42:{e=d+1|0;if((a[e>>0]|0)==47)break c;else d=e;break}default:d=d+1|0}d=d+2|0}else d=d+1|0;while(0)}if((f|0)==8)c[i>>2]=d;else if((f|0)==19?(c[i>>2]=d,e<<24>>24==0):0){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return};c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];Ue(k);Xe(b,16732,m);l=n;return}function $e(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+16|0;g=f;h=Lg(e+1|0)|0;Ei(h|0,d|0,e|0)|0;a[h+e>>0]=0;_e(g,h);d=g;g=c[d>>2]|0;d=c[d+4>>2]|0;Mg(h);e=b;c[e>>2]=g;c[e+4>>2]=d;l=f;return}function af(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=vf(16)|0;h=vf(1168)|0;j=h+8|0;$g(j,b)|0;i=Jh(j,47)|0;a[((i|0)==0?j:i+1|0)>>0]=0;i=h+1064|0;c[i>>2]=i;c[h+1068>>2]=i;c[h+4>>2]=d;c[h+1036>>2]=e;c[h+1040>>2]=f;c[h>>2]=g;c[g+12>>2]=h;c[g>>2]=10;c[g+4>>2]=2;c[g+8>>2]=3;ge(b,0,0,g,10,1)|0;return g|0}function bf(a){a=a|0;a=(c[a+12>>2]|0)+1048|0;y=c[a+4>>2]|0;return c[a>>2]|0}function cf(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=0;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1096|0;g=h;g=pi(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return jf(a,1)|0}function df(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=1;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1112|0;g=h;g=pi(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return jf(a,1)|0}function ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=l;l=l+1280|0;B=G+128|0;E=G+1248|0;D=G+1240|0;C=G+1232|0;o=G+1224|0;n=G+1216|0;k=G+1200|0;i=G+1184|0;h=G+1176|0;g=G+1168|0;j=G+1256|0;x=G+1160|0;z=G+1152|0;f=G+1208|0;m=G+1192|0;A=G;v=G+1264|0;u=a+12|0;w=c[u>>2]|0;if((b|0)<0){t=c[3261]|0;c[g>>2]=0-b;fi(t,16765,g)|0;Da(1)}$e(f,d,e);r=f;t=c[r>>2]|0;r=c[r+4>>2]|0;s=x;c[s>>2]=t;c[s+4>>2]=r;if((t|0)==7){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[h>>2]=We(B)|0;yg(18452,h);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((zg(B,16808,j)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}s=c[j>>2]|0;t=s<<1;b=w+1056|0;c[b>>2]=t;if((s|0)>=1?(t+-1&t|0)==0:0){a=w+1060|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((zg(B,16839,a)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}a=c[a>>2]|0;if((a|0)<1){yg(16847,k);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}s=c[b>>2]|0;s=vi(s|0,((s|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;t=y;r=w+1048|0;c[r>>2]=s;c[r+4>>2]=t;c[w+1072>>2]=0;r=(c[w+4>>2]|0)/(c[j>>2]|0)|0;c[w+1076>>2]=(r|0)>1?r:1;c[w+1136>>2]=-1;c[w+1080>>2]=8;t=pi(s|0,t|0,7,0)|0;t=ti(t|0,y|0,8,0)|0;c[w+1088>>2]=t;c[w+1084>>2]=vf(t<<2)|0;t=w+1160|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((Ag(B,16864,t,1)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}if((c[t>>2]|0)>32){yg(16883,n);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Se(m,B,16915);b=m;a=c[b>>2]|0;b=c[b+4>>2]|0;s=z;c[s>>2]=a;c[s+4>>2]=b;if((a|0)!=6){if((a|0)!=3){yg(16924,o);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}q=c[b>>2]|0;a:do if((q|0)>0){p=v+4|0;r=w+1064|0;s=w+1068|0;o=0;b:while(1){b=q-o|0;n=c[t>>2]|0;n=(b|0)<(n|0)?b:n;b=(n|0)>0;c:do if(b){a=0;do{c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];Ve(v,B,a+o|0);if((c[v>>2]|0)!=1)break b;c[A+(a<<2)>>2]=c[p>>2];a=a+1|0}while((a|0)<(n|0));if((n|0)==1){d=c[A>>2]|0;b=c[s>>2]|0;d:do if((b|0)!=(r|0)){a=b;while(1){if((c[a+12>>2]|0)==(d|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break d}if((b|0)==(a|0))if(!b)break;else break c;else{j=c[a>>2]|0;k=a+4|0;m=c[k>>2]|0;c[j+4>>2]=m;c[m>>2]=j;c[a>>2]=0;c[k>>2]=0;m=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[k>>2]=m;c[m>>2]=a;break c}}while(0);k=c[u>>2]|0;m=ff(k,d)|0;j=k+1104|0;i=j;i=pi(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[j>>2]=i;c[j+4>>2]=y;c[D>>2]=k+8;c[D+4>>2]=d;fh(B,1024,16966,D)|0;ge(B,0,0,m,11,1)|0}else F=35}else F=35;while(0);if((F|0)==35){F=0;j=(o|0)/(c[t>>2]|0)|0;k=c[u>>2]|0;m=Lg(140)|0;c[m>>2]=k;c[m+4>>2]=j;c[m+8>>2]=n;do if(b){g=k+1064|0;h=k+1068|0;i=m+12|0;a=0;f=0;do{e=c[A+(f<<2)>>2]|0;d=c[h>>2]|0;e:do if((d|0)!=(g|0)){b=d;while(1){if((c[b+12>>2]|0)==(e|0))break;b=c[b+4>>2]|0;if((b|0)==(g|0)){F=44;break e}}if((d|0)==(b|0))if(!d){F=44;break}else{b=0;break}else{H=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;c[H+4>>2]=e;c[e>>2]=H;c[b>>2]=0;c[d>>2]=0;e=c[h>>2]|0;c[h>>2]=b;c[b>>2]=g;c[d>>2]=e;c[e>>2]=b;b=0;break}}else F=44;while(0);if((F|0)==44){F=0;b=ff(k,e)|0;a=1}c[i+(f<<2)>>2]=b;f=f+1|0}while((f|0)!=(n|0));if(!a){F=48;break}c[E>>2]=k+8;c[E+4>>2]=j;fh(B,1024,16980,E)|0;ge(B,0,0,m,12,1)|0}else F=48;while(0);if((F|0)==48){F=0;Mg(m)}}o=n+o|0;if((q|0)<=(o|0))break a}yg(16944,C);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}while(0)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);a=c[w+1036>>2]|0;if(!a){l=G;return}cb[a&15](c[w+1040>>2]|0);l=G;return}yg(16819,i);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];Ue(B);Da(1)}function ff(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=a+1072|0;d=c[h>>2]|0;i=a+1076|0;g=a+1064|0;a:do if((d|0)>=(c[i>>2]|0)?(e=c[g>>2]|0,(e|0)!=(g|0)):0)do{f=e;e=c[e>>2]|0;if((c[f+16>>2]|0)==1){c[h>>2]=d+-1;Ia(f+20|0);j=c[f>>2]|0;d=c[f+4>>2]|0;c[j+4>>2]=d;c[d>>2]=j;Mg(f);d=c[h>>2]|0;if((d|0)<(c[i>>2]|0))break a}}while((e|0)!=(g|0));while(0);j=vf(28)|0;c[j+8>>2]=a;c[j+12>>2]=b;c[j+16>>2]=0;b=j+20|0;Ga(b|0);Ja(b|0,c[a+1056>>2]<<9|0)|0;b=a+1068|0;i=c[b>>2]|0;c[b>>2]=j;c[j>>2]=g;c[j+4>>2]=i;c[i>>2]=j;c[h>>2]=(c[h>>2]|0)+1;return j|0}function gf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((b|0)<0){g=c[3261]|0;c[f>>2]=c[a+12>>2];fi(g,17138,f)|0;Da(1)}g=c[a+8>>2]|0;if((c[g+1056>>2]<<9|0)!=(e|0))ja(17163,17058,366,17192);b=c[g>>2]|0;f=a+16|0;if(c[f>>2]|0)ja(17095,17058,346,17122);La(a+20|0,0,d|0,e|0);c[f>>2]=1;if((c[a+12>>2]|0)!=(c[g+1136>>2]|0)){l=h;return}jf(b,0)|0;l=h;return}function hf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;if((b|0)<0){k=c[3261]|0;c[f>>2]=c[a+4>>2];fi(k,16994,f)|0;Da(1)}j=c[(c[a>>2]|0)+1056>>2]<<9;k=a+8|0;b=c[k>>2]|0;if((N(j,b)|0)!=(e|0))ja(17019,17058,252,17070);if((b|0)<=0){Mg(a);l=m;return}f=a+12|0;b=0;while(1){e=c[f+(b<<2)>>2]|0;if(e|0){g=c[e+8>>2]|0;h=c[g>>2]|0;i=e+16|0;if(c[i>>2]|0){b=9;break}n=d+(N(b,j)|0)|0;La(e+20|0,0,n|0,c[g+1056>>2]<<9|0);c[i>>2]=1;if((c[e+12>>2]|0)==(c[g+1136>>2]|0))jf(h,0)|0}b=b+1|0;if((b|0)>=(c[k>>2]|0)){b=13;break}}if((b|0)==9)ja(17095,17058,346,17122);else if((b|0)==13){Mg(a);l=m;return}}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+1040|0;C=E+1024|0;B=E;w=a+12|0;x=c[w>>2]|0;z=x+1144|0;A=x+1140|0;a=c[A>>2]|0;d=(c[z>>2]|0)-a|0;a:do if(d|0){m=x+1128|0;n=x+1080|0;o=x+1084|0;p=x+1056|0;q=x+1136|0;r=x+1064|0;s=x+1068|0;t=x+1120|0;u=x+1156|0;v=x+1092|0;b:while(1){i=m;h=c[i>>2]|0;i=c[i+4>>2]|0;e=c[n>>2]|0;f=((e|0)<0)<<31>>31;k=xi(h|0,i|0,e|0,f|0)|0;g=y;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;do if(!j){e=c[p>>2]|0;f=((e|0)<0)<<31>>31;g=xi(h|0,i|0,e|0,f|0)|0;f=vi(g|0,y|0,e|0,f|0)|0;f=qi(h|0,i|0,f|0,y|0)|0;e=e-f|0;d=(d|0)<(e|0)?d:e;c[q>>2]=g;e=c[s>>2]|0;if((e|0)==(r|0))break b;a=e;while(1){if((c[a+12>>2]|0)==(g|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break b}if((e|0)==(a|0)){if(!e)break b}else{h=c[a>>2]|0;i=a+4|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[a>>2]=0;c[i>>2]=0;j=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[i>>2]=j;c[j>>2]=a}if(!(c[a+16>>2]|0)){a=1;D=23;break b}if(!(c[t>>2]|0)){Ha(a+20|0,f<<9|0,(c[u>>2]|0)+(c[A>>2]<<9)|0,d<<9|0);a=(c[A>>2]|0)+d|0;c[A>>2]=a;j=m;j=pi(c[j>>2]|0,c[j+4>>2]|0,d|0,((d|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y;c[q>>2]=-1;break}else{h=vf(8)|0;i=c[n>>2]<<9;j=Lg(i)|0;Ga(h|0);Ja(h|0,i|0)|0;c[(c[o>>2]|0)+(k<<2)>>2]=h;k=N(c[n>>2]|0,k)|0;Ha(a+20|0,((c[p>>2]|0)+-1&k)<<9|0,j|0,i|0);La(h|0,0,j|0,i|0);Mg(j);c[v>>2]=(c[v>>2]|0)+1;a=c[A>>2]|0;break}}else{f=vi(k|0,g|0,e|0,f|0)|0;f=qi(h|0,i|0,f|0,y|0)|0;e=e-f|0;e=(d|0)<(e|0)?d:e;f=f<<9;a=(c[u>>2]|0)+(a<<9)|0;d=e<<9;if(!(c[t>>2]|0))Ha(j|0,f|0,a|0,d|0);else La(j|0,f|0,a|0,d|0);a=(c[A>>2]|0)+e|0;c[A>>2]=a;j=m;j=pi(c[j>>2]|0,c[j+4>>2]|0,e|0,((e|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y}while(0);d=(c[z>>2]|0)-a|0;if(!d)break a}if((D|0)==23){l=E;return a|0}b=c[w>>2]|0;D=ff(b,g)|0;A=b+1104|0;z=A;z=pi(c[z>>2]|0,c[z+4>>2]|0,1,0)|0;c[A>>2]=z;c[A+4>>2]=y;c[C>>2]=b+8;c[C+4>>2]=g;fh(B,1024,16966,C)|0;ge(B,0,0,D,11,1)|0;D=1;l=E;return D|0}while(0);if(b|0){D=0;l=E;return D|0}db[c[x+1148>>2]&15](c[x+1152>>2]|0,0);D=0;l=E;return D|0}function kf(){var a=0;a=vf(2592)|0;c[a+2568>>2]=9;c[a+2572>>2]=10;c[a+2576>>2]=2;c[a+2580>>2]=5;return a|0}function lf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;i=c[a>>2]|0;if((i|0)>=32)ja(17207,17248,85,17256);if(!(((e|0)!=0|(f|0)!=0)&((e&4095|0)==0&0==0)))ja(17275,17248,86,17256);c[a>>2]=i+1;h=a+8+(i*80|0)|0;c[h>>2]=a;c[a+8+(i*80|0)+32>>2]=1;c[a+8+(i*80|0)+36>>2]=g&-5;j=a+8+(i*80|0)+8|0;c[j>>2]=b;c[j+4>>2]=d;b=a+8+(i*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(g&4|0)==0;j=a+8+(i*80|0)+24|0;c[j>>2]=b?e:0;c[j+4>>2]=b?f:0;j=a+8+(i*80|0)+40|0;c[j>>2]=0;b=a+8+(i*80|0)+48|0;c[b>>2]=0;d=vf(e)|0;c[j>>2]=d;if(!d){di(17325,29,1,c[3261]|0)|0;Da(1)}if(!(g&2))return h|0;f=Ai(e|0,f|0,12)|0;f=(f+31|0)>>>5<<2;g=a+8+(i*80|0)+44|0;c[g>>2]=f;j=a+8+(i*80|0)+60|0;c[j>>2]=0;c[a+8+(i*80|0)+52>>2]=vf(f)|0;c[a+8+(i*80|0)+56>>2]=vf(c[g>>2]|0)|0;c[b>>2]=c[a+8+(i*80|0)+52+(c[j>>2]<<2)>>2];return h|0}function mf(a,b){a=a|0;b=b|0;Mg(c[b+40>>2]|0);return}function nf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=b+48|0;i=c[h>>2]|0;f=b+44|0;d=c[f>>2]|0;g=d>>>2;a:do if(g){e=0;while(1){if(c[i+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>=g>>>0)break a}g=b+24|0;if(!((c[g>>2]|0)==0&(c[g+4>>2]|0)==0)){eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);d=c[f>>2]|0}}while(0);f=b+60|0;g=c[f>>2]^1;c[f>>2]=g;b=c[b+52+(g<<2)>>2]|0;c[h>>2]=b;Fi(b|0,0,d|0)|0;return i|0}function of(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=b+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!f){if(g)return;if(c[b+32>>2]|0)eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);e=b+8|0;c[e>>2]=0;c[e+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;return}if(!g?(f=b+8|0,(c[f>>2]|0)==(d|0)?(c[f+4>>2]|0)==(e|0):0):0)return;if(!(c[b+32>>2]|0))a=b+16|0;else{f=b+16|0;eb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[f>>2]|0);a=f}b=b+8|0;c[b>>2]=d;c[b+4>>2]=e;d=a;e=c[d+4>>2]|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;return}function pf(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)<=0){Mg(a);return}e=a+2572|0;d=0;do{if(c[a+8+(d*80|0)+32>>2]|0){db[c[e>>2]&15](a,a+8+(d*80|0)|0);b=c[a>>2]|0}d=d+1|0}while((d|0)<(b|0));Mg(a);return}function qf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=c[a>>2]|0;if((h|0)<=0){i=0;return i|0}e=0;while(1){f=a+8+(e*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(j=a+8+(e*80|0)+24|0,g=pi(c[j>>2]|0,c[j+4>>2]|0,g|0,f|0)|0,f=y,f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0):0)break;e=e+1|0;if((e|0)>=(h|0)){e=0;i=7;break}}if((i|0)==7)return e|0;j=a+8+(e*80|0)|0;return j|0}function rf(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;k=c[a>>2]|0;if((k|0)>=32)ja(17207,17248,197,17355);if(f>>>0<1|(f|0)==1&e>>>0<0){c[a>>2]=k+1;l=a+8+(k*80|0)|0;c[l>>2]=a;m=a+8+(k*80|0)+8|0;c[m>>2]=b;c[m+4>>2]=d;b=a+8+(k*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(j&16|0)==0;d=a+8+(k*80|0)+24|0;c[d>>2]=b?e:0;c[d+4>>2]=b?f:0;c[a+8+(k*80|0)+32>>2]=0;c[a+8+(k*80|0)+64>>2]=g;c[a+8+(k*80|0)+68>>2]=h;c[a+8+(k*80|0)+72>>2]=i;c[a+8+(k*80|0)+76>>2]=j;return l|0}else ja(17375,17248,198,17355);return 0}function sf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[a>>2]|0;if(c[a+32>>2]|0){gb[c[f+2580>>2]&7](f,a,b,d,e);return}h=a+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!e){if(g)return;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;d=h;c[d>>2]=0;c[d+4>>2]=0;return}f=a+8|0;if(!g?(e=f,(c[e>>2]|0)==(b|0)?(c[e+4>>2]|0)==(d|0):0):0)return;e=f;c[e>>2]=b;c[e+4>>2]=d;a=a+16|0;b=c[a+4>>2]|0;d=h;c[d>>2]=c[a>>2];c[d+4>>2]=b;return}function tf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=c[a>>2]|0;if((i|0)<=0){k=0;return k|0}h=0;while(1){f=a+8+(h*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(l=a+8+(h*80|0)+24|0,l=pi(c[l>>2]|0,c[l+4>>2]|0,g|0,f|0)|0,m=y,m>>>0>d>>>0|(m|0)==(d|0)&l>>>0>b>>>0):0)break;f=h+1|0;if((f|0)<(i|0))h=f;else{f=0;k=11;break}}if((k|0)==11)return f|0;if(!(c[a+8+(h*80|0)+32>>2]|0)){m=0;return m|0}f=qi(b|0,d|0,g|0,f|0)|0;if(e|0?(m=c[a+8+(h*80|0)+48>>2]|0,j=m+(f>>>17<<2)|0,m|0):0)c[j>>2]=c[j>>2]|1<<(f>>>12&31);m=(c[a+8+(h*80|0)+40>>2]|0)+f|0;return m|0}function uf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;return}function vf(a){a=a|0;var b=0;b=Lg(a)|0;if(!b){b=0;return b|0}Fi(b|0,0,a|0)|0;return b|0}function wf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=a[d>>0]|0;a:do if(f<<24>>24){while(1){if((a[b>>0]|0)!=f<<24>>24){b=0;break}b=b+1|0;d=d+1|0;f=a[d>>0]|0;if(!(f<<24>>24))break a}return b|0}while(0);if(!e){e=1;return e|0}c[e>>2]=b;e=1;return e|0}function xf(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function yf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+4|0;i=c[h>>2]|0;j=i+1|0;g=b+8|0;k=c[g>>2]|0;f=(k*3|0)>>>1;f=(j|0)>(f|0)?j:f;e=c[b>>2]|0;if(j>>>0>k>>>0){e=Ng(e,f)|0;c[b>>2]=e;c[g>>2]=f}a[e+i>>0]=d;if(j>>>0<=(c[h>>2]|0)>>>0)return;c[h>>2]=j;return}function zf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+4|0;h=c[g>>2]|0;i=_g(b)|0;j=i+h|0;f=a+8|0;k=c[f>>2]|0;e=(k*3|0)>>>1;e=(j|0)>(e|0)?j:e;d=c[a>>2]|0;if(j>>>0>k>>>0){d=Ng(d,e)|0;c[a>>2]=d;c[f>>2]=e}Ei(d+h|0,b|0,i|0)|0;if(j>>>0<=(c[g>>2]|0)>>>0)return;c[g>>2]=j;return}function Af(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;if(!((a|0)!=0&(e|0)!=0)){h=-1;return h|0}switch(b|0){case 128:case 192:case 256:break;default:{h=-2;return h|0}}g=(b|0)==128;do if(!g){f=e+240|0;if((b|0)==192){c[f>>2]=12;break}else{c[f>>2]=14;break}}else c[e+240>>2]=10;while(0);f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);c[e>>2]=f;c[e+4>>2]=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);c[e+8>>2]=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);c[e+12>>2]=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(g){a=0;do{g=c[e+12>>2]|0;f=c[16+((g>>>16&255)<<2)>>2]&-16777216^f^c[16+((g>>>8&255)<<2)>>2]&16711680^c[16+((g&255)<<2)>>2]&65280^c[16+(g>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];h=e;e=e+16|0;c[e>>2]=f;b=c[h+4>>2]^f;c[h+20>>2]=b;b=c[h+8>>2]^b;c[h+24>>2]=b;c[h+28>>2]=b^g;a=a+1|0}while((a|0)!=10);f=0;return f|0}c[e+16>>2]=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);c[e+20>>2]=(d[a+21>>0]|0)<<16|(d[a+20>>0]|0)<<24|(d[a+22>>0]|0)<<8|(d[a+23>>0]|0);if((b|0)==192){a=0;while(1){h=c[e+20>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+24|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+28>>2]=g;g=c[e+8>>2]^g;c[e+32>>2]=g;g=c[e+12>>2]^g;c[e+36>>2]=g;a=a+1|0;if((a|0)==8){f=0;break}g=c[e+16>>2]^g;c[e+40>>2]=g;c[e+44>>2]=g^h;e=b}return f|0}c[e+24>>2]=(d[a+25>>0]|0)<<16|(d[a+24>>0]|0)<<24|(d[a+26>>0]|0)<<8|(d[a+27>>0]|0);c[e+28>>2]=(d[a+29>>0]|0)<<16|(d[a+28>>0]|0)<<24|(d[a+30>>0]|0)<<8|(d[a+31>>0]|0);if((b|0)!=256){h=0;return h|0}a=0;while(1){h=c[e+28>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+32|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+36>>2]=g;g=c[e+8>>2]^g;c[e+40>>2]=g;g=c[e+12>>2]^g;c[e+44>>2]=g;a=a+1|0;if((a|0)==7){f=0;break}g=c[16+(g>>>24<<2)>>2]&-16777216^c[e+16>>2]^c[16+((g>>>16&255)<<2)>>2]&16711680^c[16+((g>>>8&255)<<2)>>2]&65280^c[16+((g&255)<<2)>>2]&255;c[e+48>>2]=g;g=c[e+20>>2]^g;c[e+52>>2]=g;g=c[e+24>>2]^g;c[e+56>>2]=g;c[e+60>>2]=g^h;e=b}return f|0}function Bf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=Af(a,b,d)|0;if((a|0)<0){d=a;return d|0}e=d+240|0;a=c[e>>2]|0;if((a|0)<=0){d=0;return d|0}a=a<<2;b=0;do{f=d+(b<<2)|0;g=c[f>>2]|0;h=d+(a<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|1)<<2)|0;g=c[h>>2]|0;f=d+((a|1)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;f=d+((b|2)<<2)|0;g=c[f>>2]|0;h=d+((a|2)<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|3)<<2)|0;g=c[h>>2]|0;f=d+((a|3)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;b=b+4|0;a=a+-4|0}while((b|0)<(a|0));if((c[e>>2]|0)<=1){h=0;return h|0}a=d;b=1;do{h=a;a=a+16|0;g=c[a>>2]|0;c[a>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];g=h+20|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];g=h+24|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];h=h+28|0;g=c[h>>2]|0;c[h>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];b=b+1|0}while((b|0)<(c[e>>2]|0));a=0;return a|0}function Cf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[6208+((h>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((i>>>8&255)<<2)>>2]^c[8256+((b&255)<<2)>>2]^c[n+16>>2];l=c[6208+((i>>>16&255)<<2)>>2]^c[5184+(h>>>24<<2)>>2]^c[7232+((b>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[n+20>>2];m=c[6208+((b>>>16&255)<<2)>>2]^c[5184+(i>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((h&255)<<2)>>2]^c[n+24>>2];g=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(b>>>24<<2)>>2]^c[7232+((h>>>8&255)<<2)>>2]^c[8256+((i&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[6208+((m>>>16&255)<<2)>>2]^c[5184+(l>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((k&255)<<2)>>2]^c[n+36>>2];q=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(m>>>24<<2)>>2]^c[7232+((k>>>8&255)<<2)>>2]^c[8256+((l&255)<<2)>>2]^c[n+40>>2];k=c[6208+((k>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((l>>>8&255)<<2)>>2]^c[8256+((m&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[6208+((l>>>16&255)<<2)>>2]^c[5184+(i<<2)>>2]^c[7232+((m>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[16+((l>>>16&255)<<2)>>2]&16711680|c[16+(i<<2)>>2]&-16777216|c[16+((m>>>8&255)<<2)>>2]&65280|c[16+((g&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[16+((m>>>16&255)<<2)>>2]&16711680|c[16+(l>>>24<<2)>>2]&-16777216|c[16+((g>>>8&255)<<2)>>2]&65280|c[16+((k&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[16+((g>>>16&255)<<2)>>2]&16711680|c[16+(m>>>24<<2)>>2]&-16777216|c[16+((k>>>8&255)<<2)>>2]&65280|c[16+((l&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[16+((k>>>16&255)<<2)>>2]&16711680|c[16+(g>>>24<<2)>>2]&-16777216|c[16+((l>>>8&255)<<2)>>2]&65280|c[16+((m&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Df(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[2112+((b>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((i>>>8&255)<<2)>>2]^c[4160+((h&255)<<2)>>2]^c[n+16>>2];l=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(h>>>24<<2)>>2]^c[3136+((b>>>8&255)<<2)>>2]^c[4160+((i&255)<<2)>>2]^c[n+20>>2];m=c[2112+((h>>>16&255)<<2)>>2]^c[1088+(i>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((b&255)<<2)>>2]^c[n+24>>2];g=c[2112+((i>>>16&255)<<2)>>2]^c[1088+(b>>>24<<2)>>2]^c[3136+((h>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[2112+((k>>>16&255)<<2)>>2]^c[1088+(l>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((m&255)<<2)>>2]^c[n+36>>2];q=c[2112+((l>>>16&255)<<2)>>2]^c[1088+(m>>>24<<2)>>2]^c[3136+((k>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+40>>2];k=c[2112+((m>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((l>>>8&255)<<2)>>2]^c[4160+((k&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(i<<2)>>2]^c[3136+((m>>>8&255)<<2)>>2]^c[4160+((l&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[9280+((g>>>16&255)<<2)>>2]&16711680|c[9280+(i<<2)>>2]&-16777216|c[9280+((m>>>8&255)<<2)>>2]&65280|c[9280+((l&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[9280+((k>>>16&255)<<2)>>2]&16711680|c[9280+(l>>>24<<2)>>2]&-16777216|c[9280+((g>>>8&255)<<2)>>2]&65280|c[9280+((m&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[9280+((l>>>16&255)<<2)>>2]&16711680|c[9280+(m>>>24<<2)>>2]&-16777216|c[9280+((k>>>8&255)<<2)>>2]&65280|c[9280+((g&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[9280+((m>>>16&255)<<2)>>2]&16711680|c[9280+(g>>>24<<2)>>2]&-16777216|c[9280+((l>>>8&255)<<2)>>2]&65280|c[9280+((k&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Ef(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=l;l=l+16|0;T=U;h=d>>>0>15;if(!g){if(h){i=d+-16|0;j=i&-16;A=j+16|0;g=b+A|0;k=f+1|0;m=f+2|0;n=f+3|0;o=f+4|0;p=f+5|0;q=f+6|0;r=f+7|0;s=f+8|0;t=f+9|0;u=f+10|0;v=f+11|0;w=f+12|0;x=f+13|0;y=f+14|0;z=f+15|0;h=b;b=c;while(1){S=T;Q=h;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Df(h,b,e);a[b>>0]=a[b>>0]^a[f>>0];S=b+1|0;a[S>>0]=a[S>>0]^a[k>>0];S=b+2|0;a[S>>0]=a[S>>0]^a[m>>0];S=b+3|0;a[S>>0]=a[S>>0]^a[n>>0];S=b+4|0;a[S>>0]=a[S>>0]^a[o>>0];S=b+5|0;a[S>>0]=a[S>>0]^a[p>>0];S=b+6|0;a[S>>0]=a[S>>0]^a[q>>0];S=b+7|0;a[S>>0]=a[S>>0]^a[r>>0];S=b+8|0;a[S>>0]=a[S>>0]^a[s>>0];S=b+9|0;a[S>>0]=a[S>>0]^a[t>>0];S=b+10|0;a[S>>0]=a[S>>0]^a[u>>0];S=b+11|0;a[S>>0]=a[S>>0]^a[v>>0];S=b+12|0;a[S>>0]=a[S>>0]^a[w>>0];S=b+13|0;a[S>>0]=a[S>>0]^a[x>>0];S=b+14|0;a[S>>0]=a[S>>0]^a[y>>0];S=b+15|0;a[S>>0]=a[S>>0]^a[z>>0];S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{h=h+16|0;b=b+16|0}}d=i-j|0;h=c+A|0}else{g=b;h=c}if(!d){l=U;return}S=T;Q=g;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Df(T,T,e);c=0;do{a[h+c>>0]=a[f+c>>0]^a[T+c>>0];c=c+1|0}while((c|0)!=(d|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}if(h){O=d+-16|0;i=O&-16;P=i+16|0;h=b+P|0;j=f+1|0;k=T+1|0;m=f+2|0;n=T+2|0;o=f+3|0;p=T+3|0;q=f+4|0;r=T+4|0;s=f+5|0;t=T+5|0;u=f+6|0;v=T+6|0;w=f+7|0;x=T+7|0;y=f+8|0;z=T+8|0;A=f+9|0;B=T+9|0;C=f+10|0;D=T+10|0;E=f+11|0;F=T+11|0;G=f+12|0;H=T+12|0;I=f+13|0;J=T+13|0;K=f+14|0;L=T+14|0;M=f+15|0;N=T+15|0;g=b;b=c;while(1){a[T>>0]=a[f>>0]^a[g>>0];a[k>>0]=a[j>>0]^a[g+1>>0];a[n>>0]=a[m>>0]^a[g+2>>0];a[p>>0]=a[o>>0]^a[g+3>>0];a[r>>0]=a[q>>0]^a[g+4>>0];a[t>>0]=a[s>>0]^a[g+5>>0];a[v>>0]=a[u>>0]^a[g+6>>0];a[x>>0]=a[w>>0]^a[g+7>>0];a[z>>0]=a[y>>0]^a[g+8>>0];a[B>>0]=a[A>>0]^a[g+9>>0];a[D>>0]=a[C>>0]^a[g+10>>0];a[F>>0]=a[E>>0]^a[g+11>>0];a[H>>0]=a[G>>0]^a[g+12>>0];a[J>>0]=a[I>>0]^a[g+13>>0];a[L>>0]=a[K>>0]^a[g+14>>0];a[N>>0]=a[M>>0]^a[g+15>>0];Cf(T,b,e);S=f;Q=b;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{g=g+16|0;b=b+16|0}}d=O-i|0;c=c+P|0}else h=b;if(!d){l=U;return}g=0;do{a[T+g>>0]=a[f+g>>0]^a[h+g>>0];g=g+1|0}while((g|0)!=(d|0));if(d>>>0<16)Ei(T+d|0,f+d|0,16-d|0)|0;Cf(T,T,e);S=c;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}function Ff(a){a=a|0;var b=0;c[a+40>>2]=0;b=a;c[b>>2]=0;c[b+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function Gf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=a+40|0;e=c[g>>2]|0;if(e>>>0>64)ra();i=a;f=c[i>>2]|0;i=c[i+4>>2]|0;h=pi(f|0,i|0,d|0,0)|0;j=y;if(j>>>0<i>>>0|(j|0)==(i|0)&h>>>0<f>>>0)ra();if(!d)return;f=a+44|0;while(1){if(!(d>>>0>63&(e|0)==0)){i=64-e|0;i=(d|0)<(i|0)?d:i;Ei(a+44+e|0,b|0,i|0)|0;j=(c[g>>2]|0)+i|0;c[g>>2]=j;e=b+i|0;d=d-i|0;if((j|0)==64){Hf(a,f);i=a;i=pi(c[i>>2]|0,c[i+4>>2]|0,512,0)|0;j=a;c[j>>2]=i;c[j+4>>2]=y;c[g>>2]=0}}else{Hf(a,b);j=a;j=pi(c[j>>2]|0,c[j+4>>2]|0,512,0)|0;e=a;c[e>>2]=j;c[e+4>>2]=y;e=b+64|0;d=d+-64|0}if(!d)break;b=e;e=c[g>>2]|0}return}function Hf(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+288|0;f=i+256|0;g=i;h=a+8|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];c[f+24>>2]=c[h+24>>2];c[f+28>>2]=c[h+28>>2];e=0;do{j=b+(e<<2)|0;c[g+(e<<2)>>2]=(d[j+1>>0]|0)<<16|(d[j>>0]|0)<<24|(d[j+2>>0]|0)<<8|(d[j+3>>0]|0);e=e+1|0}while((e|0)!=16);e=16;b=c[g>>2]|0;do{j=c[g+(e+-2<<2)>>2]|0;k=b;b=c[g+(e+-15<<2)>>2]|0;c[g+(e<<2)>>2]=k+(c[g+(e+-7<<2)>>2]|0)+((j>>>19|j<<13)^j>>>10^(j>>>17|j<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);j=f+28|0;q=f+16|0;r=c[q>>2]|0;b=f+24|0;s=c[b>>2]|0;v=f+20|0;e=c[v>>2]|0;k=(c[j>>2]|0)+1116352408+(c[g>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((e^s)&r^s)|0;t=c[f>>2]|0;u=f+4|0;o=c[u>>2]|0;w=f+8|0;n=c[w>>2]|0;m=f+12|0;p=k+(c[m>>2]|0)|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((o|t)&n|o&t)+k|0;c[j>>2]=k;s=s+1899447441+(c[g+4>>2]|0)+(p&(e^r)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=e+-1245643825+(c[g+8>>2]|0)+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=r+-373957723+(c[g+12>>2]|0)+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=p+961987163+(c[g+16>>2]|0)+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=n+1508970993+(c[g+20>>2]|0)+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+24>>2]|0)+-1841331548+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+28>>2]|0)+-1424204075+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+32>>2]|0)+-670586216+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+36>>2]|0)+310598401+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+40>>2]|0)+607225278+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+44>>2]|0)+1426881987+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+48>>2]|0)+1925078388+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+52>>2]|0)+-2132889090+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+56>>2]|0)+-1680079193+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+60>>2]|0)+-1046744716+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+64>>2]|0)+-459576895+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+68>>2]|0)+-272742522+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+72>>2]|0)+264347078+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+76>>2]|0)+604807628+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+80>>2]|0)+770255983+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+84>>2]|0)+1249150122+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+88>>2]|0)+1555081692+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+92>>2]|0)+1996064986+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+96>>2]|0)+-1740746414+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+100>>2]|0)+-1473132947+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+104>>2]|0)+-1341970488+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+108>>2]|0)+-1084653625+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+112>>2]|0)+-958395405+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+116>>2]|0)+-710438585+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+120>>2]|0)+113926993+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+124>>2]|0)+338241895+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+128>>2]|0)+666307205+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+132>>2]|0)+773529912+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+136>>2]|0)+1294757372+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+140>>2]|0)+1396182291+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+144>>2]|0)+1695183700+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+148>>2]|0)+1986661051+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+152>>2]|0)+-2117940946+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+156>>2]|0)+-1838011259+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+160>>2]|0)+-1564481375+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+164>>2]|0)+-1474664885+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+168>>2]|0)+-1035236496+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+172>>2]|0)+-949202525+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+176>>2]|0)+-778901479+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+180>>2]|0)+-694614492+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+184>>2]|0)+-200395387+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+188>>2]|0)+275423344+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+192>>2]|0)+430227734+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+196>>2]|0)+506948616+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+200>>2]|0)+659060556+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+204>>2]|0)+883997877+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+208>>2]|0)+958139571+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+212>>2]|0)+1322822218+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+216>>2]|0)+1537002063+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+220>>2]|0)+1747873779+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+224>>2]|0)+1955562222+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+228>>2]|0)+2024104815+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+232>>2]|0)+-2067236844+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+236>>2]|0)+-1933114872+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+240>>2]|0)+-1866530822+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+244>>2]|0)+-1538233109+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+248>>2]|0)+-1090935817+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;k=(c[g+252>>2]|0)+-965641998+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;g=k+r|0;c[q>>2]=g;k=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+k|0;c[f>>2]=k;c[h>>2]=k+(c[h>>2]|0);k=a+12|0;c[k>>2]=o+(c[k>>2]|0);k=a+16|0;c[k>>2]=n+(c[k>>2]|0);k=a+20|0;c[k>>2]=(c[m>>2]|0)+(c[k>>2]|0);k=a+24|0;c[k>>2]=g+(c[k>>2]|0);k=a+28|0;c[k>>2]=e+(c[k>>2]|0);k=a+32|0;c[k>>2]=(c[b>>2]|0)+(c[k>>2]|0);k=a+36|0;c[k>>2]=(c[j>>2]|0)+(c[k>>2]|0);l=i;return}function If(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=d+40|0;e=c[h>>2]|0;if(e>>>0>63)ra();i=d;i=pi(c[i>>2]|0,c[i+4>>2]|0,e<<3|0,0)|0;g=d;c[g>>2]=i;c[g+4>>2]=y;g=d+44|0;c[h>>2]=e+1;a[d+44+e>>0]=-128;e=c[h>>2]|0;if(e>>>0<=56){if((e|0)!=56)f=9}else{if(e>>>0<64)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<64);Hf(d,g);c[h>>2]=0;e=0;f=9}if((f|0)==9)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<56);h=d;i=c[h>>2]|0;h=c[h+4>>2]|0;f=Ai(i|0,h|0,56)|0;a[d+100>>0]=f;f=Ai(i|0,h|0,48)|0;a[d+101>>0]=f;f=Ai(i|0,h|0,40)|0;a[d+102>>0]=f;a[d+103>>0]=h;a[d+104>>0]=i>>>24;a[d+105>>0]=i>>>16;a[d+106>>0]=i>>>8;a[d+107>>0]=i;Hf(d,g);i=c[d+8>>2]|0;a[b>>0]=i>>>24;a[b+1>>0]=i>>>16;a[b+2>>0]=i>>>8;a[b+3>>0]=i;i=c[d+12>>2]|0;a[b+4>>0]=i>>>24;a[b+5>>0]=i>>>16;a[b+6>>0]=i>>>8;a[b+7>>0]=i;i=c[d+16>>2]|0;a[b+8>>0]=i>>>24;a[b+9>>0]=i>>>16;a[b+10>>0]=i>>>8;a[b+11>>0]=i;i=c[d+20>>2]|0;a[b+12>>0]=i>>>24;a[b+13>>0]=i>>>16;a[b+14>>0]=i>>>8;a[b+15>>0]=i;i=c[d+24>>2]|0;a[b+16>>0]=i>>>24;a[b+17>>0]=i>>>16;a[b+18>>0]=i>>>8;a[b+19>>0]=i;i=c[d+28>>2]|0;a[b+20>>0]=i>>>24;a[b+21>>0]=i>>>16;a[b+22>>0]=i>>>8;a[b+23>>0]=i;i=c[d+32>>2]|0;a[b+24>>0]=i>>>24;a[b+25>>0]=i>>>16;a[b+26>>0]=i>>>8;a[b+27>>0]=i;i=c[d+36>>2]|0;a[b+28>>0]=i>>>24;a[b+29>>0]=i>>>16;a[b+30>>0]=i>>>8;a[b+31>>0]=i;return}function Jf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+112|0;f=e;c[f+40>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[f+8>>2]=1779033703;c[f+12>>2]=-1150833019;c[f+16>>2]=1013904242;c[f+20>>2]=-1521486534;c[f+24>>2]=1359893119;c[f+28>>2]=-1694144372;c[f+32>>2]=528734635;c[f+36>>2]=1541459225;Gf(f,a,b);If(d,f);l=e;return}function Kf(b){b=b|0;var d=0;c[5288]=12968;c[5470]=b;b=21160;c[b>>2]=4096;c[b+4>>2]=0;a[21702]=3;a[21701]=64;a[21704]=2;b=21736;c[b>>2]=0;c[b+4>>2]=10;c[5448]=c[5448]|1315117;b=0;do{d=21888+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=25984+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;d=30080+(b<<4)|0;c[d>>2]=-1;c[d+4>>2]=-1;b=b+1|0}while((b|0)!=256);return 21152}function Lf(a){a=a|0;Mg(a);return}function Mf(b,d){b=b|0;d=d|0;var e=0,f=0;e=21712;e=pi(c[e>>2]|0,c[e+4>>2]|0,d|0,0)|0;f=y;if(!((c[5430]|0)==0&(d|0)>0))return;b=d;a:while(1){switch(a[21701]|0){case 32:{Uf(b);break}case 64:{Vf(b);break}default:{b=6;break a}}if(c[5430]|0){b=9;break}b=21712;b=qi(e|0,f|0,c[b>>2]|0,c[b+4>>2]|0)|0;if((b|0)<=0){b=9;break}}if((b|0)==6)ra();else if((b|0)==9)return}function Nf(a){a=a|0;a=a+560|0;y=c[a+4>>2]|0;return c[a>>2]|0}function Of(a,b){a=a|0;b=b|0;var d=0;d=a+648|0;b=c[d>>2]|b;c[d>>2]=b;d=a+568|0;if(!(c[d>>2]|0))return;if(!(c[a+644>>2]&b))return;c[d>>2]=0;return}function Pf(a,b){a=a|0;b=b|0;a=a+648|0;c[a>>2]=c[a>>2]&~b;return}function Qf(a){a=a|0;return c[a+648>>2]|0}function Rf(a){a=a|0;return c[a+568>>2]|0}function Sf(a){a=a|0;return c[a+640>>2]|0}function Tf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+d|0;d=0;do{f=a+4832+(d<<4)|0;h=f;g=c[h>>2]|0;if(!((g|0)==-1?(c[h+4>>2]|0)==-1:0)?(h=(c[a+4832+(d<<4)+8>>2]|0)+g|0,h>>>0>=b>>>0&e>>>0>h>>>0):0){h=f;c[h>>2]=-1;c[h+4>>2]=-1}d=d+1|0}while((d|0)!=256);return} +function Qh(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+1056|0;v=x+1024|0;w=x;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;c[v+24>>2]=0;c[v+28>>2]=0;f=a[e>>0]|0;a:do if(f<<24>>24){q=0;do{if(!(a[b+q>>0]|0)){f=0;break a}u=f&255;t=v+(u>>>5<<2)|0;c[t>>2]=c[t>>2]|1<<(u&31);q=q+1|0;c[w+(u<<2)>>2]=q;f=a[e+q>>0]|0}while(f<<24>>24!=0);n=q>>>0>1;if(n){k=1;j=1;m=0;i=-1;o=1;while(1){f=a[e+(j+i)>>0]|0;g=a[e+o>>0]|0;do if(f<<24>>24==g<<24>>24)if((j|0)==(k|0)){h=k;f=1;g=k+m|0;break}else{h=k;f=j+1|0;g=m;break}else if((f&255)>(g&255)){h=o-i|0;f=1;g=o;break}else{h=1;f=1;g=m+1|0;i=m;break}while(0);o=f+g|0;if(o>>>0>=q>>>0)break;else{k=h;j=f;m=g}}if(n){n=1;m=1;o=0;g=-1;p=1;while(1){f=a[e+(m+g)>>0]|0;j=a[e+p>>0]|0;do if(f<<24>>24==j<<24>>24)if((m|0)==(n|0)){f=n;j=1;k=n+o|0;break}else{f=n;j=m+1|0;k=o;break}else if((f&255)<(j&255)){f=p-g|0;j=1;k=p;break}else{f=1;j=1;k=o+1|0;g=o;break}while(0);p=j+k|0;if(p>>>0>=q>>>0){u=q;j=25;break}else{n=f;m=j;o=k}}}else{u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=0;f=1;g=-1;j=25}while(0);b:do if((j|0)==25){s=(g+1|0)>>>0>(i+1|0)>>>0;f=s?f:h;s=s?g:i;t=s+1|0;if(!(Rh(e,e+f|0,t)|0)){n=u-f|0;r=n;m=f}else{n=u-s+-1|0;n=(s>>>0>n>>>0?s:n)+1|0;r=0;m=n;n=u-n|0}o=u|63;p=u+-1|0;q=(r|0)!=0;f=b;k=0;g=b;while(1){h=f;do if((g-h|0)>>>0<u>>>0){i=dh(g,0,o)|0;if(i)if((i-h|0)>>>0<u>>>0){f=0;break b}else break;else{i=g+o|0;break}}else i=g;while(0);g=d[f+p>>0]|0;c:do if(!(1<<(g&31)&c[v+(g>>>5<<2)>>2])){h=0;g=u}else{g=u-(c[w+(g<<2)>>2]|0)|0;if(g|0){h=0;g=q&(k|0)!=0&g>>>0<m>>>0?n:g;break}j=t>>>0>k>>>0;g=j?t:k;h=a[e+g>>0]|0;d:do if(h<<24>>24){while(1){if(h<<24>>24!=(a[f+g>>0]|0))break;g=g+1|0;h=a[e+g>>0]|0;if(!(h<<24>>24))break d}h=0;g=g-s|0;break c}while(0);if(!j)break b;g=t;while(1){g=g+-1|0;if((a[e+g>>0]|0)!=(a[f+g>>0]|0)){h=r;g=m;break c}if(g>>>0<=k>>>0)break b}}while(0);f=f+g|0;k=h;g=i}}while(0);l=x;return f|0}function Rh(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;c=Vh(a,b,c,-1,0)|0;return c|0}function Th(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=Uh(a,b,f)|0;l=e;return d|0}function Uh(a,b,c){a=a|0;b=b|0;c=c|0;return gh(a,2147483647,b,c)|0}function Vh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;Wh(h,0);d=Xh(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function Wh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=e+b;else c[a+100>>2]=d;return}function Xh(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(Ug()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0}while((Zh(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=Yh(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0;if((i|32|0)!=120)if(j){o=8;n=47;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0;if((d[12689+i>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){Wh(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{o=16;n=47}}else{e=j?10:e;if(e>>>0>(d[12689+i>>0]|0)>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;Wh(b,0);c[(Ug()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;do{i=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;e=j+-48|0}while(e>>>0<10&i>>>0<429496729);if(e>>>0<10){m=0;do{f=vi(i|0,m|0,10,0)|0;k=y;l=((e|0)<0)<<31>>31;o=~l;if(k>>>0>o>>>0|(k|0)==(o|0)&f>>>0>~e>>>0){f=10;e=m;n=76;break c}i=pi(f|0,k|0,e|0,l|0)|0;m=y;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;e=j+-48|0}while(e>>>0<10&(m>>>0<429496729|(m|0)==429496729&i>>>0<2576980378));if(e>>>0>9){j=p;e=m}else{f=10;e=m;n=76}}else{j=p;e=0}}else{j=p;e=0;i=0}}else{o=e;n=47}while(0);d:do if((n|0)==47){if(!(o+-1&o)){n=a[19072+((o*23|0)>>>5&7)>>0]|0;f=a[12689+i>>0]|0;e=f&255;if(o>>>0>e>>>0){i=0;do{i=e|i<<n;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;f=a[12689+j>>0]|0;e=f&255}while(i>>>0<134217728&o>>>0>e>>>0);k=e;e=0}else{j=i;k=e;e=0;i=0}l=Ai(-1,-1,n|0)|0;m=y;if(o>>>0<=k>>>0|(m>>>0<e>>>0|(m|0)==(e|0)&l>>>0<i>>>0)){f=o;n=76;break}while(1){i=Bi(i|0,e|0,n|0)|0;e=y;i=i|f&255;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Yh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0|(e>>>0>m>>>0|(e|0)==(m|0)&i>>>0>l>>>0)){f=o;n=76;break d}}}e=a[12689+i>>0]|0;f=e&255;if(o>>>0>f>>>0){i=0;do{i=f+(N(i,o)|0)|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=Yh(b)|0;e=a[12689+j>>0]|0;f=e&255}while(i>>>0<119304647&o>>>0>f>>>0);k=e;e=0}else{j=i;k=e;i=0;e=0}if(o>>>0>f>>>0){m=xi(-1,-1,o|0,0)|0;n=y;f=k;while(1){if(e>>>0>n>>>0|(e|0)==(n|0)&i>>>0>m>>>0){f=o;n=76;break d}k=vi(i|0,e|0,o|0,0)|0;l=y;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=o;n=76;break d}i=pi(k|0,l|0,f|0,0)|0;e=y;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=Yh(b)|0;f=a[12689+j>>0]|0;if(o>>>0<=(f&255)>>>0){f=o;n=76;break}}}else{f=o;n=76}}while(0);if((n|0)==76)if(f>>>0>(d[12689+j>>0]|0)>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=Yh(b)|0}while(f>>>0>(d[12689+i>>0]|0)>>>0);c[(Ug()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else j=p;if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0<h>>>0|(e|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(Ug()|0)>>2]=34;g=pi(g|0,h|0,-1,-1)|0;h=y;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(Ug()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=qi(i^j|0,e^g|0,j|0,g|0)|0;h=y}while(0);y=h;return g|0}function Yh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=_h(b)|0;if((e|0)>=0){f=c[f>>2]|0;i=c[b+8>>2]|0;if(f){h=c[b+4>>2]|0;f=f-(c[b+108>>2]|0)|0;g=i;if((i-h|0)<(f|0))j=9;else c[b+100>>2]=h+(f+-1)}else{g=i;j=9}if((j|0)==9)c[b+100>>2]=i;f=b+4|0;if(!g)f=c[f>>2]|0;else{f=c[f>>2]|0;b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((e|0)!=(d[f>>0]|0|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function Zh(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function _h(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if(($h(a)|0)==0?(Xa[c[a+32>>2]&31](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function $h(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Xa[c[b+36>>2]&31](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function ai(a,b,c){a=a|0;b=b|0;c=c|0;c=Vh(a,b,c,-1,-1)|0;return c|0}function bi(a,b,c){a=a|0;b=b|0;c=c|0;c=Vh(a,b,c,-2147483648,0)|0;return c|0}function ci(a,b){a=a|0;b=b|0;var c=0;c=_g(a)|0;return ((di(a,1,c,b)|0)!=(c|0))<<31>>31|0}function di(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=N(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(jh(e)|0)==0;a=Gh(a,f,e)|0;if(!g)kh(e)}else a=Gh(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function ei(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(Hh(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0<h>>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((Xa[c[b+36>>2]&31](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function fi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=hh(a,b,f)|0;l=e;return d|0}function gi(a,b){a=a|0;b=b|0;return hh(c[3293]|0,a,b)|0}function hi(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=hh(c[3293]|0,a,e)|0;l=d;return b|0}function ii(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[d+76>>2]|0)>=0?(jh(d)|0)!=0:0){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(i=d+20|0,j=c[i>>2]|0,j>>>0<(c[d+16>>2]|0)>>>0):0){c[i>>2]=j+1;a[j>>0]=f}else e=ei(d,b)|0;kh(d)}else k=3;do if((k|0)==3){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=f;break}e=ei(d,b)|0}while(0);return e|0}function ji(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[3293]|0;if((c[f+76>>2]|0)>-1)g=jh(f)|0;else g=0;do if((ci(b,f)|0)<0)b=-1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(ei(f,10)|0)>>31}while(0);if(g|0)kh(f);return b|0}function ki(){ka(34808);return}function li(){return 34792}function mi(){return 34800}function ni(){return 34804}function oi(){}function pi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function qi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (y=d,a-c>>>0|0)|0}function ri(a){a=a|0;return (a?31-(Q(a^a-1)|0)|0:32)|0}function si(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (y=n,f)|0}else{if(!g){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (y=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (y=n,f)|0}g=h-1|0;if(g&h|0){i=(Q(h|0)|0)+33-(Q(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (y=o,p)|0}else{p=ri(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (y=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (y=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (y=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((ri(i|0)|0)>>>0);return (y=o,p)|0}g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (y=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (y=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=pi(m|0,l|0,-1,-1)|0;d=y;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;qi(k|0,d|0,e|0,n|0)|0;p=y;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=qi(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=y;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (y=o,p)|0}function ti(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=qi(j^a|0,i^b|0,j|0,i|0)|0;g=y;a=f^j;b=e^i;return qi((si(h,g,qi(f^c|0,e^d|0,f|0,e|0)|0,y,0)|0)^a|0,y^b|0,a|0,b|0)|0}function ui(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function vi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=ui(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function wi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;i=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;j=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=qi(h^a|0,g^b|0,h|0,g|0)|0;b=y;si(a,b,qi(k^d|0,j^e|0,k|0,j|0)|0,y,i)|0;e=qi(c[i>>2]^h|0,c[i+4>>2]^g|0,h|0,g|0)|0;d=y;l=f;return (y=d,e)|0}function xi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return si(a,b,c,d,0)|0}function yi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g|0;si(a,b,d,e,f)|0;l=g;return (y=c[f+4>>2]|0,c[f>>2]|0)|0}function zi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=(b|0)<0?-1:0;return b>>c-32|0}function Ai(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function Bi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}y=a<<c-32;return 0}function Ci(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Di(a,b,c){a=a|0;b=b|0;c=c|0;b=Q(b)|0;if((b|0)==32)b=b+(Q(a)|0)|0;y=0;return b|0}function Ei(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return za(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function Fi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function Gi(a){a=a|0;var b=0,d=0;d=c[i>>2]|0;b=d+a|0;if((a|0)>0&(b|0)<(d|0)|(b|0)<0){V()|0;la(12);return -1}c[i>>2]=b;if((b|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=d;la(12);return -1}return d|0}function Hi(a,b){a=a|0;b=b|0;return Va[a&15](b|0)|0}function Ii(a,b,c){a=a|0;b=b|0;c=c|0;return Wa[a&3](b|0,c|0)|0}function Ji(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Xa[a&31](b|0,c|0,d|0)|0}function Ki(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Ya[a&3](b|0,c|0,d|0,e|0)|0}function Li(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Za[a&7](b|0,c|0,d|0,e|0,f|0)|0}function Mi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return _a[a&15](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Ni(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return $a[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function Oi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return ab[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Pi(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;return bb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0,n|0,o|0,p|0,q|0)|0}function Qi(a,b){a=a|0;b=b|0;cb[a&15](b|0)}function Ri(a,b,c){a=a|0;b=b|0;c=c|0;db[a&15](b|0,c|0)}function Si(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;eb[a&15](b|0,c|0,d|0)}function Ti(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;fb[a&31](b|0,c|0,d|0,e|0)}function Ui(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;gb[a&7](b|0,c|0,d|0,e|0,f|0)}function Vi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;hb[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function Wi(a){a=a|0;R(0);return 0}function Xi(a,b){a=a|0;b=b|0;R(1);return 0}function Yi(a,b,c){a=a|0;b=b|0;c=c|0;R(2);return 0}function Zi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(3);return 0}function _i(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(4);return 0}function $i(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(5);return 0}function aj(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;R(6);return 0}function bj(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;R(7);return 0}function cj(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;R(8);return 0}function dj(a){a=a|0;R(9)}function ej(a,b){a=a|0;b=b|0;R(10)}function fj(a,b,c){a=a|0;b=b|0;c=c|0;R(11)}function gj(a,b,c){a=a|0;b=b|0;c=c|0;ua(a|0,b|0,c|0)}function hj(a,b,c){a=a|0;b=b|0;c=c|0;Qa(a|0,b|0,c|0)}function ij(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(12)}function jj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(13)}function kj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(14)} + +// EMSCRIPTEN_END_FUNCS +var Va=[Wi,Kf,Nf,Qf,Rf,Sf,dg,hg,Qg,Qc,bf,Wi,Wi,Wi,Wi,Wi];var Wa=[Xi,fg,nf,Xi];var Xa=[Yi,Rg,Sg,Wg,Ih,Bb,zc,Ac,Dc,Fc,vd,Gd,Hd,Id,Sd,me,lg,ng,qg,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi,Yi];var Ya=[Zi,Bd,Ed,Zi];var Za=[_i,xc,Pc,Yc,bd,ed,Fd,_i];var _a=[$i,qd,rd,sd,td,yd,zd,Ad,Cd,lf,$i,$i,$i,$i,$i,$i];var $a=[aj,ud,cf,df];var ab=[bj,Dd];var bb=[cj,wd];var cb=[dj,Lf,cg,eg,wb,zb,Ab,xb,cd,nd,dj,dj,dj,dj,dj,dj];var db=[ej,Mf,Of,Pf,gg,Lc,Sc,od,pd,xd,mf,ej,ej,ej,ej,ej];var eb=[fj,Tf,jg,gj,hj,Rc,Ie,Ke,kg,pg,Dg,Gg,fj,fj,fj,fj];var fb=[ij,Bc,Cc,Ec,hd,Td,_d,de,ee,ne,ef,gf,hf,mg,og,rg,Eg,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij,ij];var gb=[jj,ig,Md,Wd,Yd,of,jj,jj];var hb=[kj,yb];return{___divdi3:ti,___emscripten_environ_constructor:ki,___muldi3:vi,___remdi3:wi,___udivdi3:xi,___uremdi3:yi,__get_daylight:mi,__get_timezone:ni,__get_tzname:li,_bitshift64Ashr:zi,_bitshift64Lshr:Ai,_bitshift64Shl:Bi,_console_queue_char:pb,_display_key_event:qb,_display_mouse_event:rb,_display_wheel_event:sb,_free:Mg,_fs_import_file:be,_i64Add:pi,_i64Subtract:qi,_llvm_bswap_i32:Ci,_llvm_ctlz_i64:Di,_malloc:Lg,_memcpy:Ei,_memset:Fi,_net_set_carrier:ub,_net_write_packet:tb,_sbrk:Gi,_vm_start:vb,dynCall_ii:Hi,dynCall_iii:Ii,dynCall_iiii:Ji,dynCall_iiiii:Ki,dynCall_iiiiii:Li,dynCall_iiiiiii:Mi,dynCall_iiiiiiii:Ni,dynCall_iiiiiiiii:Oi,dynCall_iiiiiiiiiiiiiiiii:Pi,dynCall_vi:Qi,dynCall_vii:Ri,dynCall_viii:Si,dynCall_viiii:Ti,dynCall_viiiii:Ui,dynCall_viiiiii:Vi,establishStackSpace:lb,getTempRet0:ob,runPostSets:oi,setTempRet0:nb,setThrew:mb,stackAlloc:ib,stackRestore:kb,stackSave:jb}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=asm["___emscripten_environ_constructor"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___remdi3=Module["___remdi3"]=asm["___remdi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var __get_daylight=Module["__get_daylight"]=asm["__get_daylight"];var __get_timezone=Module["__get_timezone"]=asm["__get_timezone"];var __get_tzname=Module["__get_tzname"]=asm["__get_tzname"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _console_queue_char=Module["_console_queue_char"]=asm["_console_queue_char"];var _display_key_event=Module["_display_key_event"]=asm["_display_key_event"];var _display_mouse_event=Module["_display_mouse_event"]=asm["_display_mouse_event"];var _display_wheel_event=Module["_display_wheel_event"]=asm["_display_wheel_event"];var _free=Module["_free"]=asm["_free"];var _fs_import_file=Module["_fs_import_file"]=asm["_fs_import_file"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _llvm_ctlz_i64=Module["_llvm_ctlz_i64"]=asm["_llvm_ctlz_i64"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memset=Module["_memset"]=asm["_memset"];var _net_set_carrier=Module["_net_set_carrier"]=asm["_net_set_carrier"];var _net_write_packet=Module["_net_write_packet"]=asm["_net_write_packet"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _vm_start=Module["_vm_start"]=asm["_vm_start"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=asm["dynCall_iiiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=asm["dynCall_iiiiiiiiiiiiiiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + + diff --git a/jslinux-2019-12-21/root-riscv64.bin b/jslinux-2019-12-21/root-riscv64.bin Binary files differnew file mode 100644 index 0000000..4942c6d --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64.bin diff --git a/jslinux-2019-12-21/root-riscv64.cfg b/jslinux-2019-12-21/root-riscv64.cfg new file mode 100644 index 0000000..e1349e2 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64.cfg @@ -0,0 +1,11 @@ +/* VM configuration file */ +{ + version: 1, + machine: "riscv64", + memory_size: 128, + bios: "bbl64.bin", + kernel: "kernel-riscv64.bin", + cmdline: "console=hvc0 root=/dev/vda rw", + drive0: { file: "root-riscv64/blk.txt" }, + eth0: { driver: "user" }, +} diff --git a/jslinux-2019-12-21/root-riscv64/blk.txt b/jslinux-2019-12-21/root-riscv64/blk.txt new file mode 100644 index 0000000..a2a6be7 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk.txt @@ -0,0 +1,4 @@ +{ + block_size: 256, + n_block: 16, +} diff --git a/jslinux-2019-12-21/root-riscv64/blk000000000.bin b/jslinux-2019-12-21/root-riscv64/blk000000000.bin Binary files differnew file mode 100644 index 0000000..f88afd7 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000000.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000001.bin b/jslinux-2019-12-21/root-riscv64/blk000000001.bin Binary files differnew file mode 100644 index 0000000..d3e69e5 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000001.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000002.bin b/jslinux-2019-12-21/root-riscv64/blk000000002.bin Binary files differnew file mode 100644 index 0000000..0dd2407 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000002.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000003.bin b/jslinux-2019-12-21/root-riscv64/blk000000003.bin Binary files differnew file mode 100644 index 0000000..c15dbab --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000003.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000004.bin b/jslinux-2019-12-21/root-riscv64/blk000000004.bin Binary files differnew file mode 100644 index 0000000..fff7fb1 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000004.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000005.bin b/jslinux-2019-12-21/root-riscv64/blk000000005.bin Binary files differnew file mode 100644 index 0000000..7dbe2c9 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000005.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000006.bin b/jslinux-2019-12-21/root-riscv64/blk000000006.bin Binary files differnew file mode 100644 index 0000000..3db4829 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000006.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000007.bin b/jslinux-2019-12-21/root-riscv64/blk000000007.bin Binary files differnew file mode 100644 index 0000000..5fbf56f --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000007.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000008.bin b/jslinux-2019-12-21/root-riscv64/blk000000008.bin Binary files differnew file mode 100644 index 0000000..c5f642b --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000008.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000009.bin b/jslinux-2019-12-21/root-riscv64/blk000000009.bin Binary files differnew file mode 100644 index 0000000..36a07d8 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000009.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000010.bin b/jslinux-2019-12-21/root-riscv64/blk000000010.bin Binary files differnew file mode 100644 index 0000000..d865802 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000010.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000011.bin b/jslinux-2019-12-21/root-riscv64/blk000000011.bin Binary files differnew file mode 100644 index 0000000..af39dc1 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000011.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000012.bin b/jslinux-2019-12-21/root-riscv64/blk000000012.bin Binary files differnew file mode 100644 index 0000000..b53ced0 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000012.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000013.bin b/jslinux-2019-12-21/root-riscv64/blk000000013.bin Binary files differnew file mode 100644 index 0000000..4c1632c --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000013.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000014.bin b/jslinux-2019-12-21/root-riscv64/blk000000014.bin Binary files differnew file mode 100644 index 0000000..89f5642 --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000014.bin diff --git a/jslinux-2019-12-21/root-riscv64/blk000000015.bin b/jslinux-2019-12-21/root-riscv64/blk000000015.bin Binary files differnew file mode 100644 index 0000000..2e67caf --- /dev/null +++ b/jslinux-2019-12-21/root-riscv64/blk000000015.bin diff --git a/jslinux-2019-12-21/root-x86.bin b/jslinux-2019-12-21/root-x86.bin Binary files differnew file mode 100644 index 0000000..a483489 --- /dev/null +++ b/jslinux-2019-12-21/root-x86.bin diff --git a/jslinux-2019-12-21/root-x86.bin.orig b/jslinux-2019-12-21/root-x86.bin.orig Binary files differnew file mode 100644 index 0000000..8782717 --- /dev/null +++ b/jslinux-2019-12-21/root-x86.bin.orig diff --git a/jslinux-2019-12-21/root-x86.cfg b/jslinux-2019-12-21/root-x86.cfg new file mode 100644 index 0000000..7b391ba --- /dev/null +++ b/jslinux-2019-12-21/root-x86.cfg @@ -0,0 +1,10 @@ +/* VM configuration file */ +{ + version: 1, + machine: "pc", + memory_size: 128, + kernel: "kernel-x86.bin", + cmdline: "loglevel=3 console=hvc0 root=/dev/vda init=/bin/ash rw", + drive0: { file: "root-x86/blk.txt" }, + eth0: { driver: "user" }, +} diff --git a/jslinux-2019-12-21/root-x86/blk.txt b/jslinux-2019-12-21/root-x86/blk.txt new file mode 100644 index 0000000..65791bb --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk.txt @@ -0,0 +1,4 @@ +{ + block_size: 2048, + n_block: 25, +} diff --git a/jslinux-2019-12-21/root-x86/blk000000000.bin b/jslinux-2019-12-21/root-x86/blk000000000.bin Binary files differnew file mode 100644 index 0000000..c71e322 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000000.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000001.bin b/jslinux-2019-12-21/root-x86/blk000000001.bin Binary files differnew file mode 100644 index 0000000..ac5b9eb --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000001.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000002.bin b/jslinux-2019-12-21/root-x86/blk000000002.bin Binary files differnew file mode 100644 index 0000000..32d1f73 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000002.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000003.bin b/jslinux-2019-12-21/root-x86/blk000000003.bin Binary files differnew file mode 100644 index 0000000..3301331 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000003.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000004.bin b/jslinux-2019-12-21/root-x86/blk000000004.bin Binary files differnew file mode 100644 index 0000000..9b94ccb --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000004.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000005.bin b/jslinux-2019-12-21/root-x86/blk000000005.bin Binary files differnew file mode 100644 index 0000000..178a4a3 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000005.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000006.bin b/jslinux-2019-12-21/root-x86/blk000000006.bin Binary files differnew file mode 100644 index 0000000..8464bbd --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000006.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000007.bin b/jslinux-2019-12-21/root-x86/blk000000007.bin Binary files differnew file mode 100644 index 0000000..3301331 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000007.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000008.bin b/jslinux-2019-12-21/root-x86/blk000000008.bin Binary files differnew file mode 100644 index 0000000..60fda4f --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000008.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000009.bin b/jslinux-2019-12-21/root-x86/blk000000009.bin Binary files differnew file mode 100644 index 0000000..d785f99 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000009.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000010.bin b/jslinux-2019-12-21/root-x86/blk000000010.bin Binary files differnew file mode 100644 index 0000000..338f6e1 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000010.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000011.bin b/jslinux-2019-12-21/root-x86/blk000000011.bin Binary files differnew file mode 100644 index 0000000..3301331 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000011.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000012.bin b/jslinux-2019-12-21/root-x86/blk000000012.bin Binary files differnew file mode 100644 index 0000000..6a3a70c --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000012.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000013.bin b/jslinux-2019-12-21/root-x86/blk000000013.bin Binary files differnew file mode 100644 index 0000000..3301331 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000013.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000014.bin b/jslinux-2019-12-21/root-x86/blk000000014.bin Binary files differnew file mode 100644 index 0000000..9baa771 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000014.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000015.bin b/jslinux-2019-12-21/root-x86/blk000000015.bin Binary files differnew file mode 100644 index 0000000..05f9258 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000015.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000016.bin b/jslinux-2019-12-21/root-x86/blk000000016.bin Binary files differnew file mode 100644 index 0000000..e5e0c64 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000016.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000017.bin b/jslinux-2019-12-21/root-x86/blk000000017.bin Binary files differnew file mode 100644 index 0000000..6001d11 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000017.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000018.bin b/jslinux-2019-12-21/root-x86/blk000000018.bin Binary files differnew file mode 100644 index 0000000..3301331 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000018.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000019.bin b/jslinux-2019-12-21/root-x86/blk000000019.bin Binary files differnew file mode 100644 index 0000000..d740e1e --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000019.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000020.bin b/jslinux-2019-12-21/root-x86/blk000000020.bin Binary files differnew file mode 100644 index 0000000..9eef5bc --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000020.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000021.bin b/jslinux-2019-12-21/root-x86/blk000000021.bin Binary files differnew file mode 100644 index 0000000..08d5daf --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000021.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000022.bin b/jslinux-2019-12-21/root-x86/blk000000022.bin Binary files differnew file mode 100644 index 0000000..6f362b7 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000022.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000023.bin b/jslinux-2019-12-21/root-x86/blk000000023.bin Binary files differnew file mode 100644 index 0000000..3301331 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000023.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000024.bin b/jslinux-2019-12-21/root-x86/blk000000024.bin Binary files differnew file mode 100644 index 0000000..ada4ca1 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000024.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000025.bin b/jslinux-2019-12-21/root-x86/blk000000025.bin Binary files differnew file mode 100644 index 0000000..fbc2212 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000025.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000026.bin b/jslinux-2019-12-21/root-x86/blk000000026.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000026.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000027.bin b/jslinux-2019-12-21/root-x86/blk000000027.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000027.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000028.bin b/jslinux-2019-12-21/root-x86/blk000000028.bin Binary files differnew file mode 100644 index 0000000..44f596e --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000028.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000029.bin b/jslinux-2019-12-21/root-x86/blk000000029.bin Binary files differnew file mode 100644 index 0000000..550b8ed --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000029.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000030.bin b/jslinux-2019-12-21/root-x86/blk000000030.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000030.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000031.bin b/jslinux-2019-12-21/root-x86/blk000000031.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000031.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000032.bin b/jslinux-2019-12-21/root-x86/blk000000032.bin Binary files differnew file mode 100644 index 0000000..c4112d8 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000032.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000033.bin b/jslinux-2019-12-21/root-x86/blk000000033.bin Binary files differnew file mode 100644 index 0000000..0d990c3 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000033.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000034.bin b/jslinux-2019-12-21/root-x86/blk000000034.bin Binary files differnew file mode 100644 index 0000000..d387f2d --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000034.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000035.bin b/jslinux-2019-12-21/root-x86/blk000000035.bin Binary files differnew file mode 100644 index 0000000..deef736 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000035.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000036.bin b/jslinux-2019-12-21/root-x86/blk000000036.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000036.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000037.bin b/jslinux-2019-12-21/root-x86/blk000000037.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000037.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000038.bin b/jslinux-2019-12-21/root-x86/blk000000038.bin Binary files differnew file mode 100644 index 0000000..ea2d51a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000038.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000039.bin b/jslinux-2019-12-21/root-x86/blk000000039.bin Binary files differnew file mode 100644 index 0000000..7de6988 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000039.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000040.bin b/jslinux-2019-12-21/root-x86/blk000000040.bin Binary files differnew file mode 100644 index 0000000..894ba25 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000040.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000041.bin b/jslinux-2019-12-21/root-x86/blk000000041.bin Binary files differnew file mode 100644 index 0000000..0f41954 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000041.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000042.bin b/jslinux-2019-12-21/root-x86/blk000000042.bin Binary files differnew file mode 100644 index 0000000..440277b --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000042.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000043.bin b/jslinux-2019-12-21/root-x86/blk000000043.bin Binary files differnew file mode 100644 index 0000000..da772d8 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000043.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000044.bin b/jslinux-2019-12-21/root-x86/blk000000044.bin Binary files differnew file mode 100644 index 0000000..ca05e30 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000044.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000045.bin b/jslinux-2019-12-21/root-x86/blk000000045.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000045.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000046.bin b/jslinux-2019-12-21/root-x86/blk000000046.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000046.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000047.bin b/jslinux-2019-12-21/root-x86/blk000000047.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000047.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000048.bin b/jslinux-2019-12-21/root-x86/blk000000048.bin Binary files differnew file mode 100644 index 0000000..2eee8a3 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000048.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000049.bin b/jslinux-2019-12-21/root-x86/blk000000049.bin Binary files differnew file mode 100644 index 0000000..9e0f96a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000049.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000050.bin b/jslinux-2019-12-21/root-x86/blk000000050.bin Binary files differnew file mode 100644 index 0000000..5c2339d --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000050.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000051.bin b/jslinux-2019-12-21/root-x86/blk000000051.bin Binary files differnew file mode 100644 index 0000000..d6a37c8 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000051.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000052.bin b/jslinux-2019-12-21/root-x86/blk000000052.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000052.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000053.bin b/jslinux-2019-12-21/root-x86/blk000000053.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000053.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000054.bin b/jslinux-2019-12-21/root-x86/blk000000054.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000054.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000055.bin b/jslinux-2019-12-21/root-x86/blk000000055.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000055.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000056.bin b/jslinux-2019-12-21/root-x86/blk000000056.bin Binary files differnew file mode 100644 index 0000000..d9233d8 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000056.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000057.bin b/jslinux-2019-12-21/root-x86/blk000000057.bin Binary files differnew file mode 100644 index 0000000..d0c7f05 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000057.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000058.bin b/jslinux-2019-12-21/root-x86/blk000000058.bin Binary files differnew file mode 100644 index 0000000..db4367a --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000058.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000059.bin b/jslinux-2019-12-21/root-x86/blk000000059.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000059.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000060.bin b/jslinux-2019-12-21/root-x86/blk000000060.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000060.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000061.bin b/jslinux-2019-12-21/root-x86/blk000000061.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000061.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000062.bin b/jslinux-2019-12-21/root-x86/blk000000062.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000062.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000063.bin b/jslinux-2019-12-21/root-x86/blk000000063.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000063.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000064.bin b/jslinux-2019-12-21/root-x86/blk000000064.bin Binary files differnew file mode 100644 index 0000000..f3577c9 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000064.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000065.bin b/jslinux-2019-12-21/root-x86/blk000000065.bin Binary files differnew file mode 100644 index 0000000..50d2b31 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000065.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000066.bin b/jslinux-2019-12-21/root-x86/blk000000066.bin Binary files differnew file mode 100644 index 0000000..188d2e6 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000066.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000067.bin b/jslinux-2019-12-21/root-x86/blk000000067.bin Binary files differnew file mode 100644 index 0000000..ae605d8 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000067.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000068.bin b/jslinux-2019-12-21/root-x86/blk000000068.bin Binary files differnew file mode 100644 index 0000000..39785a2 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000068.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000069.bin b/jslinux-2019-12-21/root-x86/blk000000069.bin Binary files differnew file mode 100644 index 0000000..c31853c --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000069.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000070.bin b/jslinux-2019-12-21/root-x86/blk000000070.bin Binary files differnew file mode 100644 index 0000000..f01bfbf --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000070.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000071.bin b/jslinux-2019-12-21/root-x86/blk000000071.bin Binary files differnew file mode 100644 index 0000000..e6e9cba --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000071.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000072.bin b/jslinux-2019-12-21/root-x86/blk000000072.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000072.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000073.bin b/jslinux-2019-12-21/root-x86/blk000000073.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000073.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000074.bin b/jslinux-2019-12-21/root-x86/blk000000074.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000074.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000075.bin b/jslinux-2019-12-21/root-x86/blk000000075.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000075.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000076.bin b/jslinux-2019-12-21/root-x86/blk000000076.bin Binary files differnew file mode 100644 index 0000000..3f4e16c --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000076.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000077.bin b/jslinux-2019-12-21/root-x86/blk000000077.bin Binary files differnew file mode 100644 index 0000000..3449fb9 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000077.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000078.bin b/jslinux-2019-12-21/root-x86/blk000000078.bin Binary files differnew file mode 100644 index 0000000..66a4f35 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000078.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000079.bin b/jslinux-2019-12-21/root-x86/blk000000079.bin Binary files differnew file mode 100644 index 0000000..2822aec --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000079.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000080.bin b/jslinux-2019-12-21/root-x86/blk000000080.bin Binary files differnew file mode 100644 index 0000000..5381d8f --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000080.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000081.bin b/jslinux-2019-12-21/root-x86/blk000000081.bin Binary files differnew file mode 100644 index 0000000..61e96a3 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000081.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000082.bin b/jslinux-2019-12-21/root-x86/blk000000082.bin Binary files differnew file mode 100644 index 0000000..855a4cb --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000082.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000083.bin b/jslinux-2019-12-21/root-x86/blk000000083.bin Binary files differnew file mode 100644 index 0000000..58e79c3 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000083.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000084.bin b/jslinux-2019-12-21/root-x86/blk000000084.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000084.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000085.bin b/jslinux-2019-12-21/root-x86/blk000000085.bin Binary files differnew file mode 100644 index 0000000..41ce963 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000085.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000086.bin b/jslinux-2019-12-21/root-x86/blk000000086.bin Binary files differnew file mode 100644 index 0000000..8536003 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000086.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000087.bin b/jslinux-2019-12-21/root-x86/blk000000087.bin Binary files differnew file mode 100644 index 0000000..5e753bc --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000087.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000088.bin b/jslinux-2019-12-21/root-x86/blk000000088.bin Binary files differnew file mode 100644 index 0000000..f0a23d9 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000088.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000089.bin b/jslinux-2019-12-21/root-x86/blk000000089.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000089.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000090.bin b/jslinux-2019-12-21/root-x86/blk000000090.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000090.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000091.bin b/jslinux-2019-12-21/root-x86/blk000000091.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000091.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000092.bin b/jslinux-2019-12-21/root-x86/blk000000092.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000092.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000093.bin b/jslinux-2019-12-21/root-x86/blk000000093.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000093.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000094.bin b/jslinux-2019-12-21/root-x86/blk000000094.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000094.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000095.bin b/jslinux-2019-12-21/root-x86/blk000000095.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000095.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000096.bin b/jslinux-2019-12-21/root-x86/blk000000096.bin Binary files differnew file mode 100644 index 0000000..39d064f --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000096.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000097.bin b/jslinux-2019-12-21/root-x86/blk000000097.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000097.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000098.bin b/jslinux-2019-12-21/root-x86/blk000000098.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000098.bin diff --git a/jslinux-2019-12-21/root-x86/blk000000099.bin b/jslinux-2019-12-21/root-x86/blk000000099.bin Binary files differnew file mode 100644 index 0000000..8dd9b32 --- /dev/null +++ b/jslinux-2019-12-21/root-x86/blk000000099.bin diff --git a/jslinux-2019-12-21/splitimg b/jslinux-2019-12-21/splitimg Binary files differnew file mode 100755 index 0000000..8c2f617 --- /dev/null +++ b/jslinux-2019-12-21/splitimg diff --git a/jslinux-2019-12-21/style.css b/jslinux-2019-12-21/style.css new file mode 100644 index 0000000..9d39504 --- /dev/null +++ b/jslinux-2019-12-21/style.css @@ -0,0 +1,41 @@ +.term { + font-family: courier,fixed,swiss,monospace,sans-serif; + font-size: 15px; + color: #f0f0f0; + background: #000000; +} + +.term_content a { + color: #ffff00; +} + +.term_cursor { + color: #000000; + background: #00ff00; +} + +.term_scrollbar { background: transparent url(images/bg-scrollbar-track-y.png) no-repeat 0 0; position: relative; background-position: 0 0; float: right; width: 15px; height: 100%; } +.term_track { background: transparent url(images/bg-scrollbar-trackend-y.png) no-repeat 0 100%; height: 100%; width:13px; position: relative; padding: 0 1px; } +.term_thumb { background: transparent url(images/bg-scrollbar-thumb-y.png) no-repeat 50% 100%; height: 20px; width: 25px; cursor: pointer; overflow: hidden; position: absolute; top: 0; left: -5px; } +.term_thumb .term_end { background: transparent url(images/bg-scrollbar-thumb-y.png) no-repeat 50% 0; overflow: hidden; height: 5px; width: 25px; } +.noSelect { user-select: none; -o-user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; } +#term_paste { + border: 1px solid; + height: 19px; +} + +/* file import */ +#files { + visibility: hidden; + width:1px; + height:1px; + padding: 0px; + margin: 0px; + bordex: 0px; +} + +label { + cursor: pointer; + margin-left: 5px; + margin-right: 5px; +} diff --git a/jslinux-2019-12-21/term.js b/jslinux-2019-12-21/term.js new file mode 100644 index 0000000..1a9ca6c --- /dev/null +++ b/jslinux-2019-12-21/term.js @@ -0,0 +1,1251 @@ +/* + * Javascript terminal + * + * Copyright (c) 2011-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +"use strict"; + +function Term(width, height, handler, tot_height) +{ + this.w = width; + this.h = height; + + this.cur_h = height; /* current height of the scroll back buffer */ + if (!tot_height || tot_height < height) + tot_height = height; + this.tot_h = tot_height; /* maximum height of the scroll back buffer */ + this.y_base = 0; /* position of the current top screen line in the + * scroll back buffer */ + this.y_disp = 0; /* position of the top displayed line in the + * scroll back buffer */ + /* cursor position */ + this.x = 0; + this.y = 0; + this.scroll_top = 0; + this.scroll_bottom = this.h; + this.cursorstate = 0; + this.handler = handler; + this.state = 0; + this.output_queue = ""; + this.colors = [ + /* normal */ + "#000000", + "#aa0000", + "#00aa00", + "#aa5500", + "#0000aa", + "#aa00aa", + "#00aaaa", + "#aaaaaa", + /* bright */ + "#555555", + "#ff5555", + "#55ff55", + "#ffff55", + "#5555ff", + "#ff55ff", + "#55ffff", + "#ffffff" + ]; + /* attributes bits: + 0-3: bg + 4-7: fg + 8: bold + 9: inverse + */ + this.def_attr = (7 << 4) | 0; + this.cur_attr = this.def_attr; + this.is_mac = (navigator.userAgent.indexOf("Mac") >=0 ) ? true : false; + this.key_rep_state = 0; + this.key_rep_str = ""; + + this.utf8 = true; + this.utf8_state = 0; + this.utf8_val = 0; + + this.application_cursor = false; + this.application_keypad = false; + /* if true, emulate some behaviors of the Linux console */ + this.linux_console = true; +} + +Term.prototype.open = function(parent_el, textarea_el) +{ + var y, line, i, term, c, row_el; + + /* set initial content */ + this.lines = new Array(); + c = 32 | (this.def_attr << 16); + for(y = 0; y < this.cur_h;y++) { + line = new Array(); + for(i=0;i<this.w;i++) + line[i] = c; + this.lines[y] = line; + } + + /* create the terminal window */ + this.term_el = document.createElement("div"); + this.term_el.className = "term"; + this.term_el.style.lineHeight = "1.2em"; + /* XXX: could compute the font metrics */ + this.term_el.style.width = "calc(" + this.w + "ch + 16px)"; + this.term_el.style.height = (this.h * 1.2) + "em"; + + /* scroll bar */ + this.scrollbar_el = document.createElement("div"); + this.scrollbar_el.className = "term_scrollbar"; + this.term_el.appendChild(this.scrollbar_el); + + this.track_el = document.createElement("div"); + this.track_el.className = "term_track"; + this.track_el.onmousedown = this.mouseMoveHandler.bind(this); + this.scrollbar_el.appendChild(this.track_el); + + this.thumb_el = document.createElement("div"); + this.thumb_el.className = "term_thumb"; + this.thumb_el.onmousedown = this.mouseDownHandler.bind(this); + this.track_el.appendChild(this.thumb_el); + + this.end_el = document.createElement("div"); + this.end_el.className = "term_end"; + this.thumb_el.appendChild(this.end_el); + + /* current scrollbar position */ + this.thumb_size = -1; + this.thumb_pos = -1; + + /* terminal content */ + this.content_el = document.createElement("div"); + this.content_el.className = "term_content"; + this.content_el.style.width = (this.w) + "ch"; + this.term_el.appendChild(this.content_el); + + this.rows_el = []; + for(y=0;y<this.h;y++) { + row_el = document.createElement("div"); + this.rows_el.push(row_el); + this.content_el.appendChild(row_el); + } + + this.parent_el = parent_el; + parent_el.appendChild(this.term_el); + + /* dummy text area for copy paste & mobile devices */ + this.textarea_el = textarea_el; + + this.refresh(0, this.h - 1); + + // key handler + document.addEventListener("keydown", + this.keyDownHandler.bind(this), true); + document.addEventListener("keyup", + this.keyUpHandler.bind(this), true); + document.addEventListener("blur", + this.blurHandler.bind(this), true); + document.addEventListener("keypress", + this.keyPressHandler.bind(this), true); + // wheel + this.term_el.addEventListener("wheel", + this.wheelHandler.bind(this), false); + // paste + document.defaultView.addEventListener("paste", + this.pasteHandler.bind(this), false); + + // cursor blinking + term = this; + setInterval(function() { term.cursor_timer_cb(); }, 1000); +}; + +Term.prototype.refresh_scrollbar = function () +{ + var total_size, thumb_pos, thumb_size, y, y0; + total_size = this.term_el.clientHeight; + thumb_size = Math.ceil(this.h * total_size / this.cur_h); + /* position of the first line of the scroll back buffer */ + y0 = (this.y_base + this.h) % this.cur_h; + y = this.y_disp - y0; + if (y < 0) + y += this.cur_h; + thumb_pos = Math.floor(y * total_size / this.cur_h); + thumb_size = Math.max(thumb_size, 30); + thumb_size = Math.min(thumb_size, total_size); + thumb_pos = Math.min(thumb_pos, total_size - thumb_size); +// console.log("pos=" + thumb_pos + " size=" + thumb_size); + if (thumb_pos != this.thumb_pos || thumb_size != this.thumb_size) { + this.thumb_pos = thumb_pos; + this.thumb_size = thumb_size; + this.thumb_el.style.top = thumb_pos + "px"; + this.thumb_el.style.height = thumb_size + "px"; + } +} + +Term.prototype.refresh = function(ymin, ymax) +{ + var el, y, line, outline, c, w, i, j, cx, attr, last_attr, fg, bg, y1; + var http_link_len, http_link_str, bold, tmp, inverse; + + function is_http_link_char(c) + { + var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=`."; + return str.indexOf(String.fromCharCode(c)) >= 0; + } + + function right_trim(str, a) + { + var i, n; + n = a.length; + i = str.length; + while (i >= n && str.substr(i - n, n) == a) + i -= n; + return str.substr(0, i); + } + + for(y = ymin; y <= ymax; y++) { + /* convert to HTML string */ + y1 = y + this.y_disp; + if (y1 >= this.cur_h) + y1 -= this.cur_h; + line = this.lines[y1]; + outline = ""; + w = this.w; + if (y == this.y && this.cursor_state && + this.y_disp == this.y_base) { + cx = this.x; + } else { + cx = -1; + } + last_attr = this.def_attr; + http_link_len = 0; + for(i = 0; i < w; i++) { + c = line[i]; + attr = c >> 16; + c &= 0xffff; + /* test for http link */ + if (c == 0x68 && (w - i) >= 8 && http_link_len == 0) { + /* test http:// or https:// */ + if ((line[i + 1] & 0xffff) == 0x74 && + (line[i + 2] & 0xffff) == 0x74 && + (line[i + 3] & 0xffff) == 0x70 && + (((line[i + 4] & 0xffff) == 0x3a && + (line[i + 5] & 0xffff) == 0x2f && + (line[i + 6] & 0xffff) == 0x2f) || + ((line[i + 4] & 0xffff) == 0x73 && + (line[i + 5] & 0xffff) == 0x3a && + (line[i + 6] & 0xffff) == 0x2f && + (line[i + 7] & 0xffff) == 0x2f))) { + http_link_str = ""; + j = 0; + while ((i + j) < w && + is_http_link_char(line[i + j] & 0xffff)) { + http_link_str += String.fromCharCode(line[i + j] & 0xffff); + j++; + } + http_link_len = j; + if (last_attr != this.def_attr) { + outline += '</span>'; + last_attr = this.def_attr; + } + outline += "<a href='" + http_link_str + "'>"; + } + } + if (i == cx) { + attr = -1; /* cursor */ + } + if (attr != last_attr) { + if (last_attr != this.def_attr) + outline += '</span>'; + if (attr != this.def_attr) { + if (attr == -1) { + /* cursor */ + outline += '<span class="term_cursor">'; + } else { + outline += '<span style="'; + fg = (attr >> 4) & 0xf; + bg = attr & 0xf; + bold = (attr >> 8) & 1; + inverse = (attr >> 9) & 1; + if (inverse) { + tmp = fg; + fg = bg; + bg = tmp; + } + if (bold) { + /* metrics are not OK for all fonts, so disabled */ + /* outline += 'font-weight:bold;'; */ + /* use the bright color */ + if (fg < 8) + fg += 8; + } + if (fg != 7) { + outline += 'color:' + this.colors[fg] + ';'; + } + if (bg != 0) { + outline += 'background-color:' + + this.colors[bg] + ';'; + } + outline += '">'; + } + } + } + switch(c) { + case 32: + outline += " "; + break; + case 38: // '&' + outline += "&"; + break; + case 60: // '<' + outline += "<"; + break; + case 62: // '>' + outline += ">"; + break; + default: + if (c < 32) { + outline += " "; + } else { + outline += String.fromCharCode(c); + } + break; + } + last_attr = attr; + if (http_link_len != 0) { + http_link_len--; + if (http_link_len == 0) { + if (last_attr != this.def_attr) { + outline += '</span>'; + last_attr = this.def_attr; + } + outline += "</a>"; + } + } + } + if (last_attr != this.def_attr) { + outline += '</span>'; + } + + /* trim trailing spaces for copy/paste */ + outline = right_trim(outline, " "); + if (outline == "") + outline = " "; + + this.rows_el[y].innerHTML = outline; + } + + this.refresh_scrollbar(); +}; + +Term.prototype.cursor_timer_cb = function() +{ + this.cursor_state ^= 1; + this.refresh(this.y, this.y); +}; + +Term.prototype.show_cursor = function() +{ + if (!this.cursor_state) { + this.cursor_state = 1; + this.refresh(this.y, this.y); + } +}; + +/* scroll down or up in the scroll back buffer by n lines */ +Term.prototype.scroll_disp = function(n) +{ + var i, y1; + /* slow but it does not really matters */ + if (n >= 0) { + for(i = 0; i < n; i++) { + if (this.y_disp == this.y_base) + break; + if (++this.y_disp == this.cur_h) + this.y_disp = 0; + } + } else { + n = -n; + y1 = this.y_base + this.h; + if (y1 >= this.cur_h) + y1 -= this.cur_h; + for(i = 0; i < n; i++) { + if (this.y_disp == y1) + break; + if (--this.y_disp < 0) + this.y_disp = this.cur_h - 1; + } + } + this.refresh(0, this.h - 1); +}; + +Term.prototype.write = function(str) +{ + var s, ymin, ymax; + + function update(y) + { + ymin = Math.min(ymin, y); + ymax = Math.max(ymax, y); + } + + function get_erase_char() + { + var bg_mask, attr; + bg_mask = 0xf; + attr = (s.def_attr & ~bg_mask) | (s.cur_attr & bg_mask); + return 32 | (attr << 16); + } + + function erase_chars(x1, x2, y) { + var l, i, c, y1; + y1 = s.y_base + y; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + l = s.lines[y1]; + c = get_erase_char(); + for(i = x1; i < x2; i++) + l[i] = c; + update(y); + } + + function erase_to_eol(x, y) { + erase_chars(x, s.w, y); + } + + function erase_in_line(n) { + switch(n) { + case 0: + erase_to_eol(s.x, s.y); + break; + case 1: + erase_chars(0, s.x + 1, s.y); + break; + case 2: + erase_chars(0, s.w, s.y); + break; + } + } + + function erase_in_display(n) { + var y; + switch(n) { + case 0: + erase_to_eol(s.x, s.y); + for(y = s.y + 1; y < s.h; y++) + erase_to_eol(0, y); + break; + case 1: + erase_chars(0, s.x + 1, s.y); + for(y = 0; y < s.y; y++) { + erase_to_eol(0, y); + } + break; + case 2: + for(y = 0; y < s.h; y++) { + erase_to_eol(0, y); + } + break; + } + } + + + function delete_chars(n) + { + var l, i, c, y1, j; + y1 = s.y + s.y_base; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + l = s.lines[y1]; + if (n < 1) + n = 1; + c = get_erase_char(); + j = s.x + n; + for(i = s.x; i < s.w; i++) { + if (j < s.w) + l[i] = l[j]; + else + l[i] = c; + j++; + } + update(s.y); + } + + function insert_chars(n) + { + var l, i, c, y1, x1; + if (n < 1) + n = 1; + if (n > s.w - s.x) + n = s.w - s.x; + y1 = s.y + s.y_base; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + l = s.lines[y1]; + x1 = s.x + n; + for(i = s.w - 1; i >= x1; i--) + l[i] = l[i - n]; + c = get_erase_char(); + for(i = s.x; i < x1; i++) + l[i] = c; + update(s.y); + } + + function csi_colors(esc_params) + { + var j, n, fg, bg, mask; + + if (esc_params.length == 0) { + s.cur_attr= s.def_attr; + } else { + for(j = 0; j < esc_params.length; j++) { + n = esc_params[j]; + if (n >= 30 && n <= 37) { + /* foreground */ + fg = n - 30; + s.cur_attr = (s.cur_attr & ~(0xf << 4)) | (fg << 4); + } else if (n >= 40 && n <= 47) { + /* background */ + bg = n - 40; + s.cur_attr = (s.cur_attr & ~0xf) | bg; + } else if (n >= 90 && n <= 97) { + /* bright foreground */ + fg = n - 90 + 8; + s.cur_attr = (s.cur_attr & ~(0xf << 4)) | (fg << 4); + } else if (n >= 100 && n <= 107) { + /* bright background */ + bg = n - 100 + 8; + s.cur_attr = (s.cur_attr & ~0xf) | bg; + } else if (n == 1) { + /* bold + bright */ + s.cur_attr |= (1 << 8); + } else if (n == 0) { + /* default attr */ + s.cur_attr = s.def_attr; + } else if (n == 7) { + /* inverse */ + s.cur_attr |= (1 << 9); + } else if (n == 27) { + /* not inverse */ + s.cur_attr &= ~(1 << 9); + } else if (n == 39) { + /* reset fg */ + mask = 0x0f << 4; + s.cur_attr = (s.cur_attr & ~mask) | (s.def_attr & mask); + } else if (n == 49) { + /* reset bg */ + mask = 0x0f; + s.cur_attr = (s.cur_attr & ~mask) | (s.def_attr & mask); + } + } + } + } + + function empty_line(y, use_erase_char) { + var line, c, y1, x; + if (use_erase_char) + c = get_erase_char(); + else + c = 32 | (s.def_attr << 16); + line = new Array(); + for(x=0;x<s.w;x++) + line[x] = c; + y1 = s.y_base + y; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + s.lines[y1] = line; + } + + function scroll_down(top, bottom, use_erase_char) + { + var y, line, y1, y2; + + if (top == 0 && bottom == s.h) { + /* increase height of buffer if possible */ + if (s.cur_h < s.tot_h) { + s.cur_h++; + } + /* move down one line */ + if (++s.y_base == s.cur_h) + s.y_base = 0; + s.y_disp = s.y_base; + } else { + /* partial scroll */ + for(y = top; y < bottom - 1; y++) { + y1 = s.y_base + y; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + y2 = y1 + 1; + if (y2 >= s.cur_h) + y2 -= s.cur_h; + s.lines[y1] = s.lines[y2]; + } + } + empty_line(bottom - 1, use_erase_char); + update(top); + update(bottom - 1); + } + + function scroll_up(top, bottom, use_erase_char) { + var y, y1, y2; + /* XXX: could scroll in the history */ + for(y = bottom - 1; y > top; y--) { + y1 = s.y_base + y; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + y2 = y1 - 1; + if (y2 >= s.cur_h) + y2 -= s.cur_h; + s.lines[y1] = s.lines[y2]; + } + empty_line(top, use_erase_char); + update(top); + update(bottom - 1); + } + + function down_with_scroll() { + s.y++; + if (s.y == s.scroll_bottom) { + s.y--; + scroll_down(s.scroll_top, s.scroll_bottom, false); + } else if (s.y >= s.h) { + s.y--; + scroll_down(0, s.h, false); + } + } + + function up_with_scroll() { + if (s.y == s.scroll_top) { + scroll_up(s.scroll_top, s.scroll_bottom, true); + } else if (s.y == 0) { + scroll_up(0, s.h, true); + } else { + s.y--; + } + } + + function insert_lines(n) { + var y2; + if (n < 1) + n = 1; + if (s.y < s.scroll_bottom) + y2 = s.scroll_bottom; + else + y2 = s.h; + while (n != 0) { + scroll_up(s.y, y2, true); + n--; + } + } + + function delete_lines(n) { + var y2; + if (n < 1) + n = 1; + if (s.y < s.scroll_bottom) + y2 = s.scroll_bottom; + else + y2 = s.h; + while (n != 0) { + scroll_down(s.y, y2, true); + n--; + } + } + + var TTY_STATE_NORM = 0; + var TTY_STATE_ESC = 1; + var TTY_STATE_CSI = 2; + var TTY_STATE_CHARSET = 3; + + function handle_char(c) { + var i, l, n, j, y1, y2, x1; + + switch(s.state) { + case TTY_STATE_NORM: + switch(c) { + case 10: + down_with_scroll(); + break; + case 13: + s.x = 0; + break; + case 8: + if (s.x > 0) { + s.x--; + } + break; + case 9: /* tab */ + n = (s.x + 8) & ~7; + if (n <= s.w) { + s.x = n; + } + break; + case 27: + s.state = TTY_STATE_ESC; + break; + default: + if (c >= 32) { + if (s.x >= s.w) { + s.x = 0; + down_with_scroll(); + } + y1 = s.y + s.y_base; + if (y1 >= s.cur_h) + y1 -= s.cur_h; + s.lines[y1][s.x] = (c & 0xffff) | + (s.cur_attr << 16); + s.x++; + update(s.y); + } + break; + } + break; + case TTY_STATE_ESC: + switch(c) { + case 91: // '[' + s.esc_params = new Array(); + s.cur_param = 0; + s.esc_prefix = 0; + s.state = TTY_STATE_CSI; + break; + case 40: // '(' + case 41: // ')' + s.state = TTY_STATE_CHARSET; + break; + case 61: // '=' + s.application_keypad = true; + s.state = TTY_STATE_NORM; + break; + case 62: // '>' + s.application_keypad = false; + s.state = TTY_STATE_NORM; + break; + case 77: // 'M' + up_with_scroll(); + s.state = TTY_STATE_NORM; + break; + default: + s.state = TTY_STATE_NORM; + break; + } + break; + case TTY_STATE_CSI: + if (c >= 48 && c <= 57) { // '0' '9' + /* numeric */ + s.cur_param = s.cur_param * 10 + c - 48; + } else { + if (c == 63) { // '?' + s.esc_prefix = c; + break; + } + /* add parsed parameter */ + s.esc_params[s.esc_params.length] = s.cur_param; + s.cur_param = 0; + if (c == 59) // ; + break; + s.state = TTY_STATE_NORM; + + // console.log("term: csi=" + s.esc_params + " cmd="+c); + switch(c) { + case 64: // '@' insert chars + insert_chars(s.esc_params[0]); + break; + case 65: // 'A' up + n = s.esc_params[0]; + if (n < 1) + n = 1; + s.y -= n; + if (s.y < 0) + s.y = 0; + break; + case 66: // 'B' down + n = s.esc_params[0]; + if (n < 1) + n = 1; + s.y += n; + if (s.y >= s.h) + s.y = s.h - 1; + break; + case 67: // 'C' right + n = s.esc_params[0]; + if (n < 1) + n = 1; + s.x += n; + if (s.x >= s.w - 1) + s.x = s.w - 1; + break; + case 68: // 'D' left + n = s.esc_params[0]; + if (n < 1) + n = 1; + s.x -= n; + if (s.x < 0) + s.x = 0; + break; + case 71: /* 'G' cursor character absolute */ + x1 = s.esc_params[0] - 1; + if (x1 < 0) + x1 = 0; + else if (x1 >= s.w) + x1 = s.w - 1; + s.x = x1; + break; + case 72: // 'H' goto xy + y1 = s.esc_params[0] - 1; + if (s.esc_params.length >= 2) + x1 = s.esc_params[1] - 1; + else + x1 = 0; + if (y1 < 0) + y1 = 0; + else if (y1 >= s.h) + y1 = s.h - 1; + if (x1 < 0) + x1 = 0; + else if (x1 >= s.w) + x1 = s.w - 1; + s.x = x1; + s.y = y1; + break; + case 74: // 'J' erase in display + erase_in_display(s.esc_params[0]); + break; + case 75: // 'K' erase in line + erase_in_line(s.esc_params[0]); + break; + case 76: // 'L' insert lines + insert_lines(s.esc_params[0]); + break; + case 77: // 'M' insert lines + delete_lines(s.esc_params[0]); + break; + case 80: // 'P' + delete_chars(s.esc_params[0]); + break; + case 100: // 'd' line position absolute + { + y1 = s.esc_params[0] - 1; + if (y1 < 0) + y1 = 0; + else if (y1 >= s.h) + y1 = s.h - 1; + s.y = y1; + } + break; + case 104: // 'h': set mode + if (s.esc_prefix == 63 && s.esc_params[0] == 1) { + s.application_cursor = true; + } + break; + case 108: // 'l': reset mode + if (s.esc_prefix == 63 && s.esc_params[0] == 1) { + s.application_cursor = false; + } + break; + case 109: // 'm': set color + csi_colors(s.esc_params); + break; + case 110: // 'n' return the cursor position + s.queue_chars("\x1b[" + (s.y + 1) + ";" + (s.x + 1) + "R"); + break; + case 114: // 'r' set scroll region + y1 = s.esc_params[0] - 1; + if (y1 < 0) + y1 = 0; + else if (y1 >= s.h) + y1 = s.h - 1; + if (s.esc_params.length >= 2) + y2 = s.esc_params[1]; + else + y2 = s.h; + if (y2 >= s.h || y2 <= y1) + y2 = s.h; + s.scroll_top = y1; + s.scroll_bottom = y2; + s.x = 0; + s.y = 0; + break; + default: + break; + } + } + break; + case TTY_STATE_CHARSET: + /* just ignore */ + s.state = TTY_STATE_NORM; + break; + } + } + + function handle_utf8(c) { + if (s.utf8_state !== 0 && (c >= 0x80 && c < 0xc0)) { + s.utf8_val = (s.utf8_val << 6) | (c & 0x3F); + s.utf8_state--; + if (s.utf8_state === 0) { + handle_char(s.utf8_val); + } + } else if (c >= 0xc0 && c < 0xf8) { + s.utf8_state = 1 + (c >= 0xe0) + (c >= 0xf0); + s.utf8_val = c & ((1 << (6 - s.utf8_state)) - 1); + } else { + s.utf8_state = 0; + handle_char(c); + } + } + + var i, c, utf8; + + /* update region is in ymin ymax */ + s = this; + ymin = s.h; + ymax = -1; + update(s.y); // remove the cursor + /* reset top of displayed screen to top of real screen */ + if (s.y_base != s.y_disp) { + s.y_disp = s.y_base; + /* force redraw */ + ymin = 0; + ymax = s.h - 1; + } + utf8 = s.utf8; + for(i = 0; i < str.length; i++) { + c = str.charCodeAt(i); + if (utf8) + handle_utf8(c); + else + handle_char(c); + } + update(s.y); // show the cursor + + if (ymax >= ymin) + s.refresh(ymin, ymax); +}; + +Term.prototype.writeln = function (str) +{ + this.write(str + '\r\n'); +}; + +Term.prototype.interceptBrowserExit = function (ev) +{ + /* At least avoid exiting the navigator if Ctrl-Q or Ctrl-W are + * pressed */ + if (ev.ctrlKey) { + window.onbeforeunload = function() { + window.onbeforeunload = null; + return "CTRL-W or Ctrl-Q cannot be sent to the emulator."; + }; + } else { + window.onbeforeunload = null; + } +} + +Term.prototype.keyDownHandler = function (ev) +{ + var str; + + this.interceptBrowserExit(ev); + + str=""; + switch(ev.keyCode) { + case 8: /* backspace */ + str = "\x7f"; + break; + case 9: /* tab */ + str = "\x09"; + break; + case 13: /* enter */ + str = "\x0d"; + break; + case 27: /* escape */ + str = "\x1b"; + break; + case 37: /* left */ + if (ev.ctrlKey) { + str = "\x1b[1;5D"; + } else if (this.application_cursor) { + str = "\x1bOD"; + } else { + str = "\x1b[D"; + } + break; + case 39: /* right */ + if (ev.ctrlKey) { + str = "\x1b[1;5C"; + } else if (this.application_cursor) { + str = "\x1bOC"; + } else { + str = "\x1b[C"; + } + break; + case 38: /* up */ + if (ev.ctrlKey) { + this.scroll_disp(-1); + } else if (this.application_cursor) { + str = "\x1bOA"; + } else { + str = "\x1b[A"; + } + break; + case 40: /* down */ + if (ev.ctrlKey) { + this.scroll_disp(1); + } else if (this.application_cursor) { + str = "\x1bOB"; + } else { + str = "\x1b[B"; + } + break; + case 46: /* delete */ + str = "\x1b[3~"; + break; + case 45: /* insert */ + str = "\x1b[2~"; + break; + case 36: /* home */ + if (this.linux_console) + str = "\x1b[1~"; + else if (this.application_keypad) + str = "\x1bOH"; + else + str = "\x1b[H"; + break; + case 35: /* end */ + if (this.linux_console) + str = "\x1b[4~"; + else if (this.application_keypad) + str = "\x1bOF"; + else + str = "\x1b[F"; + break; + case 33: /* page up */ + if (ev.ctrlKey) { + this.scroll_disp(-(this.h - 1)); + } else { + str = "\x1b[5~"; + } + break; + case 34: /* page down */ + if (ev.ctrlKey) { + this.scroll_disp(this.h - 1); + } else { + str = "\x1b[6~"; + } + break; + default: + if (ev.ctrlKey) { + /* ctrl + key */ + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + str = String.fromCharCode(ev.keyCode - 64); + } else if (ev.keyCode == 32) { + str = String.fromCharCode(0); + } + } else if ((!this.is_mac && ev.altKey) || + (this.is_mac && ev.metaKey)) { + /* meta + key (Note: we only send lower case) */ + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + str = "\x1b" + String.fromCharCode(ev.keyCode + 32); + } + } + break; + } + // console.log("keydown: keycode=" + ev.keyCode + " charcode=" + ev.charCode + " str=" + str + " ctrl=" + ev.ctrlKey + " alt=" + ev.altKey + " meta=" + ev.metaKey); + if (str) { + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); + + this.show_cursor(); + this.key_rep_state = 1; + this.key_rep_str = str; + this.handler(str); + return false; + } else { + this.key_rep_state = 0; + return true; + } +}; + +Term.prototype.keyUpHandler = function (ev) +{ + this.interceptBrowserExit(ev); +}; + +Term.prototype.to_utf8 = function(s) +{ + var i, n = s.length, r, c; + r = ""; + for(i = 0; i < n; i++) { + c = s.charCodeAt(i); + if (c < 0x80) { + r += String.fromCharCode(c); + } else if (c < 0x800) { + r += String.fromCharCode((c >> 6) | 0xc0, (c & 0x3f) | 0x80); + } else if (c < 0x10000) { + r += String.fromCharCode((c >> 12) | 0xe0, + ((c >> 6) & 0x3f) | 0x80, + (c & 0x3f) | 0x80); + } else { + r += String.fromCharCode((c >> 18) | 0xf0, + ((c >> 12) & 0x3f) | 0x80, + ((c >> 6) & 0x3f) | 0x80, + (c & 0x3f) | 0x80); + } + } + return r; +} + +Term.prototype.keyPressHandler = function (ev) +{ + var str, char_code; + + if (ev.stopPropagation) + ev.stopPropagation(); + if (ev.preventDefault) + ev.preventDefault(); + + str=""; + if (!("charCode" in ev)) { + /* on Opera charCode is not defined and keypress is sent for + system keys. Moreover, only keupress is repeated which is a + problem for system keys. */ + char_code = ev.keyCode; + if (this.key_rep_state == 1) { + this.key_rep_state = 2; + return false; + } else if (this.key_rep_state == 2) { + /* repetition */ + this.show_cursor(); + this.handler(this.key_rep_str); + return false; + } + } else { + char_code = ev.charCode; + } + if (char_code != 0) { + if (!ev.ctrlKey && + ((!this.is_mac && !ev.altKey) || + (this.is_mac && !ev.metaKey))) { + str = String.fromCharCode(char_code); + } + } + // console.log("keypress: keycode=" + ev.keyCode + " charcode=" + ev.charCode + " str=" + str + " ctrl=" + ev.ctrlKey + " alt=" + ev.altKey + " meta=" + ev.metaKey); + if (str) { + this.show_cursor(); + if (this.utf8) + str = this.to_utf8(str); + this.handler(str); + return false; + } else { + return true; + } +}; + +Term.prototype.blurHandler = function (ev) +{ + /* allow unloading the page */ + window.onbeforeunload = null; +}; + +Term.prototype.wheelHandler = function (ev) +{ + if (ev.deltaY < 0) + this.scroll_disp(-3); + else if (ev.deltaY > 0) + this.scroll_disp(3); + ev.stopPropagation(); +} + +Term.prototype.mouseDownHandler = function (ev) +{ + this.thumb_el.onmouseup = this.mouseUpHandler.bind(this); + document.onmousemove = this.mouseMoveHandler.bind(this); + document.onmouseup = this.mouseUpHandler.bind(this); + + /* disable potential selection */ + document.body.className += " noSelect"; + + this.mouseMoveHandler(ev); +} + +Term.prototype.mouseMoveHandler = function (ev) +{ + var total_size, pos, new_y_disp, y, y0; + total_size = this.term_el.clientHeight; + y = ev.clientY - this.track_el.getBoundingClientRect().top; + pos = Math.floor((y - (this.thumb_size / 2)) * this.cur_h / total_size); + new_y_disp = Math.min(Math.max(pos, 0), this.cur_h - this.h); + /* position of the first line of the scroll back buffer */ + y0 = (this.y_base + this.h) % this.cur_h; + new_y_disp += y0; + if (new_y_disp >= this.cur_h) + new_y_disp -= this.cur_h; + if (new_y_disp != this.y_disp) { + this.y_disp = new_y_disp; + this.refresh(0, this.h - 1); + } +} + +Term.prototype.mouseUpHandler = function (ev) +{ + this.thumb_el.onmouseup = null; + document.onmouseup = null; + document.onmousemove = null; + document.body.className = document.body.className.replace(" noSelect", ""); +} + +Term.prototype.pasteHandler = function (ev) +{ + var c = ev.clipboardData, str; + if (c) { + str = c.getData("text/plain"); + if (this.utf8) + str = this.to_utf8(str); + this.queue_chars(str); + setTimeout(this.textAreaReset.bind(this), 10); + return false; + } +} + +Term.prototype.textAreaReset = function(ev) +{ + /* reset text */ + this.textarea_el.value = "Paste Here"; +} + +/* output queue to send back asynchronous responses */ +Term.prototype.queue_chars = function (str) +{ + this.output_queue += str; + if (this.output_queue) + setTimeout(this.outputHandler.bind(this), 0); +}; + +Term.prototype.outputHandler = function () +{ + if (this.output_queue) { + this.handler(this.output_queue); + this.output_queue = ""; + } +}; + +Term.prototype.getSize = function () +{ + return [this.w, this.h]; +}; diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/Changelog b/jslinux-2019-12-21/tinyemu-2019-12-21/Changelog new file mode 100644 index 0000000..540a05f --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/Changelog @@ -0,0 +1,45 @@ +2019-12-21: + +- added complete JSLinux demo +- RISC-V: added initrd support +- RISC-V: fixed FMIN/FMAX instructions + +2018-09-23: + +- added support for separate RISC-V BIOS and kernel + +2018-09-15: + +- renamed to TinyEMU (temu) +- single executable for all emulated machines + +2018-08-29: + +- compilation fixes + +2017-08-06: + +- added JSON configuration file +- added graphical display with SDL +- added VirtIO input support +- added PCI bus and VirtIO PCI support +- x86: added IDE, PS/2, vmmouse and VGA devices +- added user mode network interface + +2017-06-10: + +- RISCV: avoid unnecessary kernel patches +- x86: accept standard kernel images + +2017-05-25: + +- RISCV: faster emulation (1.4x) +- Support of user level ISA version 2.2 and priviledged architecture + version 1.10 +- added small x86 emulator (x86emu) based on KVM +- modified the fs_net network protocol to match the vfsync protocol +- handle console resize +- JS emulator: + - added scrollbar in terminal + - added file import and export + - added copy/paste support diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt b/jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt new file mode 100644 index 0000000..3f38cbe --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/MIT-LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2016-2017 Fabrice Bellard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile new file mode 100644 index 0000000..390ae37 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile @@ -0,0 +1,135 @@ +# +# TinyEMU +# +# Copyright (c) 2016-2018 Fabrice Bellard +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +# if set, network filesystem is enabled. libcurl and libcrypto +# (openssl) must be installed. +CONFIG_FS_NET=y +# SDL support (optional) +CONFIG_SDL=y +# if set, compile the 128 bit emulator. Note: the 128 bit target does +# not compile if gcc does not support the int128 type (32 bit hosts). +CONFIG_INT128=y +# build x86 emulator +CONFIG_X86EMU=y +# win32 build (not usable yet) +#CONFIG_WIN32=y +# user space network redirector +CONFIG_SLIRP=y + +ifdef CONFIG_WIN32 +CROSS_PREFIX=i686-w64-mingw32- +EXE=.exe +else +CROSS_PREFIX= +EXE= +endif +CC=$(CROSS_PREFIX)gcc +STRIP=$(CROSS_PREFIX)strip +CFLAGS=-O2 -Wall -g -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD +CFLAGS+=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(shell cat VERSION)\" +LDFLAGS= + +bindir=/usr/local/bin +INSTALL=install + +PROGS+= temu$(EXE) +ifndef CONFIG_WIN32 +ifdef CONFIG_FS_NET +PROGS+=build_filelist splitimg +endif +endif + +all: $(PROGS) + +EMU_OBJS:=virtio.o pci.o fs.o cutils.o iomem.o simplefb.o \ + json.o machine.o temu.o + +ifdef CONFIG_SLIRP +CFLAGS+=-DCONFIG_SLIRP +EMU_OBJS+=$(addprefix slirp/, bootp.o ip_icmp.o mbuf.o slirp.o tcp_output.o cksum.o ip_input.o misc.o socket.o tcp_subr.o udp.o if.o ip_output.o sbuf.o tcp_input.o tcp_timer.o) +endif + +ifndef CONFIG_WIN32 +EMU_OBJS+=fs_disk.o +EMU_LIBS=-lrt +endif +ifdef CONFIG_FS_NET +CFLAGS+=-DCONFIG_FS_NET +EMU_OBJS+=fs_net.o fs_wget.o fs_utils.o block_net.o +EMU_LIBS+=-lcurl -lcrypto +ifdef CONFIG_WIN32 +EMU_LIBS+=-lwsock32 +endif # CONFIG_WIN32 +endif # CONFIG_FS_NET +ifdef CONFIG_SDL +EMU_LIBS+=-lSDL +EMU_OBJS+=sdl.o +CFLAGS+=-DCONFIG_SDL +ifdef CONFIG_WIN32 +LDFLAGS+=-mwindows +endif +endif + +EMU_OBJS+=riscv_machine.o softfp.o riscv_cpu32.o riscv_cpu64.o +ifdef CONFIG_INT128 +CFLAGS+=-DCONFIG_RISCV_MAX_XLEN=128 +EMU_OBJS+=riscv_cpu128.o +else +CFLAGS+=-DCONFIG_RISCV_MAX_XLEN=64 +endif +ifdef CONFIG_X86EMU +CFLAGS+=-DCONFIG_X86EMU +EMU_OBJS+=x86_cpu.o x86_machine.o ide.o ps2.o vmmouse.o pckbd.o vga.o +endif + +temu$(EXE): $(EMU_OBJS) + $(CC) $(LDFLAGS) -o $@ $^ $(EMU_LIBS) + +riscv_cpu32.o: riscv_cpu.c + $(CC) $(CFLAGS) -DMAX_XLEN=32 -c -o $@ $< + +riscv_cpu64.o: riscv_cpu.c + $(CC) $(CFLAGS) -DMAX_XLEN=64 -c -o $@ $< + +riscv_cpu128.o: riscv_cpu.c + $(CC) $(CFLAGS) -DMAX_XLEN=128 -c -o $@ $< + +build_filelist: build_filelist.o fs_utils.o cutils.o + $(CC) $(LDFLAGS) -o $@ $^ -lm + +splitimg: splitimg.o + $(CC) $(LDFLAGS) -o $@ $^ + +install: $(PROGS) + $(STRIP) $(PROGS) + $(INSTALL) -m755 $(PROGS) "$(DESTDIR)$(bindir)" + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +clean: + rm -f *.o *.d *~ $(PROGS) slirp/*.o slirp/*.d slirp/*~ + +-include $(wildcard *.d) +-include $(wildcard slirp/*.d) diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js new file mode 100644 index 0000000..3d76f77 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/Makefile.js @@ -0,0 +1,65 @@ +# +# TinyEMU emulator +# +# Copyright (c) 2016-2018 Fabrice Bellard +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +# Build the Javascript version of TinyEMU +EMCC=emcc +EMCFLAGS=-O2 --llvm-opts 2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing -DCONFIG_FS_NET +#EMCFLAGS+=-Werror +EMLDFLAGS=-O3 --memory-init-file 0 --closure 0 -s NO_EXIT_RUNTIME=1 -s NO_FILESYSTEM=1 -s "EXPORTED_FUNCTIONS=['_console_queue_char','_vm_start','_fs_import_file','_display_key_event','_display_mouse_event','_display_wheel_event','_net_write_packet','_net_set_carrier']" -s 'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall", "cwrap"]' -s BINARYEN_TRAP_MODE=clamp --js-library js/lib.js +EMLDFLAGS_ASMJS:=$(EMLDFLAGS) -s WASM=0 +EMLDFLAGS_WASM:=$(EMLDFLAGS) -s WASM=1 -s TOTAL_MEMORY=67108864 -s ALLOW_MEMORY_GROWTH=1 + +PROGS=js/riscvemu32.js js/riscvemu32-wasm.js js/riscvemu64.js js/riscvemu64-wasm.js + +all: $(PROGS) + +JS_OBJS=jsemu.js.o softfp.js.o virtio.js.o fs.js.o fs_net.js.o fs_wget.js.o fs_utils.js.o simplefb.js.o pci.js.o json.js.o block_net.js.o +JS_OBJS+=iomem.js.o cutils.js.o aes.js.o sha256.js.o + +RISCVEMU64_OBJS=$(JS_OBJS) riscv_cpu64.js.o riscv_machine.js.o machine.js.o +RISCVEMU32_OBJS=$(JS_OBJS) riscv_cpu32.js.o riscv_machine.js.o machine.js.o + +js/riscvemu64.js: $(RISCVEMU64_OBJS) js/lib.js + $(EMCC) $(EMLDFLAGS_ASMJS) -o $@ $(RISCVEMU64_OBJS) + +js/riscvemu32.js: $(RISCVEMU32_OBJS) js/lib.js + $(EMCC) $(EMLDFLAGS_ASMJS) -o $@ $(RISCVEMU32_OBJS) + +js/riscvemu64-wasm.js: $(RISCVEMU64_OBJS) js/lib.js + $(EMCC) $(EMLDFLAGS_WASM) -o $@ $(RISCVEMU64_OBJS) + +js/riscvemu32-wasm.js: $(RISCVEMU32_OBJS) js/lib.js + $(EMCC) $(EMLDFLAGS_WASM) -o $@ $(RISCVEMU32_OBJS) + +riscv_cpu32.js.o: riscv_cpu.c + $(EMCC) $(EMCFLAGS) -DMAX_XLEN=32 -DCONFIG_RISCV_MAX_XLEN=32 -c -o $@ $< + +riscv_cpu64.js.o: riscv_cpu.c + $(EMCC) $(EMCFLAGS) -DMAX_XLEN=64 -DCONFIG_RISCV_MAX_XLEN=64 -c -o $@ $< + + +%.js.o: %.c + $(EMCC) $(EMCFLAGS) -c -o $@ $< + +-include $(wildcard *.d) diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/VERSION b/jslinux-2019-12-21/tinyemu-2019-12-21/VERSION new file mode 100644 index 0000000..bd16728 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/VERSION @@ -0,0 +1 @@ +2019-12-21 diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/aes.c b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.c new file mode 100644 index 0000000..ac8af6d --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.c @@ -0,0 +1,1321 @@ +/** + * + * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project. + */ +/* + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> + * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> + * @author Paulo Barreto <paulo.barreto@terra.com.br> + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include <string.h> +#include <inttypes.h> +#include "aes.h" + +#ifndef NDEBUG +#define NDEBUG +#endif + +#include <assert.h> + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +#define MAXKC (256/32) +#define MAXKB (256/8) +#define MAXNR 14 + +/* This controls loop-unrolling in aes_core.c */ +#undef FULL_UNROLL +# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) +# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } + +/* +Te0[x] = S [x].[02, 01, 01, 03]; +Te1[x] = S [x].[03, 02, 01, 01]; +Te2[x] = S [x].[01, 03, 02, 01]; +Te3[x] = S [x].[01, 01, 03, 02]; +Te4[x] = S [x].[01, 01, 01, 01]; + +Td0[x] = Si[x].[0e, 09, 0d, 0b]; +Td1[x] = Si[x].[0b, 0e, 09, 0d]; +Td2[x] = Si[x].[0d, 0b, 0e, 09]; +Td3[x] = Si[x].[09, 0d, 0b, 0e]; +Td4[x] = Si[x].[01, 01, 01, 01]; +*/ + +static const u32 Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +static const u32 Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +static const u32 Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +static const u32 Te3[256] = { + + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; +static const u32 Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; +static const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +static const u32 Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +static const u32 Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +static const u32 Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +static const u32 Td4[256] = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; +static const u32 rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +/** + * Expand the cipher key into the encryption key schedule. + */ +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key) { + + u32 *rk; + int i = 0; + u32 temp; + + if (!userKey || !key) + return -1; + if (bits != 128 && bits != 192 && bits != 256) + return -2; + + rk = key->rd_key; + + if (bits==128) + key->rounds = 10; + else if (bits==192) + key->rounds = 12; + else + key->rounds = 14; + + rk[0] = GETU32(userKey ); + rk[1] = GETU32(userKey + 4); + rk[2] = GETU32(userKey + 8); + rk[3] = GETU32(userKey + 12); + if (bits == 128) { + while (1) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + return 0; + } + rk += 4; + } + } + rk[4] = GETU32(userKey + 16); + rk[5] = GETU32(userKey + 20); + if (bits == 192) { + while (1) { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) { + return 0; + } + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + } + rk[6] = GETU32(userKey + 24); + rk[7] = GETU32(userKey + 28); + if (bits == 256) { + while (1) { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) { + return 0; + } + temp = rk[11]; + rk[12] = rk[ 4] ^ + (Te4[(temp >> 24) ] & 0xff000000) ^ + (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(temp ) & 0xff] & 0x000000ff); + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + + rk += 8; + } + } + return 0; +} + +/** + * Expand the cipher key into the decryption key schedule. + */ +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key) { + + u32 *rk; + int i, j, status; + u32 temp; + + /* first, start with an encryption schedule */ + status = AES_set_encrypt_key(userKey, bits, key); + if (status < 0) + return status; + + rk = key->rd_key; + + /* invert the order of the round keys: */ + for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < (key->rounds); i++) { + rk += 4; + rk[0] = + Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[0] ) & 0xff] & 0xff]; + rk[1] = + Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[1] ) & 0xff] & 0xff]; + rk[2] = + Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[2] ) & 0xff] & 0xff]; + rk[3] = + Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[3] ) & 0xff] & 0xff]; + } + return 0; +} + +#ifndef AES_ASM +/* + * Encrypt a single block + * in and out can overlap + */ +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key) { + + const u32 *rk; + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + assert(in && out && key); + rk = key->rd_key; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(in ) ^ rk[0]; + s1 = GETU32(in + 4) ^ rk[1]; + s2 = GETU32(in + 8) ^ rk[2]; + s3 = GETU32(in + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; + if (key->rounds > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; + if (key->rounds > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } + } + rk += key->rounds << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = key->rounds >> 1; + for (;;) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[4]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[5]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[6]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Te0[(t0 >> 24) ] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ + Te3[(t3 ) & 0xff] ^ + rk[0]; + s1 = + Te0[(t1 >> 24) ] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ + Te3[(t0 ) & 0xff] ^ + rk[1]; + s2 = + Te0[(t2 >> 24) ] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ + Te3[(t1 ) & 0xff] ^ + rk[2]; + s3 = + Te0[(t3 >> 24) ] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ + Te3[(t2 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Te4[(t0 >> 24) ] & 0xff000000) ^ + (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(out , s0); + s1 = + (Te4[(t1 >> 24) ] & 0xff000000) ^ + (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(out + 4, s1); + s2 = + (Te4[(t2 >> 24) ] & 0xff000000) ^ + (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(out + 8, s2); + s3 = + (Te4[(t3 >> 24) ] & 0xff000000) ^ + (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(out + 12, s3); +} + +/* + * Decrypt a single block + * in and out can overlap + */ +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key) { + + const u32 *rk; + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + assert(in && out && key); + rk = key->rd_key; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(in ) ^ rk[0]; + s1 = GETU32(in + 4) ^ rk[1]; + s2 = GETU32(in + 8) ^ rk[2]; + s3 = GETU32(in + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; + if (key->rounds > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; + if (key->rounds > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } + } + rk += key->rounds << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = key->rounds >> 1; + for (;;) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[4]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[5]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[6]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Td0[(t0 >> 24) ] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ + Td3[(t1 ) & 0xff] ^ + rk[0]; + s1 = + Td0[(t1 >> 24) ] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ + Td3[(t2 ) & 0xff] ^ + rk[1]; + s2 = + Td0[(t2 >> 24) ] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ + Td3[(t3 ) & 0xff] ^ + rk[2]; + s3 = + Td0[(t3 >> 24) ] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ + Td3[(t0 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Td4[(t0 >> 24) ] & 0xff000000) ^ + (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(out , s0); + s1 = + (Td4[(t1 >> 24) ] & 0xff000000) ^ + (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(out + 4, s1); + s2 = + (Td4[(t2 >> 24) ] & 0xff000000) ^ + (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(out + 8, s2); + s3 = + (Td4[(t3 >> 24) ] & 0xff000000) ^ + (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(out + 12, s3); +} + +#endif /* AES_ASM */ + +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc) +{ + + unsigned long n; + unsigned long len = length; + unsigned char tmp[AES_BLOCK_SIZE]; + + assert(in && out && key && ivec); + + if (enc) { + while (len >= AES_BLOCK_SIZE) { + for(n=0; n < AES_BLOCK_SIZE; ++n) + tmp[n] = in[n] ^ ivec[n]; + AES_encrypt(tmp, out, key); + memcpy(ivec, out, AES_BLOCK_SIZE); + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + for(n=0; n < len; ++n) + tmp[n] = in[n] ^ ivec[n]; + for(n=len; n < AES_BLOCK_SIZE; ++n) + tmp[n] = ivec[n]; + AES_encrypt(tmp, tmp, key); + memcpy(out, tmp, AES_BLOCK_SIZE); + memcpy(ivec, tmp, AES_BLOCK_SIZE); + } + } else { + while (len >= AES_BLOCK_SIZE) { + memcpy(tmp, in, AES_BLOCK_SIZE); + AES_decrypt(in, out, key); + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] ^= ivec[n]; + memcpy(ivec, tmp, AES_BLOCK_SIZE); + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + memcpy(tmp, in, AES_BLOCK_SIZE); + AES_decrypt(tmp, tmp, key); + for(n=0; n < len; ++n) + out[n] = tmp[n] ^ ivec[n]; + memcpy(ivec, tmp, AES_BLOCK_SIZE); + } + } +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/aes.h b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.h new file mode 100644 index 0000000..c4d7a1c --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/aes.h @@ -0,0 +1,49 @@ +/* + * OpenSSL compatible AES header + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef AES_H +#define AES_H + +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 + +struct aes_key_st { + uint32_t rd_key[4 *(AES_MAXNR + 1)]; + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c b/jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c new file mode 100644 index 0000000..66794d4 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/block_net.c @@ -0,0 +1,531 @@ +/* + * HTTP block device + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> + +#include "cutils.h" +#include "virtio.h" +#include "fs_wget.h" +#include "list.h" +#include "fbuf.h" +#include "machine.h" + +typedef enum { + CBLOCK_LOADING, + CBLOCK_LOADED, +} CachedBlockStateEnum; + +typedef struct CachedBlock { + struct list_head link; + struct BlockDeviceHTTP *bf; + unsigned int block_num; + CachedBlockStateEnum state; + FileBuffer fbuf; +} CachedBlock; + +#define BLK_FMT "%sblk%09u.bin" +#define GROUP_FMT "%sgrp%09u.bin" +#define PREFETCH_GROUP_LEN_MAX 32 + +typedef struct { + struct BlockDeviceHTTP *bf; + int group_num; + int n_block_num; + CachedBlock *tab_block[PREFETCH_GROUP_LEN_MAX]; +} PrefetchGroupRequest; + +/* modified data is stored per cluster (smaller than cached blocks to + avoid losing space) */ +typedef struct Cluster { + FileBuffer fbuf; +} Cluster; + +typedef struct BlockDeviceHTTP { + BlockDevice *bs; + int max_cache_size_kb; + char url[1024]; + int prefetch_count; + void (*start_cb)(void *opaque); + void *start_opaque; + + int64_t nb_sectors; + int block_size; /* in sectors, power of two */ + int nb_blocks; + struct list_head cached_blocks; /* list of CachedBlock */ + int n_cached_blocks; + int n_cached_blocks_max; + + /* write support */ + int sectors_per_cluster; /* power of two */ + Cluster **clusters; /* NULL if no written data */ + int n_clusters; + int n_allocated_clusters; + + /* statistics */ + int64_t n_read_sectors; + int64_t n_read_blocks; + int64_t n_write_sectors; + + /* current read request */ + BOOL is_write; + uint64_t sector_num; + int cur_block_num; + int sector_index, sector_count; + BlockDeviceCompletionFunc *cb; + void *opaque; + uint8_t *io_buf; + + /* prefetch */ + int prefetch_group_len; +} BlockDeviceHTTP; + +static void bf_update_block(CachedBlock *b, const uint8_t *data); +static void bf_read_onload(void *opaque, int err, void *data, size_t size); +static void bf_init_onload(void *opaque, int err, void *data, size_t size); +static void bf_prefetch_group_onload(void *opaque, int err, void *data, + size_t size); + +static CachedBlock *bf_find_block(BlockDeviceHTTP *bf, unsigned int block_num) +{ + CachedBlock *b; + struct list_head *el; + + list_for_each(el, &bf->cached_blocks) { + b = list_entry(el, CachedBlock, link); + if (b->block_num == block_num) { + /* move to front */ + if (bf->cached_blocks.next != el) { + list_del(&b->link); + list_add(&b->link, &bf->cached_blocks); + } + return b; + } + } + return NULL; +} + +static void bf_free_block(BlockDeviceHTTP *bf, CachedBlock *b) +{ + bf->n_cached_blocks--; + file_buffer_reset(&b->fbuf); + list_del(&b->link); + free(b); +} + +static CachedBlock *bf_add_block(BlockDeviceHTTP *bf, unsigned int block_num) +{ + CachedBlock *b; + if (bf->n_cached_blocks >= bf->n_cached_blocks_max) { + struct list_head *el, *el1; + /* start by looking at the least unused blocks */ + list_for_each_prev_safe(el, el1, &bf->cached_blocks) { + b = list_entry(el, CachedBlock, link); + if (b->state == CBLOCK_LOADED) { + bf_free_block(bf, b); + if (bf->n_cached_blocks < bf->n_cached_blocks_max) + break; + } + } + } + b = mallocz(sizeof(CachedBlock)); + b->bf = bf; + b->block_num = block_num; + b->state = CBLOCK_LOADING; + file_buffer_init(&b->fbuf); + file_buffer_resize(&b->fbuf, bf->block_size * 512); + list_add(&b->link, &bf->cached_blocks); + bf->n_cached_blocks++; + return b; +} + +static int64_t bf_get_sector_count(BlockDevice *bs) +{ + BlockDeviceHTTP *bf = bs->opaque; + return bf->nb_sectors; +} + +static void bf_start_load_block(BlockDevice *bs, int block_num) +{ + BlockDeviceHTTP *bf = bs->opaque; + char filename[1024]; + CachedBlock *b; + b = bf_add_block(bf, block_num); + bf->n_read_blocks++; + /* make a XHR to read the block */ +#if 0 + printf("%u,\n", block_num); +#endif +#if 0 + printf("load_blk=%d cached=%d read=%d KB (%d KB) write=%d KB (%d KB)\n", + block_num, bf->n_cached_blocks, + (int)(bf->n_read_sectors / 2), + (int)(bf->n_read_blocks * bf->block_size / 2), + (int)(bf->n_write_sectors / 2), + (int)(bf->n_allocated_clusters * bf->sectors_per_cluster / 2)); +#endif + snprintf(filename, sizeof(filename), BLK_FMT, bf->url, block_num); + // printf("wget %s\n", filename); + fs_wget(filename, NULL, NULL, b, bf_read_onload, TRUE); +} + +static void bf_start_load_prefetch_group(BlockDevice *bs, int group_num, + const int *tab_block_num, + int n_block_num) +{ + BlockDeviceHTTP *bf = bs->opaque; + CachedBlock *b; + PrefetchGroupRequest *req; + char filename[1024]; + BOOL req_flag; + int i; + + req_flag = FALSE; + req = malloc(sizeof(*req)); + req->bf = bf; + req->group_num = group_num; + req->n_block_num = n_block_num; + for(i = 0; i < n_block_num; i++) { + b = bf_find_block(bf, tab_block_num[i]); + if (!b) { + b = bf_add_block(bf, tab_block_num[i]); + req_flag = TRUE; + } else { + /* no need to read the block if it is already loading or + loaded */ + b = NULL; + } + req->tab_block[i] = b; + } + + if (req_flag) { + snprintf(filename, sizeof(filename), GROUP_FMT, bf->url, group_num); + // printf("wget %s\n", filename); + fs_wget(filename, NULL, NULL, req, bf_prefetch_group_onload, TRUE); + /* XXX: should add request in a list to free it for clean exit */ + } else { + free(req); + } +} + +static void bf_prefetch_group_onload(void *opaque, int err, void *data, + size_t size) +{ + PrefetchGroupRequest *req = opaque; + BlockDeviceHTTP *bf = req->bf; + CachedBlock *b; + int block_bytes, i; + + if (err < 0) { + fprintf(stderr, "Could not load group %u\n", req->group_num); + exit(1); + } + block_bytes = bf->block_size * 512; + assert(size == block_bytes * req->n_block_num); + for(i = 0; i < req->n_block_num; i++) { + b = req->tab_block[i]; + if (b) { + bf_update_block(b, (const uint8_t *)data + block_bytes * i); + } + } + free(req); +} + +static int bf_rw_async1(BlockDevice *bs, BOOL is_sync) +{ + BlockDeviceHTTP *bf = bs->opaque; + int offset, block_num, n, cluster_num; + CachedBlock *b; + Cluster *c; + + for(;;) { + n = bf->sector_count - bf->sector_index; + if (n == 0) + break; + cluster_num = bf->sector_num / bf->sectors_per_cluster; + c = bf->clusters[cluster_num]; + if (c) { + offset = bf->sector_num % bf->sectors_per_cluster; + n = min_int(n, bf->sectors_per_cluster - offset); + if (bf->is_write) { + file_buffer_write(&c->fbuf, offset * 512, + bf->io_buf + bf->sector_index * 512, n * 512); + } else { + file_buffer_read(&c->fbuf, offset * 512, + bf->io_buf + bf->sector_index * 512, n * 512); + } + bf->sector_index += n; + bf->sector_num += n; + } else { + block_num = bf->sector_num / bf->block_size; + offset = bf->sector_num % bf->block_size; + n = min_int(n, bf->block_size - offset); + bf->cur_block_num = block_num; + + b = bf_find_block(bf, block_num); + if (b) { + if (b->state == CBLOCK_LOADING) { + /* wait until the block is loaded */ + return 1; + } else { + if (bf->is_write) { + int cluster_size, cluster_offset; + uint8_t *buf; + /* allocate a new cluster */ + c = mallocz(sizeof(Cluster)); + cluster_size = bf->sectors_per_cluster * 512; + buf = malloc(cluster_size); + file_buffer_init(&c->fbuf); + file_buffer_resize(&c->fbuf, cluster_size); + bf->clusters[cluster_num] = c; + /* copy the cached block data to the cluster */ + cluster_offset = (cluster_num * bf->sectors_per_cluster) & + (bf->block_size - 1); + file_buffer_read(&b->fbuf, cluster_offset * 512, + buf, cluster_size); + file_buffer_write(&c->fbuf, 0, buf, cluster_size); + free(buf); + bf->n_allocated_clusters++; + continue; /* write to the allocated cluster */ + } else { + file_buffer_read(&b->fbuf, offset * 512, + bf->io_buf + bf->sector_index * 512, n * 512); + } + bf->sector_index += n; + bf->sector_num += n; + } + } else { + bf_start_load_block(bs, block_num); + return 1; + } + bf->cur_block_num = -1; + } + } + + if (!is_sync) { + // printf("end of request\n"); + /* end of request */ + bf->cb(bf->opaque, 0); + } + return 0; +} + +static void bf_update_block(CachedBlock *b, const uint8_t *data) +{ + BlockDeviceHTTP *bf = b->bf; + BlockDevice *bs = bf->bs; + + assert(b->state == CBLOCK_LOADING); + file_buffer_write(&b->fbuf, 0, data, bf->block_size * 512); + b->state = CBLOCK_LOADED; + + /* continue I/O read/write if necessary */ + if (b->block_num == bf->cur_block_num) { + bf_rw_async1(bs, FALSE); + } +} + +static void bf_read_onload(void *opaque, int err, void *data, size_t size) +{ + CachedBlock *b = opaque; + BlockDeviceHTTP *bf = b->bf; + + if (err < 0) { + fprintf(stderr, "Could not load block %u\n", b->block_num); + exit(1); + } + + assert(size == bf->block_size * 512); + bf_update_block(b, data); +} + +static int bf_read_async(BlockDevice *bs, + uint64_t sector_num, uint8_t *buf, int n, + BlockDeviceCompletionFunc *cb, void *opaque) +{ + BlockDeviceHTTP *bf = bs->opaque; + // printf("bf_read_async: sector_num=%" PRId64 " n=%d\n", sector_num, n); + bf->is_write = FALSE; + bf->sector_num = sector_num; + bf->io_buf = buf; + bf->sector_count = n; + bf->sector_index = 0; + bf->cb = cb; + bf->opaque = opaque; + bf->n_read_sectors += n; + return bf_rw_async1(bs, TRUE); +} + +static int bf_write_async(BlockDevice *bs, + uint64_t sector_num, const uint8_t *buf, int n, + BlockDeviceCompletionFunc *cb, void *opaque) +{ + BlockDeviceHTTP *bf = bs->opaque; + // printf("bf_write_async: sector_num=%" PRId64 " n=%d\n", sector_num, n); + bf->is_write = TRUE; + bf->sector_num = sector_num; + bf->io_buf = (uint8_t *)buf; + bf->sector_count = n; + bf->sector_index = 0; + bf->cb = cb; + bf->opaque = opaque; + bf->n_write_sectors += n; + return bf_rw_async1(bs, TRUE); +} + +BlockDevice *block_device_init_http(const char *url, + int max_cache_size_kb, + void (*start_cb)(void *opaque), + void *start_opaque) +{ + BlockDevice *bs; + BlockDeviceHTTP *bf; + char *p; + + bs = mallocz(sizeof(*bs)); + bf = mallocz(sizeof(*bf)); + strcpy(bf->url, url); + /* get the path with the trailing '/' */ + p = strrchr(bf->url, '/'); + if (!p) + p = bf->url; + else + p++; + *p = '\0'; + + init_list_head(&bf->cached_blocks); + bf->max_cache_size_kb = max_cache_size_kb; + bf->start_cb = start_cb; + bf->start_opaque = start_opaque; + bf->bs = bs; + + bs->opaque = bf; + bs->get_sector_count = bf_get_sector_count; + bs->read_async = bf_read_async; + bs->write_async = bf_write_async; + + fs_wget(url, NULL, NULL, bs, bf_init_onload, TRUE); + return bs; +} + +static void bf_init_onload(void *opaque, int err, void *data, size_t size) +{ + BlockDevice *bs = opaque; + BlockDeviceHTTP *bf = bs->opaque; + int block_size_kb, block_num; + JSONValue cfg, array; + + if (err < 0) { + fprintf(stderr, "Could not load block device file (err=%d)\n", -err); + exit(1); + } + + /* parse the disk image info */ + cfg = json_parse_value_len(data, size); + if (json_is_error(cfg)) { + vm_error("error: %s\n", json_get_error(cfg)); + config_error: + json_free(cfg); + exit(1); + } + + if (vm_get_int(cfg, "block_size", &block_size_kb) < 0) + goto config_error; + bf->block_size = block_size_kb * 2; + if (bf->block_size <= 0 || + (bf->block_size & (bf->block_size - 1)) != 0) { + vm_error("invalid block_size\n"); + goto config_error; + } + if (vm_get_int(cfg, "n_block", &bf->nb_blocks) < 0) + goto config_error; + if (bf->nb_blocks <= 0) { + vm_error("invalid n_block\n"); + goto config_error; + } + + bf->nb_sectors = bf->block_size * (uint64_t)bf->nb_blocks; + bf->n_cached_blocks = 0; + bf->n_cached_blocks_max = max_int(1, bf->max_cache_size_kb / block_size_kb); + bf->cur_block_num = -1; /* no request in progress */ + + bf->sectors_per_cluster = 8; /* 4 KB */ + bf->n_clusters = (bf->nb_sectors + bf->sectors_per_cluster - 1) / bf->sectors_per_cluster; + bf->clusters = mallocz(sizeof(bf->clusters[0]) * bf->n_clusters); + + if (vm_get_int_opt(cfg, "prefetch_group_len", + &bf->prefetch_group_len, 1) < 0) + goto config_error; + if (bf->prefetch_group_len > PREFETCH_GROUP_LEN_MAX) { + vm_error("prefetch_group_len is too large"); + goto config_error; + } + + array = json_object_get(cfg, "prefetch"); + if (!json_is_undefined(array)) { + int idx, prefetch_len, l, i; + JSONValue el; + int tab_block_num[PREFETCH_GROUP_LEN_MAX]; + + if (array.type != JSON_ARRAY) { + vm_error("expecting an array\n"); + goto config_error; + } + prefetch_len = array.u.array->len; + idx = 0; + while (idx < prefetch_len) { + l = min_int(prefetch_len - idx, bf->prefetch_group_len); + for(i = 0; i < l; i++) { + el = json_array_get(array, idx + i); + if (el.type != JSON_INT) { + vm_error("expecting an integer\n"); + goto config_error; + } + tab_block_num[i] = el.u.int32; + } + if (l == 1) { + block_num = tab_block_num[0]; + if (!bf_find_block(bf, block_num)) { + bf_start_load_block(bs, block_num); + } + } else { + bf_start_load_prefetch_group(bs, idx / bf->prefetch_group_len, + tab_block_num, l); + } + idx += l; + } + } + json_free(cfg); + + if (bf->start_cb) { + bf->start_cb(bf->start_opaque); + } +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c b/jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c new file mode 100644 index 0000000..db3c150 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/build_filelist.c @@ -0,0 +1,311 @@ +/* + * File list builder for RISCVEMU network filesystem + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> +#include <sys/statfs.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <dirent.h> +#include <errno.h> +#include <sys/sysmacros.h> + +#include "cutils.h" +#include "fs_utils.h" + +void print_str(FILE *f, const char *str) +{ + const char *s; + int c; + s = str; + while (*s != '\0') { + if (*s <= ' ' || *s > '~') + goto use_quote; + s++; + } + fputs(str, f); + return; + use_quote: + s = str; + fputc('"', f); + while (*s != '\0') { + c = *(uint8_t *)s; + if (c < ' ' || c == 127) { + fprintf(f, "\\x%02x", c); + } else if (c == '\\' || c == '\"') { + fprintf(f, "\\%c", c); + } else { + fputc(c, f); + } + s++; + } + fputc('"', f); +} + +#define COPY_BUF_LEN (1024 * 1024) + +static void copy_file(const char *src_filename, const char *dst_filename) +{ + uint8_t *buf; + FILE *fi, *fo; + int len; + + buf = malloc(COPY_BUF_LEN); + fi = fopen(src_filename, "rb"); + if (!fi) { + perror(src_filename); + exit(1); + } + fo = fopen(dst_filename, "wb"); + if (!fo) { + perror(dst_filename); + exit(1); + } + for(;;) { + len = fread(buf, 1, COPY_BUF_LEN, fi); + if (len == 0) + break; + fwrite(buf, 1, len, fo); + } + fclose(fo); + fclose(fi); +} + +typedef struct { + char *files_path; + uint64_t next_inode_num; + uint64_t fs_size; + uint64_t fs_max_size; + FILE *f; +} ScanState; + +static void add_file_size(ScanState *s, uint64_t size) +{ + s->fs_size += block_align(size, FS_BLOCK_SIZE); + if (s->fs_size > s->fs_max_size) { + fprintf(stderr, "Filesystem Quota exceeded (%" PRId64 " bytes)\n", s->fs_max_size); + exit(1); + } +} + +void scan_dir(ScanState *s, const char *path) +{ + FILE *f = s->f; + DIR *dirp; + struct dirent *de; + const char *name; + struct stat st; + char *path1; + uint32_t mode, v; + + dirp = opendir(path); + if (!dirp) { + perror(path); + exit(1); + } + for(;;) { + de = readdir(dirp); + if (!de) + break; + name = de->d_name; + if (!strcmp(name, ".") || !strcmp(name, "..")) + continue; + path1 = compose_path(path, name); + if (lstat(path1, &st) < 0) { + perror(path1); + exit(1); + } + + mode = st.st_mode & 0xffff; + fprintf(f, "%06o %u %u", + mode, + (int)st.st_uid, + (int)st.st_gid); + if (S_ISCHR(mode) || S_ISBLK(mode)) { + fprintf(f, " %u %u", + (int)major(st.st_rdev), + (int)minor(st.st_rdev)); + } + if (S_ISREG(mode)) { + fprintf(f, " %" PRIu64, st.st_size); + } + /* modification time (at most ms resolution) */ + fprintf(f, " %u", (int)st.st_mtim.tv_sec); + v = st.st_mtim.tv_nsec; + if (v != 0) { + fprintf(f, "."); + while (v != 0) { + fprintf(f, "%u", v / 100000000); + v = (v % 100000000) * 10; + } + } + + fprintf(f, " "); + print_str(f, name); + if (S_ISLNK(mode)) { + char buf[1024]; + int len; + len = readlink(path1, buf, sizeof(buf) - 1); + if (len < 0) { + perror("readlink"); + exit(1); + } + buf[len] = '\0'; + fprintf(f, " "); + print_str(f, buf); + } else if (S_ISREG(mode) && st.st_size > 0) { + char buf1[FILEID_SIZE_MAX], *fname; + FSFileID file_id; + file_id = s->next_inode_num++; + fprintf(f, " %" PRIx64, file_id); + file_id_to_filename(buf1, file_id); + fname = compose_path(s->files_path, buf1); + copy_file(path1, fname); + add_file_size(s, st.st_size); + } + + fprintf(f, "\n"); + if (S_ISDIR(mode)) { + scan_dir(s, path1); + } + free(path1); + } + + closedir(dirp); + fprintf(f, ".\n"); /* end of directory */ +} + +void help(void) +{ + printf("usage: build_filelist [options] source_path dest_path\n" + "\n" + "Options:\n" + "-m size_mb set the max filesystem size in MiB\n"); + exit(1); +} + +#define LOCK_FILENAME "lock" + +int main(int argc, char **argv) +{ + const char *dst_path, *src_path; + ScanState s_s, *s = &s_s; + FILE *f; + char *filename; + FSFileID root_id; + char fname[FILEID_SIZE_MAX]; + struct stat st; + uint64_t first_inode, fs_max_size; + int c; + + first_inode = 1; + fs_max_size = (uint64_t)1 << 30; + for(;;) { + c = getopt(argc, argv, "hi:m:"); + if (c == -1) + break; + switch(c) { + case 'h': + help(); + case 'i': + first_inode = strtoul(optarg, NULL, 0); + break; + case 'm': + fs_max_size = (uint64_t)strtoul(optarg, NULL, 0) << 20; + break; + default: + exit(1); + } + } + + if (optind + 1 >= argc) + help(); + src_path = argv[optind]; + dst_path = argv[optind + 1]; + + mkdir(dst_path, 0755); + + s->files_path = compose_path(dst_path, ROOT_FILENAME); + s->next_inode_num = first_inode; + s->fs_size = 0; + s->fs_max_size = fs_max_size; + + mkdir(s->files_path, 0755); + + root_id = s->next_inode_num++; + file_id_to_filename(fname, root_id); + filename = compose_path(s->files_path, fname); + f = fopen(filename, "wb"); + if (!f) { + perror(filename); + exit(1); + } + fprintf(f, "Version: 1\n"); + fprintf(f, "Revision: 1\n"); + fprintf(f, "\n"); + s->f = f; + scan_dir(s, src_path); + fclose(f); + + /* take into account the filelist size */ + if (stat(filename, &st) < 0) { + perror(filename); + exit(1); + } + add_file_size(s, st.st_size); + + free(filename); + + filename = compose_path(dst_path, HEAD_FILENAME); + f = fopen(filename, "wb"); + if (!f) { + perror(filename); + exit(1); + } + fprintf(f, "Version: 1\n"); + fprintf(f, "Revision: 1\n"); + fprintf(f, "NextFileID: %" PRIx64 "\n", s->next_inode_num); + fprintf(f, "FSFileCount: %" PRIu64 "\n", s->next_inode_num - 1); + fprintf(f, "FSSize: %" PRIu64 "\n", s->fs_size); + fprintf(f, "FSMaxSize: %" PRIu64 "\n", s->fs_max_size); + fprintf(f, "Key:\n"); /* not encrypted */ + fprintf(f, "RootID: %" PRIx64 "\n", root_id); + fclose(f); + free(filename); + + filename = compose_path(dst_path, LOCK_FILENAME); + f = fopen(filename, "wb"); + if (!f) { + perror(filename); + exit(1); + } + fclose(f); + free(filename); + + return 0; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c new file mode 100644 index 0000000..a86f90b --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.c @@ -0,0 +1,120 @@ +/* + * Misc C utilities + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> +#include <sys/time.h> +#include <ctype.h> + +#include "cutils.h" + +void *mallocz(size_t size) +{ + void *ptr; + ptr = malloc(size); + if (!ptr) + return NULL; + memset(ptr, 0, size); + return ptr; +} + +void pstrcpy(char *buf, int buf_size, const char *str) +{ + int c; + char *q = buf; + + if (buf_size <= 0) + return; + + for(;;) { + c = *str++; + if (c == 0 || q >= buf + buf_size - 1) + break; + *q++ = c; + } + *q = '\0'; +} + +char *pstrcat(char *buf, int buf_size, const char *s) +{ + int len; + len = strlen(buf); + if (len < buf_size) + pstrcpy(buf + len, buf_size - len, s); + return buf; +} + +int strstart(const char *str, const char *val, const char **ptr) +{ + const char *p, *q; + p = str; + q = val; + while (*q != '\0') { + if (*p != *q) + return 0; + p++; + q++; + } + if (ptr) + *ptr = p; + return 1; +} + +void dbuf_init(DynBuf *s) +{ + memset(s, 0, sizeof(*s)); +} + +void dbuf_write(DynBuf *s, size_t offset, const uint8_t *data, size_t len) +{ + size_t end, new_size; + new_size = end = offset + len; + if (new_size > s->allocated_size) { + new_size = max_int(new_size, s->allocated_size * 3 / 2); + s->buf = realloc(s->buf, new_size); + s->allocated_size = new_size; + } + memcpy(s->buf + offset, data, len); + if (end > s->size) + s->size = end; +} + +void dbuf_putc(DynBuf *s, uint8_t c) +{ + dbuf_write(s, s->size, &c, 1); +} + +void dbuf_putstr(DynBuf *s, const char *str) +{ + dbuf_write(s, s->size, (const uint8_t *)str, strlen(str)); +} + +void dbuf_free(DynBuf *s) +{ + free(s->buf); + memset(s, 0, sizeof(*s)); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h new file mode 100644 index 0000000..689542e --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/cutils.h @@ -0,0 +1,194 @@ +/* + * C utilities + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef CUTILS_H +#define CUTILS_H + +#include <inttypes.h> + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#define force_inline inline __attribute__((always_inline)) +#define no_inline __attribute__((noinline)) +#define __maybe_unused __attribute__((unused)) + +#define xglue(x, y) x ## y +#define glue(x, y) xglue(x, y) +#define stringify(s) tostring(s) +#define tostring(s) #s + +#ifndef offsetof +#define offsetof(type, field) ((size_t) &((type *)0)->field) +#endif +#define countof(x) (sizeof(x) / sizeof(x[0])) + +#define DLL_PUBLIC __attribute__ ((visibility ("default"))) + +#ifndef _BOOL_defined +#define _BOOL_defined +#undef FALSE +#undef TRUE + +typedef int BOOL; +enum { + FALSE = 0, + TRUE = 1, +}; +#endif + +/* this test works at least with gcc */ +#if defined(__SIZEOF_INT128__) +#define HAVE_INT128 +#endif + +#ifdef HAVE_INT128 +typedef __int128 int128_t; +typedef unsigned __int128 uint128_t; +#endif + +static inline int max_int(int a, int b) +{ + if (a > b) + return a; + else + return b; +} + +static inline int min_int(int a, int b) +{ + if (a < b) + return a; + else + return b; +} + +void *mallocz(size_t size); + +#if defined(_WIN32) +static inline uint32_t bswap_32(uint32_t v) +{ + return ((v & 0xff000000) >> 24) | ((v & 0x00ff0000) >> 8) | + ((v & 0x0000ff00) << 8) | ((v & 0x000000ff) << 24); +} +#else +#include <byteswap.h> +#endif + +static inline uint16_t get_le16(const uint8_t *ptr) +{ + return ptr[0] | (ptr[1] << 8); +} + +static inline uint32_t get_le32(const uint8_t *ptr) +{ + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +static inline uint64_t get_le64(const uint8_t *ptr) +{ + return get_le32(ptr) | ((uint64_t)get_le32(ptr + 4) << 32); +} + +static inline void put_le16(uint8_t *ptr, uint16_t v) +{ + ptr[0] = v; + ptr[1] = v >> 8; +} + +static inline void put_le32(uint8_t *ptr, uint32_t v) +{ + ptr[0] = v; + ptr[1] = v >> 8; + ptr[2] = v >> 16; + ptr[3] = v >> 24; +} + +static inline void put_le64(uint8_t *ptr, uint64_t v) +{ + put_le32(ptr, v); + put_le32(ptr + 4, v >> 32); +} + +static inline uint32_t get_be32(const uint8_t *d) +{ + return (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3]; +} + +static inline void put_be32(uint8_t *d, uint32_t v) +{ + d[0] = v >> 24; + d[1] = v >> 16; + d[2] = v >> 8; + d[3] = v >> 0; +} + +static inline void put_be64(uint8_t *d, uint64_t v) +{ + put_be32(d, v >> 32); + put_be32(d + 4, v); +} + +#ifdef WORDS_BIGENDIAN +static inline uint32_t cpu_to_be32(uint32_t v) +{ + return v; +} +#else +static inline uint32_t cpu_to_be32(uint32_t v) +{ + return bswap_32(v); +} +#endif + +/* XXX: optimize */ +static inline int ctz32(uint32_t a) +{ + int i; + if (a == 0) + return 32; + for(i = 0; i < 32; i++) { + if ((a >> i) & 1) + return i; + } + return 32; +} + + +void *mallocz(size_t size); +void pstrcpy(char *buf, int buf_size, const char *str); +char *pstrcat(char *buf, int buf_size, const char *s); +int strstart(const char *str, const char *val, const char **ptr); + +typedef struct { + uint8_t *buf; + size_t size; + size_t allocated_size; +} DynBuf; + +void dbuf_init(DynBuf *s); +void dbuf_write(DynBuf *s, size_t offset, const uint8_t *data, size_t len); +void dbuf_putc(DynBuf *s, uint8_t c); +void dbuf_putstr(DynBuf *s, const char *str); +void dbuf_free(DynBuf *s); + +#endif /* CUTILS_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h new file mode 100644 index 0000000..9736a49 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fbuf.h @@ -0,0 +1,22 @@ +#ifndef FBUF_H +#define FBUF_H + +typedef struct { +#if defined(EMSCRIPTEN) + int handle; +#else + uint8_t *data; +#endif + size_t allocated_size; +} FileBuffer; + +void file_buffer_init(FileBuffer *bs); +void file_buffer_reset(FileBuffer *bs); +int file_buffer_resize(FileBuffer *bs, size_t new_size); +void file_buffer_write(FileBuffer *bs, size_t offset, const uint8_t *buf, + size_t size); +void file_buffer_set(FileBuffer *bs, size_t offset, int val, size_t size); +void file_buffer_read(FileBuffer *bs, size_t offset, uint8_t *buf, + size_t size); + +#endif /* FBUF_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.c new file mode 100644 index 0000000..7f92d82 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.c @@ -0,0 +1,104 @@ +/* + * Filesystem utilities + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> + +#include "cutils.h" +#include "fs.h" + +FSFile *fs_dup(FSDevice *fs, FSFile *f) +{ + FSQID qid; + fs->fs_walk(fs, &f, &qid, f, 0, NULL); + return f; +} + +FSFile *fs_walk_path1(FSDevice *fs, FSFile *f, const char *path, + char **pname) +{ + const char *p; + char *name; + FSFile *f1; + FSQID qid; + int len, ret; + BOOL is_last, is_first; + + if (path[0] == '/') + path++; + + is_first = TRUE; + for(;;) { + p = strchr(path, '/'); + if (!p) { + name = (char *)path; + if (pname) { + *pname = name; + if (is_first) { + ret = fs->fs_walk(fs, &f, &qid, f, 0, NULL); + if (ret < 0) + f = NULL; + } + return f; + } + is_last = TRUE; + } else { + len = p - path; + name = malloc(len + 1); + memcpy(name, path, len); + name[len] = '\0'; + is_last = FALSE; + } + ret = fs->fs_walk(fs, &f1, &qid, f, 1, &name); + if (!is_last) + free(name); + if (!is_first) + fs->fs_delete(fs, f); + f = f1; + is_first = FALSE; + if (ret <= 0) { + fs->fs_delete(fs, f); + f = NULL; + break; + } else if (is_last) { + break; + } + path = p + 1; + } + return f; +} + +FSFile *fs_walk_path(FSDevice *fs, FSFile *f, const char *path) +{ + return fs_walk_path1(fs, f, path, NULL); +} + +void fs_end(FSDevice *fs) +{ + fs->fs_end(fs); + free(fs); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.h new file mode 100644 index 0000000..4c38e84 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs.h @@ -0,0 +1,211 @@ +/* + * Filesystem abstraction + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* FSQID.type */ +#define P9_QTDIR 0x80 +#define P9_QTAPPEND 0x40 +#define P9_QTEXCL 0x20 +#define P9_QTMOUNT 0x10 +#define P9_QTAUTH 0x08 +#define P9_QTTMP 0x04 +#define P9_QTSYMLINK 0x02 +#define P9_QTLINK 0x01 +#define P9_QTFILE 0x00 + +/* mode bits */ +#define P9_S_IRWXUGO 0x01FF +#define P9_S_ISVTX 0x0200 +#define P9_S_ISGID 0x0400 +#define P9_S_ISUID 0x0800 + +#define P9_S_IFMT 0xF000 +#define P9_S_IFIFO 0x1000 +#define P9_S_IFCHR 0x2000 +#define P9_S_IFDIR 0x4000 +#define P9_S_IFBLK 0x6000 +#define P9_S_IFREG 0x8000 +#define P9_S_IFLNK 0xA000 +#define P9_S_IFSOCK 0xC000 + +/* flags for lopen()/lcreate() */ +#define P9_O_RDONLY 0x00000000 +#define P9_O_WRONLY 0x00000001 +#define P9_O_RDWR 0x00000002 +#define P9_O_NOACCESS 0x00000003 +#define P9_O_CREAT 0x00000040 +#define P9_O_EXCL 0x00000080 +#define P9_O_NOCTTY 0x00000100 +#define P9_O_TRUNC 0x00000200 +#define P9_O_APPEND 0x00000400 +#define P9_O_NONBLOCK 0x00000800 +#define P9_O_DSYNC 0x00001000 +#define P9_O_FASYNC 0x00002000 +#define P9_O_DIRECT 0x00004000 +#define P9_O_LARGEFILE 0x00008000 +#define P9_O_DIRECTORY 0x00010000 +#define P9_O_NOFOLLOW 0x00020000 +#define P9_O_NOATIME 0x00040000 +#define P9_O_CLOEXEC 0x00080000 +#define P9_O_SYNC 0x00100000 + +/* for fs_setattr() */ +#define P9_SETATTR_MODE 0x00000001 +#define P9_SETATTR_UID 0x00000002 +#define P9_SETATTR_GID 0x00000004 +#define P9_SETATTR_SIZE 0x00000008 +#define P9_SETATTR_ATIME 0x00000010 +#define P9_SETATTR_MTIME 0x00000020 +#define P9_SETATTR_CTIME 0x00000040 +#define P9_SETATTR_ATIME_SET 0x00000080 +#define P9_SETATTR_MTIME_SET 0x00000100 + +#define P9_EPERM 1 +#define P9_ENOENT 2 +#define P9_EIO 5 +#define P9_EEXIST 17 +#define P9_ENOTDIR 20 +#define P9_EINVAL 22 +#define P9_ENOSPC 28 +#define P9_ENOTEMPTY 39 +#define P9_EPROTO 71 +#define P9_ENOTSUP 524 + +typedef struct FSDevice FSDevice; +typedef struct FSFile FSFile; + +typedef struct { + uint32_t f_bsize; + uint64_t f_blocks; + uint64_t f_bfree; + uint64_t f_bavail; + uint64_t f_files; + uint64_t f_ffree; +} FSStatFS; + +typedef struct { + uint8_t type; /* P9_IFx */ + uint32_t version; + uint64_t path; +} FSQID; + +typedef struct { + FSQID qid; + uint32_t st_mode; + uint32_t st_uid; + uint32_t st_gid; + uint64_t st_nlink; + uint64_t st_rdev; + uint64_t st_size; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_atime_sec; + uint32_t st_atime_nsec; + uint64_t st_mtime_sec; + uint32_t st_mtime_nsec; + uint64_t st_ctime_sec; + uint32_t st_ctime_nsec; +} FSStat; + +#define P9_LOCK_TYPE_RDLCK 0 +#define P9_LOCK_TYPE_WRLCK 1 +#define P9_LOCK_TYPE_UNLCK 2 + +#define P9_LOCK_FLAGS_BLOCK 1 +#define P9_LOCK_FLAGS_RECLAIM 2 + +#define P9_LOCK_SUCCESS 0 +#define P9_LOCK_BLOCKED 1 +#define P9_LOCK_ERROR 2 +#define P9_LOCK_GRACE 3 + +#define FSCMD_NAME ".fscmd" + +typedef struct { + uint8_t type; + uint32_t flags; + uint64_t start; + uint64_t length; + uint32_t proc_id; + char *client_id; +} FSLock; + +typedef void FSOpenCompletionFunc(FSDevice *fs, FSQID *qid, int err, + void *opaque); + +struct FSDevice { + void (*fs_end)(FSDevice *s); + void (*fs_delete)(FSDevice *s, FSFile *f); + void (*fs_statfs)(FSDevice *fs, FSStatFS *st); + int (*fs_attach)(FSDevice *fs, FSFile **pf, FSQID *qid, uint32_t uid, + const char *uname, const char *aname); + int (*fs_walk)(FSDevice *fs, FSFile **pf, FSQID *qids, + FSFile *f, int n, char **names); + int (*fs_mkdir)(FSDevice *fs, FSQID *qid, FSFile *f, + const char *name, uint32_t mode, uint32_t gid); + int (*fs_open)(FSDevice *fs, FSQID *qid, FSFile *f, uint32_t flags, + FSOpenCompletionFunc *cb, void *opaque); + int (*fs_create)(FSDevice *fs, FSQID *qid, FSFile *f, const char *name, + uint32_t flags, uint32_t mode, uint32_t gid); + int (*fs_stat)(FSDevice *fs, FSFile *f, FSStat *st); + int (*fs_setattr)(FSDevice *fs, FSFile *f, uint32_t mask, + uint32_t mode, uint32_t uid, uint32_t gid, + uint64_t size, uint64_t atime_sec, uint64_t atime_nsec, + uint64_t mtime_sec, uint64_t mtime_nsec); + void (*fs_close)(FSDevice *fs, FSFile *f); + int (*fs_readdir)(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int count); + int (*fs_read)(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int count); + int (*fs_write)(FSDevice *fs, FSFile *f, uint64_t offset, + const uint8_t *buf, int count); + int (*fs_link)(FSDevice *fs, FSFile *df, FSFile *f, const char *name); + int (*fs_symlink)(FSDevice *fs, FSQID *qid, + FSFile *f, const char *name, const char *symgt, uint32_t gid); + int (*fs_mknod)(FSDevice *fs, FSQID *qid, + FSFile *f, const char *name, uint32_t mode, uint32_t major, + uint32_t minor, uint32_t gid); + int (*fs_readlink)(FSDevice *fs, char *buf, int buf_size, FSFile *f); + int (*fs_renameat)(FSDevice *fs, FSFile *f, const char *name, + FSFile *new_f, const char *new_name); + int (*fs_unlinkat)(FSDevice *fs, FSFile *f, const char *name); + int (*fs_lock)(FSDevice *fs, FSFile *f, const FSLock *lock); + int (*fs_getlock)(FSDevice *fs, FSFile *f, FSLock *lock); +}; + +FSDevice *fs_disk_init(const char *root_path); +FSDevice *fs_mem_init(void); +FSDevice *fs_net_init(const char *url, void (*start)(void *opaque), void *opaque); +void fs_net_set_pwd(FSDevice *fs, const char *pwd); +#ifdef EMSCRIPTEN +void fs_import_file(const char *filename, uint8_t *buf, int buf_len); +#endif +void fs_export_file(const char *filename, + const uint8_t *buf, int buf_len); +void fs_end(FSDevice *fs); +void fs_dump_cache_load(FSDevice *fs1, const char *filename); + +FSFile *fs_dup(FSDevice *fs, FSFile *f); +FSFile *fs_walk_path1(FSDevice *fs, FSFile *f, const char *path, + char **pname); +FSFile *fs_walk_path(FSDevice *fs, FSFile *f, const char *path); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c new file mode 100644 index 0000000..bf96c89 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_disk.c @@ -0,0 +1,659 @@ +/* + * Filesystem on disk + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> +#include <sys/statfs.h> +#include <sys/stat.h> +#include <sys/sysmacros.h> +#include <unistd.h> +#include <fcntl.h> +#include <dirent.h> +#include <errno.h> + +#include "cutils.h" +#include "list.h" +#include "fs.h" + +typedef struct { + FSDevice common; + char *root_path; +} FSDeviceDisk; + +static void fs_close(FSDevice *fs, FSFile *f); + +struct FSFile { + uint32_t uid; + char *path; /* complete path */ + BOOL is_opened; + BOOL is_dir; + union { + int fd; + DIR *dirp; + } u; +}; + +static void fs_delete(FSDevice *fs, FSFile *f) +{ + if (f->is_opened) + fs_close(fs, f); + free(f->path); + free(f); +} + +/* warning: path belong to fid_create() */ +static FSFile *fid_create(FSDevice *s1, char *path, uint32_t uid) +{ + FSFile *f; + f = mallocz(sizeof(*f)); + f->path = path; + f->uid = uid; + return f; +} + + +static int errno_table[][2] = { + { P9_EPERM, EPERM }, + { P9_ENOENT, ENOENT }, + { P9_EIO, EIO }, + { P9_EEXIST, EEXIST }, + { P9_EINVAL, EINVAL }, + { P9_ENOSPC, ENOSPC }, + { P9_ENOTEMPTY, ENOTEMPTY }, + { P9_EPROTO, EPROTO }, + { P9_ENOTSUP, ENOTSUP }, +}; + +static int errno_to_p9(int err) +{ + int i; + if (err == 0) + return 0; + for(i = 0; i < countof(errno_table); i++) { + if (err == errno_table[i][1]) + return errno_table[i][0]; + } + return P9_EINVAL; +} + +static int open_flags[][2] = { + { P9_O_CREAT, O_CREAT }, + { P9_O_EXCL, O_EXCL }, + // { P9_O_NOCTTY, O_NOCTTY }, + { P9_O_TRUNC, O_TRUNC }, + { P9_O_APPEND, O_APPEND }, + { P9_O_NONBLOCK, O_NONBLOCK }, + { P9_O_DSYNC, O_DSYNC }, + // { P9_O_FASYNC, O_FASYNC }, + // { P9_O_DIRECT, O_DIRECT }, + // { P9_O_LARGEFILE, O_LARGEFILE }, + // { P9_O_DIRECTORY, O_DIRECTORY }, + { P9_O_NOFOLLOW, O_NOFOLLOW }, + // { P9_O_NOATIME, O_NOATIME }, + // { P9_O_CLOEXEC, O_CLOEXEC }, + { P9_O_SYNC, O_SYNC }, +}; + +static int p9_flags_to_host(int flags) +{ + int ret, i; + + ret = (flags & P9_O_NOACCESS); + for(i = 0; i < countof(open_flags); i++) { + if (flags & open_flags[i][0]) + ret |= open_flags[i][1]; + } + return ret; +} + +static void stat_to_qid(FSQID *qid, const struct stat *st) +{ + if (S_ISDIR(st->st_mode)) + qid->type = P9_QTDIR; + else if (S_ISLNK(st->st_mode)) + qid->type = P9_QTSYMLINK; + else + qid->type = P9_QTFILE; + qid->version = 0; /* no caching on client */ + qid->path = st->st_ino; +} + +static void fs_statfs(FSDevice *fs1, FSStatFS *st) +{ + FSDeviceDisk *fs = (FSDeviceDisk *)fs1; + struct statfs st1; + statfs(fs->root_path, &st1); + st->f_bsize = st1.f_bsize; + st->f_blocks = st1.f_blocks; + st->f_bfree = st1.f_bfree; + st->f_bavail = st1.f_bavail; + st->f_files = st1.f_files; + st->f_ffree = st1.f_ffree; +} + +static char *compose_path(const char *path, const char *name) +{ + int path_len, name_len; + char *d; + + path_len = strlen(path); + name_len = strlen(name); + d = malloc(path_len + 1 + name_len + 1); + memcpy(d, path, path_len); + d[path_len] = '/'; + memcpy(d + path_len + 1, name, name_len + 1); + return d; +} + +static int fs_attach(FSDevice *fs1, FSFile **pf, + FSQID *qid, uint32_t uid, + const char *uname, const char *aname) +{ + FSDeviceDisk *fs = (FSDeviceDisk *)fs1; + struct stat st; + FSFile *f; + + if (lstat(fs->root_path, &st) != 0) { + *pf = NULL; + return -errno_to_p9(errno); + } + f = fid_create(fs1, strdup(fs->root_path), uid); + stat_to_qid(qid, &st); + *pf = f; + return 0; +} + +static int fs_walk(FSDevice *fs, FSFile **pf, FSQID *qids, + FSFile *f, int n, char **names) +{ + char *path, *path1; + struct stat st; + int i; + + path = strdup(f->path); + for(i = 0; i < n; i++) { + path1 = compose_path(path, names[i]); + if (lstat(path1, &st) != 0) { + free(path1); + break; + } + free(path); + path = path1; + stat_to_qid(&qids[i], &st); + } + *pf = fid_create(fs, path, f->uid); + return i; +} + + +static int fs_mkdir(FSDevice *fs, FSQID *qid, FSFile *f, + const char *name, uint32_t mode, uint32_t gid) +{ + char *path; + struct stat st; + + path = compose_path(f->path, name); + if (mkdir(path, mode) < 0) { + free(path); + return -errno_to_p9(errno); + } + if (lstat(path, &st) != 0) { + free(path); + return -errno_to_p9(errno); + } + free(path); + stat_to_qid(qid, &st); + return 0; +} + +static int fs_open(FSDevice *fs, FSQID *qid, FSFile *f, uint32_t flags, + FSOpenCompletionFunc *cb, void *opaque) +{ + struct stat st; + fs_close(fs, f); + + if (stat(f->path, &st) != 0) + return -errno_to_p9(errno); + stat_to_qid(qid, &st); + + if (flags & P9_O_DIRECTORY) { + DIR *dirp; + dirp = opendir(f->path); + if (!dirp) + return -errno_to_p9(errno); + f->is_opened = TRUE; + f->is_dir = TRUE; + f->u.dirp = dirp; + } else { + int fd; + fd = open(f->path, p9_flags_to_host(flags) & ~O_CREAT); + if (fd < 0) + return -errno_to_p9(errno); + f->is_opened = TRUE; + f->is_dir = FALSE; + f->u.fd = fd; + } + return 0; +} + +static int fs_create(FSDevice *fs, FSQID *qid, FSFile *f, const char *name, + uint32_t flags, uint32_t mode, uint32_t gid) +{ + struct stat st; + char *path; + int ret, fd; + + fs_close(fs, f); + + path = compose_path(f->path, name); + fd = open(path, p9_flags_to_host(flags) | O_CREAT, mode); + if (fd < 0) { + free(path); + return -errno_to_p9(errno); + } + ret = lstat(path, &st); + if (ret != 0) { + free(path); + close(fd); + return -errno_to_p9(errno); + } + free(f->path); + f->path = path; + f->is_opened = TRUE; + f->is_dir = FALSE; + f->u.fd = fd; + stat_to_qid(qid, &st); + return 0; +} + +static int fs_readdir(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int count) +{ + struct dirent *de; + int len, pos, name_len, type, d_type; + + if (!f->is_opened || !f->is_dir) + return -P9_EPROTO; + if (offset == 0) + rewinddir(f->u.dirp); + else + seekdir(f->u.dirp, offset); + pos = 0; + for(;;) { + de = readdir(f->u.dirp); + if (de == NULL) + break; + name_len = strlen(de->d_name); + len = 13 + 8 + 1 + 2 + name_len; + if ((pos + len) > count) + break; + offset = telldir(f->u.dirp); + d_type = de->d_type; + if (d_type == DT_UNKNOWN) { + char *path; + struct stat st; + path = compose_path(f->path, de->d_name); + if (lstat(path, &st) == 0) { + d_type = st.st_mode >> 12; + } else { + d_type = DT_REG; /* default */ + } + free(path); + } + if (d_type == DT_DIR) + type = P9_QTDIR; + else if (d_type == DT_LNK) + type = P9_QTSYMLINK; + else + type = P9_QTFILE; + buf[pos++] = type; + put_le32(buf + pos, 0); /* version */ + pos += 4; + put_le64(buf + pos, de->d_ino); + pos += 8; + put_le64(buf + pos, offset); + pos += 8; + buf[pos++] = d_type; + put_le16(buf + pos, name_len); + pos += 2; + memcpy(buf + pos, de->d_name, name_len); + pos += name_len; + } + return pos; +} + +static int fs_read(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int count) +{ + int ret; + + if (!f->is_opened || f->is_dir) + return -P9_EPROTO; + ret = pread(f->u.fd, buf, count, offset); + if (ret < 0) + return -errno_to_p9(errno); + else + return ret; +} + +static int fs_write(FSDevice *fs, FSFile *f, uint64_t offset, + const uint8_t *buf, int count) +{ + int ret; + + if (!f->is_opened || f->is_dir) + return -P9_EPROTO; + ret = pwrite(f->u.fd, buf, count, offset); + if (ret < 0) + return -errno_to_p9(errno); + else + return ret; +} + +static void fs_close(FSDevice *fs, FSFile *f) +{ + if (!f->is_opened) + return; + if (f->is_dir) + closedir(f->u.dirp); + else + close(f->u.fd); + f->is_opened = FALSE; +} + +static int fs_stat(FSDevice *fs, FSFile *f, FSStat *st) +{ + struct stat st1; + + if (lstat(f->path, &st1) != 0) + return -P9_ENOENT; + stat_to_qid(&st->qid, &st1); + st->st_mode = st1.st_mode; + st->st_uid = st1.st_uid; + st->st_gid = st1.st_gid; + st->st_nlink = st1.st_nlink; + st->st_rdev = st1.st_rdev; + st->st_size = st1.st_size; + st->st_blksize = st1.st_blksize; + st->st_blocks = st1.st_blocks; + st->st_atime_sec = st1.st_atim.tv_sec; + st->st_atime_nsec = st1.st_atim.tv_nsec; + st->st_mtime_sec = st1.st_mtim.tv_sec; + st->st_mtime_nsec = st1.st_mtim.tv_nsec; + st->st_ctime_sec = st1.st_ctim.tv_sec; + st->st_ctime_nsec = st1.st_ctim.tv_nsec; + return 0; +} + +static int fs_setattr(FSDevice *fs, FSFile *f, uint32_t mask, + uint32_t mode, uint32_t uid, uint32_t gid, + uint64_t size, uint64_t atime_sec, uint64_t atime_nsec, + uint64_t mtime_sec, uint64_t mtime_nsec) +{ + BOOL ctime_updated = FALSE; + + if (mask & (P9_SETATTR_UID | P9_SETATTR_GID)) { + if (lchown(f->path, (mask & P9_SETATTR_UID) ? uid : -1, + (mask & P9_SETATTR_GID) ? gid : -1) < 0) + return -errno_to_p9(errno); + ctime_updated = TRUE; + } + /* must be done after uid change for suid */ + if (mask & P9_SETATTR_MODE) { + if (chmod(f->path, mode) < 0) + return -errno_to_p9(errno); + ctime_updated = TRUE; + } + if (mask & P9_SETATTR_SIZE) { + if (truncate(f->path, size) < 0) + return -errno_to_p9(errno); + ctime_updated = TRUE; + } + if (mask & (P9_SETATTR_ATIME | P9_SETATTR_MTIME)) { + struct timespec ts[2]; + if (mask & P9_SETATTR_ATIME) { + if (mask & P9_SETATTR_ATIME_SET) { + ts[0].tv_sec = atime_sec; + ts[0].tv_nsec = atime_nsec; + } else { + ts[0].tv_sec = 0; + ts[0].tv_nsec = UTIME_NOW; + } + } else { + ts[0].tv_sec = 0; + ts[0].tv_nsec = UTIME_OMIT; + } + if (mask & P9_SETATTR_MTIME) { + if (mask & P9_SETATTR_MTIME_SET) { + ts[1].tv_sec = mtime_sec; + ts[1].tv_nsec = mtime_nsec; + } else { + ts[1].tv_sec = 0; + ts[1].tv_nsec = UTIME_NOW; + } + } else { + ts[1].tv_sec = 0; + ts[1].tv_nsec = UTIME_OMIT; + } + if (utimensat(AT_FDCWD, f->path, ts, AT_SYMLINK_NOFOLLOW) < 0) + return -errno_to_p9(errno); + ctime_updated = TRUE; + } + if ((mask & P9_SETATTR_CTIME) && !ctime_updated) { + if (lchown(f->path, -1, -1) < 0) + return -errno_to_p9(errno); + } + return 0; +} + +static int fs_link(FSDevice *fs, FSFile *df, FSFile *f, const char *name) +{ + char *path; + + path = compose_path(df->path, name); + if (link(f->path, path) < 0) { + free(path); + return -errno_to_p9(errno); + } + free(path); + return 0; +} + +static int fs_symlink(FSDevice *fs, FSQID *qid, + FSFile *f, const char *name, const char *symgt, uint32_t gid) +{ + char *path; + struct stat st; + + path = compose_path(f->path, name); + if (symlink(symgt, path) < 0) { + free(path); + return -errno_to_p9(errno); + } + if (lstat(path, &st) != 0) { + free(path); + return -errno_to_p9(errno); + } + free(path); + stat_to_qid(qid, &st); + return 0; +} + +static int fs_mknod(FSDevice *fs, FSQID *qid, + FSFile *f, const char *name, uint32_t mode, uint32_t major, + uint32_t minor, uint32_t gid) +{ + char *path; + struct stat st; + + path = compose_path(f->path, name); + if (mknod(path, mode, makedev(major, minor)) < 0) { + free(path); + return -errno_to_p9(errno); + } + if (lstat(path, &st) != 0) { + free(path); + return -errno_to_p9(errno); + } + free(path); + stat_to_qid(qid, &st); + return 0; +} + +static int fs_readlink(FSDevice *fs, char *buf, int buf_size, FSFile *f) +{ + int ret; + ret = readlink(f->path, buf, buf_size - 1); + if (ret < 0) + return -errno_to_p9(errno); + buf[ret] = '\0'; + return 0; +} + +static int fs_renameat(FSDevice *fs, FSFile *f, const char *name, + FSFile *new_f, const char *new_name) +{ + char *path, *new_path; + int ret; + + path = compose_path(f->path, name); + new_path = compose_path(new_f->path, new_name); + ret = rename(path, new_path); + free(path); + free(new_path); + if (ret < 0) + return -errno_to_p9(errno); + return 0; +} + +static int fs_unlinkat(FSDevice *fs, FSFile *f, const char *name) +{ + char *path; + int ret; + + path = compose_path(f->path, name); + ret = remove(path); + free(path); + if (ret < 0) + return -errno_to_p9(errno); + return 0; + +} + +static int fs_lock(FSDevice *fs, FSFile *f, const FSLock *lock) +{ + int ret; + struct flock fl; + + /* XXX: lock directories too */ + if (!f->is_opened || f->is_dir) + return -P9_EPROTO; + + fl.l_type = lock->type; + fl.l_whence = SEEK_SET; + fl.l_start = lock->start; + fl.l_len = lock->length; + + ret = fcntl(f->u.fd, F_SETLK, &fl); + if (ret == 0) { + ret = P9_LOCK_SUCCESS; + } else if (errno == EAGAIN || errno == EACCES) { + ret = P9_LOCK_BLOCKED; + } else { + ret = -errno_to_p9(errno); + } + return ret; +} + +static int fs_getlock(FSDevice *fs, FSFile *f, FSLock *lock) +{ + int ret; + struct flock fl; + + /* XXX: lock directories too */ + if (!f->is_opened || f->is_dir) + return -P9_EPROTO; + + fl.l_type = lock->type; + fl.l_whence = SEEK_SET; + fl.l_start = lock->start; + fl.l_len = lock->length; + + ret = fcntl(f->u.fd, F_GETLK, &fl); + if (ret < 0) { + ret = -errno_to_p9(errno); + } else { + lock->type = fl.l_type; + lock->start = fl.l_start; + lock->length = fl.l_len; + } + return ret; +} + +static void fs_disk_end(FSDevice *fs1) +{ + FSDeviceDisk *fs = (FSDeviceDisk *)fs1; + free(fs->root_path); +} + +FSDevice *fs_disk_init(const char *root_path) +{ + FSDeviceDisk *fs; + struct stat st; + + lstat(root_path, &st); + if (!S_ISDIR(st.st_mode)) + return NULL; + + fs = mallocz(sizeof(*fs)); + + fs->common.fs_end = fs_disk_end; + fs->common.fs_delete = fs_delete; + fs->common.fs_statfs = fs_statfs; + fs->common.fs_attach = fs_attach; + fs->common.fs_walk = fs_walk; + fs->common.fs_mkdir = fs_mkdir; + fs->common.fs_open = fs_open; + fs->common.fs_create = fs_create; + fs->common.fs_stat = fs_stat; + fs->common.fs_setattr = fs_setattr; + fs->common.fs_close = fs_close; + fs->common.fs_readdir = fs_readdir; + fs->common.fs_read = fs_read; + fs->common.fs_write = fs_write; + fs->common.fs_link = fs_link; + fs->common.fs_symlink = fs_symlink; + fs->common.fs_mknod = fs_mknod; + fs->common.fs_readlink = fs_readlink; + fs->common.fs_renameat = fs_renameat; + fs->common.fs_unlinkat = fs_unlinkat; + fs->common.fs_lock = fs_lock; + fs->common.fs_getlock = fs_getlock; + + fs->root_path = strdup(root_path); + return (FSDevice *)fs; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c new file mode 100644 index 0000000..c7c7484 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_net.c @@ -0,0 +1,2910 @@ +/* + * Networked Filesystem using HTTP + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> +#include <sys/time.h> +#include <ctype.h> + +#include "cutils.h" +#include "list.h" +#include "fs.h" +#include "fs_utils.h" +#include "fs_wget.h" +#include "fbuf.h" + +#if defined(EMSCRIPTEN) +#include <emscripten.h> +#endif + +/* + TODO: + - implement fs_lock/fs_getlock + - update fs_size with links ? + - limit fs_size in dirent creation + - limit filename length +*/ + +//#define DEBUG_CACHE +#if !defined(EMSCRIPTEN) +#define DUMP_CACHE_LOAD +#endif + +#if defined(EMSCRIPTEN) +#define DEFAULT_INODE_CACHE_SIZE (64 * 1024 * 1024) +#else +#define DEFAULT_INODE_CACHE_SIZE (256 * 1024 * 1024) +#endif + +typedef enum { + FT_FIFO = 1, + FT_CHR = 2, + FT_DIR = 4, + FT_BLK = 6, + FT_REG = 8, + FT_LNK = 10, + FT_SOCK = 12, +} FSINodeTypeEnum; + +typedef enum { + REG_STATE_LOCAL, /* local content */ + REG_STATE_UNLOADED, /* content not loaded */ + REG_STATE_LOADING, /* content is being loaded */ + REG_STATE_LOADED, /* loaded, not modified, stored in cached_inode_list */ +} FSINodeRegStateEnum; + +typedef struct FSBaseURL { + struct list_head link; + int ref_count; + char *base_url_id; + char *url; + char *user; + char *password; + BOOL encrypted; + AES_KEY aes_state; +} FSBaseURL; + +typedef struct FSINode { + struct list_head link; + uint64_t inode_num; /* inode number */ + int32_t refcount; + int32_t open_count; + FSINodeTypeEnum type; + uint32_t mode; + uint32_t uid; + uint32_t gid; + uint32_t mtime_sec; + uint32_t ctime_sec; + uint32_t mtime_nsec; + uint32_t ctime_nsec; + union { + struct { + FSINodeRegStateEnum state; + size_t size; /* real file size */ + FileBuffer fbuf; + FSBaseURL *base_url; + FSFileID file_id; /* network file ID */ + struct list_head link; + struct FSOpenInfo *open_info; /* used in LOADING state */ + BOOL is_fscmd; +#ifdef DUMP_CACHE_LOAD + char *filename; +#endif + } reg; + struct { + struct list_head de_list; /* list of FSDirEntry */ + int size; + } dir; + struct { + uint32_t major; + uint32_t minor; + } dev; + struct { + char *name; + } symlink; + } u; +} FSINode; + +typedef struct { + struct list_head link; + FSINode *inode; + uint8_t mark; /* temporary use only */ + char name[0]; +} FSDirEntry; + +typedef enum { + FS_CMD_XHR, + FS_CMD_PBKDF2, +} FSCMDRequestEnum; + +#define FS_CMD_REPLY_LEN_MAX 64 + +typedef struct { + FSCMDRequestEnum type; + struct CmdXHRState *xhr_state; + int reply_len; + uint8_t reply_buf[FS_CMD_REPLY_LEN_MAX]; +} FSCMDRequest; + +struct FSFile { + uint32_t uid; + FSINode *inode; + BOOL is_opened; + uint32_t open_flags; + FSCMDRequest *req; +}; + +typedef struct { + struct list_head link; + BOOL is_archive; + const char *name; +} PreloadFile; + +typedef struct { + struct list_head link; + FSFileID file_id; + struct list_head file_list; /* list of PreloadFile.link */ +} PreloadEntry; + +typedef struct { + struct list_head link; + FSFileID file_id; + uint64_t size; + const char *name; +} PreloadArchiveFile; + +typedef struct { + struct list_head link; + const char *name; + struct list_head file_list; /* list of PreloadArchiveFile.link */ +} PreloadArchive; + +typedef struct FSDeviceMem { + FSDevice common; + + struct list_head inode_list; /* list of FSINode */ + int64_t inode_count; /* current number of inodes */ + uint64_t inode_limit; + int64_t fs_blocks; + uint64_t fs_max_blocks; + uint64_t inode_num_alloc; + int block_size_log2; + uint32_t block_size; /* for stat/statfs */ + FSINode *root_inode; + struct list_head inode_cache_list; /* list of FSINode.u.reg.link */ + int64_t inode_cache_size; + int64_t inode_cache_size_limit; + struct list_head preload_list; /* list of PreloadEntry.link */ + struct list_head preload_archive_list; /* list of PreloadArchive.link */ + /* network */ + struct list_head base_url_list; /* list of FSBaseURL.link */ + char *import_dir; +#ifdef DUMP_CACHE_LOAD + BOOL dump_cache_load; + BOOL dump_started; + char *dump_preload_dir; + FILE *dump_preload_file; + FILE *dump_preload_archive_file; + + char *dump_archive_name; + uint64_t dump_archive_size; + FILE *dump_archive_file; + + int dump_archive_num; + struct list_head dump_preload_list; /* list of PreloadFile.link */ + struct list_head dump_exclude_list; /* list of PreloadFile.link */ +#endif +} FSDeviceMem; + +typedef enum { + FS_OPEN_WGET_REG, + FS_OPEN_WGET_ARCHIVE, + FS_OPEN_WGET_ARCHIVE_FILE, +} FSOpenWgetEnum; + +typedef struct FSOpenInfo { + FSDevice *fs; + FSOpenWgetEnum open_type; + + /* used for FS_OPEN_WGET_REG, FS_OPEN_WGET_ARCHIVE */ + XHRState *xhr; + FSINode *n; + DecryptFileState *dec_state; + size_t cur_pos; + + struct list_head archive_link; /* FS_OPEN_WGET_ARCHIVE_FILE */ + uint64_t archive_offset; /* FS_OPEN_WGET_ARCHIVE_FILE */ + struct list_head archive_file_list; /* FS_OPEN_WGET_ARCHIVE */ + + /* the following is set in case there is a fs_open callback */ + FSFile *f; + FSOpenCompletionFunc *cb; + void *opaque; +} FSOpenInfo; + +static void fs_close(FSDevice *fs, FSFile *f); +static void inode_decref(FSDevice *fs1, FSINode *n); +static int fs_cmd_write(FSDevice *fs, FSFile *f, uint64_t offset, + const uint8_t *buf, int buf_len); +static int fs_cmd_read(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int buf_len); +static int fs_truncate(FSDevice *fs1, FSINode *n, uint64_t size); +static void fs_open_end(FSOpenInfo *oi); +static void fs_base_url_decref(FSDevice *fs, FSBaseURL *bu); +static FSBaseURL *fs_net_set_base_url(FSDevice *fs1, + const char *base_url_id, + const char *url, + const char *user, const char *password, + AES_KEY *aes_state); +static void fs_cmd_close(FSDevice *fs, FSFile *f); +static void fs_error_archive(FSOpenInfo *oi); +#ifdef DUMP_CACHE_LOAD +static void dump_loaded_file(FSDevice *fs1, FSINode *n); +#endif + +#if !defined(EMSCRIPTEN) +/* file buffer (the content of the buffer can be stored elsewhere) */ +void file_buffer_init(FileBuffer *bs) +{ + bs->data = NULL; + bs->allocated_size = 0; +} + +void file_buffer_reset(FileBuffer *bs) +{ + free(bs->data); + file_buffer_init(bs); +} + +int file_buffer_resize(FileBuffer *bs, size_t new_size) +{ + uint8_t *new_data; + new_data = realloc(bs->data, new_size); + if (!new_data && new_size != 0) + return -1; + bs->data = new_data; + bs->allocated_size = new_size; + return 0; +} + +void file_buffer_write(FileBuffer *bs, size_t offset, const uint8_t *buf, + size_t size) +{ + memcpy(bs->data + offset, buf, size); +} + +void file_buffer_set(FileBuffer *bs, size_t offset, int val, size_t size) +{ + memset(bs->data + offset, val, size); +} + +void file_buffer_read(FileBuffer *bs, size_t offset, uint8_t *buf, + size_t size) +{ + memcpy(buf, bs->data + offset, size); +} +#endif + +static int64_t to_blocks(FSDeviceMem *fs, uint64_t size) +{ + return (size + fs->block_size - 1) >> fs->block_size_log2; +} + +static FSINode *inode_incref(FSDevice *fs, FSINode *n) +{ + n->refcount++; + return n; +} + +static FSINode *inode_inc_open(FSDevice *fs, FSINode *n) +{ + n->open_count++; + return n; +} + +static void inode_free(FSDevice *fs1, FSINode *n) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + + // printf("inode_free=%" PRId64 "\n", n->inode_num); + assert(n->refcount == 0); + assert(n->open_count == 0); + switch(n->type) { + case FT_REG: + fs->fs_blocks -= to_blocks(fs, n->u.reg.size); + assert(fs->fs_blocks >= 0); + file_buffer_reset(&n->u.reg.fbuf); +#ifdef DUMP_CACHE_LOAD + free(n->u.reg.filename); +#endif + switch(n->u.reg.state) { + case REG_STATE_LOADED: + list_del(&n->u.reg.link); + fs->inode_cache_size -= n->u.reg.size; + assert(fs->inode_cache_size >= 0); + fs_base_url_decref(fs1, n->u.reg.base_url); + break; + case REG_STATE_LOADING: + { + FSOpenInfo *oi = n->u.reg.open_info; + if (oi->xhr) + fs_wget_free(oi->xhr); + if (oi->open_type == FS_OPEN_WGET_ARCHIVE) { + fs_error_archive(oi); + } + fs_open_end(oi); + fs_base_url_decref(fs1, n->u.reg.base_url); + } + break; + case REG_STATE_UNLOADED: + fs_base_url_decref(fs1, n->u.reg.base_url); + break; + case REG_STATE_LOCAL: + break; + default: + abort(); + } + break; + case FT_LNK: + free(n->u.symlink.name); + break; + case FT_DIR: + assert(list_empty(&n->u.dir.de_list)); + break; + default: + break; + } + list_del(&n->link); + free(n); + fs->inode_count--; + assert(fs->inode_count >= 0); +} + +static void inode_decref(FSDevice *fs1, FSINode *n) +{ + assert(n->refcount >= 1); + if (--n->refcount <= 0 && n->open_count <= 0) { + inode_free(fs1, n); + } +} + +static void inode_dec_open(FSDevice *fs1, FSINode *n) +{ + assert(n->open_count >= 1); + if (--n->open_count <= 0 && n->refcount <= 0) { + inode_free(fs1, n); + } +} + +static void inode_update_mtime(FSDevice *fs, FSINode *n) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + n->mtime_sec = tv.tv_sec; + n->mtime_nsec = tv.tv_usec * 1000; +} + +static FSINode *inode_new(FSDevice *fs1, FSINodeTypeEnum type, + uint32_t mode, uint32_t uid, uint32_t gid) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + FSINode *n; + + n = mallocz(sizeof(*n)); + n->refcount = 1; + n->open_count = 0; + n->inode_num = fs->inode_num_alloc; + fs->inode_num_alloc++; + n->type = type; + n->mode = mode & 0xfff; + n->uid = uid; + n->gid = gid; + + switch(type) { + case FT_REG: + file_buffer_init(&n->u.reg.fbuf); + break; + case FT_DIR: + init_list_head(&n->u.dir.de_list); + break; + default: + break; + } + + list_add(&n->link, &fs->inode_list); + fs->inode_count++; + + inode_update_mtime(fs1, n); + n->ctime_sec = n->mtime_sec; + n->ctime_nsec = n->mtime_nsec; + + return n; +} + +/* warning: the refcount of 'n1' is not incremented by this function */ +/* XXX: test FS max size */ +static FSDirEntry *inode_dir_add(FSDevice *fs1, FSINode *n, const char *name, + FSINode *n1) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + FSDirEntry *de; + int name_len, dirent_size, new_size; + assert(n->type == FT_DIR); + + name_len = strlen(name); + de = mallocz(sizeof(*de) + name_len + 1); + de->inode = n1; + memcpy(de->name, name, name_len + 1); + dirent_size = sizeof(*de) + name_len + 1; + new_size = n->u.dir.size + dirent_size; + fs->fs_blocks += to_blocks(fs, new_size) - to_blocks(fs, n->u.dir.size); + n->u.dir.size = new_size; + list_add_tail(&de->link, &n->u.dir.de_list); + return de; +} + +static FSDirEntry *inode_search(FSINode *n, const char *name) +{ + struct list_head *el; + FSDirEntry *de; + + if (n->type != FT_DIR) + return NULL; + + list_for_each(el, &n->u.dir.de_list) { + de = list_entry(el, FSDirEntry, link); + if (!strcmp(de->name, name)) + return de; + } + return NULL; +} + +static FSINode *inode_search_path1(FSDevice *fs, FSINode *n, const char *path) +{ + char name[1024]; + const char *p, *p1; + int len; + FSDirEntry *de; + + p = path; + if (*p == '/') + p++; + if (*p == '\0') + return n; + for(;;) { + p1 = strchr(p, '/'); + if (!p1) { + len = strlen(p); + } else { + len = p1 - p; + p1++; + } + if (len > sizeof(name) - 1) + return NULL; + memcpy(name, p, len); + name[len] = '\0'; + if (n->type != FT_DIR) + return NULL; + de = inode_search(n, name); + if (!de) + return NULL; + n = de->inode; + p = p1; + if (!p) + break; + } + return n; +} + +static FSINode *inode_search_path(FSDevice *fs1, const char *path) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + if (!fs1) + return NULL; + return inode_search_path1(fs1, fs->root_inode, path); +} + +static BOOL is_empty_dir(FSDevice *fs, FSINode *n) +{ + struct list_head *el; + FSDirEntry *de; + + list_for_each(el, &n->u.dir.de_list) { + de = list_entry(el, FSDirEntry, link); + if (strcmp(de->name, ".") != 0 && + strcmp(de->name, "..") != 0) + return FALSE; + } + return TRUE; +} + +static void inode_dirent_delete_no_decref(FSDevice *fs1, FSINode *n, FSDirEntry *de) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + int dirent_size, new_size; + dirent_size = sizeof(*de) + strlen(de->name) + 1; + + new_size = n->u.dir.size - dirent_size; + fs->fs_blocks += to_blocks(fs, new_size) - to_blocks(fs, n->u.dir.size); + n->u.dir.size = new_size; + assert(n->u.dir.size >= 0); + assert(fs->fs_blocks >= 0); + list_del(&de->link); + free(de); +} + +static void inode_dirent_delete(FSDevice *fs, FSINode *n, FSDirEntry *de) +{ + FSINode *n1; + n1 = de->inode; + inode_dirent_delete_no_decref(fs, n, de); + inode_decref(fs, n1); +} + +static void flush_dir(FSDevice *fs, FSINode *n) +{ + struct list_head *el, *el1; + FSDirEntry *de; + list_for_each_safe(el, el1, &n->u.dir.de_list) { + de = list_entry(el, FSDirEntry, link); + inode_dirent_delete(fs, n, de); + } + assert(n->u.dir.size == 0); +} + +static void fs_delete(FSDevice *fs, FSFile *f) +{ + fs_close(fs, f); + inode_dec_open(fs, f->inode); + free(f); +} + +static FSFile *fid_create(FSDevice *fs1, FSINode *n, uint32_t uid) +{ + FSFile *f; + + f = mallocz(sizeof(*f)); + f->inode = inode_inc_open(fs1, n); + f->uid = uid; + return f; +} + +static void inode_to_qid(FSQID *qid, FSINode *n) +{ + if (n->type == FT_DIR) + qid->type = P9_QTDIR; + else if (n->type == FT_LNK) + qid->type = P9_QTSYMLINK; + else + qid->type = P9_QTFILE; + qid->version = 0; /* no caching on client */ + qid->path = n->inode_num; +} + +static void fs_statfs(FSDevice *fs1, FSStatFS *st) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + st->f_bsize = 1024; + st->f_blocks = fs->fs_max_blocks << + (fs->block_size_log2 - 10); + st->f_bfree = (fs->fs_max_blocks - fs->fs_blocks) << + (fs->block_size_log2 - 10); + st->f_bavail = st->f_bfree; + st->f_files = fs->inode_limit; + st->f_ffree = fs->inode_limit - fs->inode_count; +} + +static int fs_attach(FSDevice *fs1, FSFile **pf, FSQID *qid, uint32_t uid, + const char *uname, const char *aname) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + + *pf = fid_create(fs1, fs->root_inode, uid); + inode_to_qid(qid, fs->root_inode); + return 0; +} + +static int fs_walk(FSDevice *fs, FSFile **pf, FSQID *qids, + FSFile *f, int count, char **names) +{ + int i; + FSINode *n; + FSDirEntry *de; + + n = f->inode; + for(i = 0; i < count; i++) { + de = inode_search(n, names[i]); + if (!de) + break; + n = de->inode; + inode_to_qid(&qids[i], n); + } + *pf = fid_create(fs, n, f->uid); + return i; +} + +static int fs_mkdir(FSDevice *fs, FSQID *qid, FSFile *f, + const char *name, uint32_t mode, uint32_t gid) +{ + FSINode *n, *n1; + + n = f->inode; + if (n->type != FT_DIR) + return -P9_ENOTDIR; + if (inode_search(n, name)) + return -P9_EEXIST; + n1 = inode_new(fs, FT_DIR, mode, f->uid, gid); + inode_dir_add(fs, n1, ".", inode_incref(fs, n1)); + inode_dir_add(fs, n1, "..", inode_incref(fs, n)); + inode_dir_add(fs, n, name, n1); + inode_to_qid(qid, n1); + return 0; +} + +/* remove elements in the cache considering that 'added_size' will be + added */ +static void fs_trim_cache(FSDevice *fs1, int64_t added_size) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + struct list_head *el, *el1; + FSINode *n; + + if ((fs->inode_cache_size + added_size) <= fs->inode_cache_size_limit) + return; + list_for_each_prev_safe(el, el1, &fs->inode_cache_list) { + n = list_entry(el, FSINode, u.reg.link); + assert(n->u.reg.state == REG_STATE_LOADED); + /* cannot remove open files */ + // printf("open_count=%d\n", n->open_count); + if (n->open_count != 0) + continue; +#ifdef DEBUG_CACHE + printf("fs_trim_cache: remove '%s' size=%ld\n", + n->u.reg.filename, (long)n->u.reg.size); +#endif + file_buffer_reset(&n->u.reg.fbuf); + n->u.reg.state = REG_STATE_UNLOADED; + list_del(&n->u.reg.link); + fs->inode_cache_size -= n->u.reg.size; + assert(fs->inode_cache_size >= 0); + if ((fs->inode_cache_size + added_size) <= fs->inode_cache_size_limit) + break; + } +} + +static void fs_open_end(FSOpenInfo *oi) +{ + if (oi->open_type == FS_OPEN_WGET_ARCHIVE_FILE) { + list_del(&oi->archive_link); + } + if (oi->dec_state) + decrypt_file_end(oi->dec_state); + free(oi); +} + +static int fs_open_write_cb(void *opaque, const uint8_t *data, size_t size) +{ + FSOpenInfo *oi = opaque; + size_t len; + FSINode *n = oi->n; + + /* we ignore extraneous data */ + len = n->u.reg.size - oi->cur_pos; + if (size < len) + len = size; + file_buffer_write(&n->u.reg.fbuf, oi->cur_pos, data, len); + oi->cur_pos += len; + return 0; +} + +static void fs_wget_set_loaded(FSINode *n) +{ + FSOpenInfo *oi; + FSDeviceMem *fs; + FSFile *f; + FSQID qid; + + assert(n->u.reg.state == REG_STATE_LOADING); + oi = n->u.reg.open_info; + fs = (FSDeviceMem *)oi->fs; + n->u.reg.state = REG_STATE_LOADED; + list_add(&n->u.reg.link, &fs->inode_cache_list); + fs->inode_cache_size += n->u.reg.size; + + if (oi->cb) { + f = oi->f; + f->is_opened = TRUE; + inode_to_qid(&qid, n); + oi->cb(oi->fs, &qid, 0, oi->opaque); + } + fs_open_end(oi); +} + +static void fs_wget_set_error(FSINode *n) +{ + FSOpenInfo *oi; + assert(n->u.reg.state == REG_STATE_LOADING); + oi = n->u.reg.open_info; + n->u.reg.state = REG_STATE_UNLOADED; + file_buffer_reset(&n->u.reg.fbuf); + if (oi->cb) { + oi->cb(oi->fs, NULL, -P9_EIO, oi->opaque); + } + fs_open_end(oi); +} + +static void fs_read_archive(FSOpenInfo *oi) +{ + FSINode *n = oi->n; + uint64_t pos, pos1, l; + uint8_t buf[1024]; + FSINode *n1; + FSOpenInfo *oi1; + struct list_head *el, *el1; + + list_for_each_safe(el, el1, &oi->archive_file_list) { + oi1 = list_entry(el, FSOpenInfo, archive_link); + n1 = oi1->n; + /* copy the archive data to the file */ + pos = oi1->archive_offset; + pos1 = 0; + while (pos1 < n1->u.reg.size) { + l = n1->u.reg.size - pos1; + if (l > sizeof(buf)) + l = sizeof(buf); + file_buffer_read(&n->u.reg.fbuf, pos, buf, l); + file_buffer_write(&n1->u.reg.fbuf, pos1, buf, l); + pos += l; + pos1 += l; + } + fs_wget_set_loaded(n1); + } +} + +static void fs_error_archive(FSOpenInfo *oi) +{ + FSOpenInfo *oi1; + struct list_head *el, *el1; + + list_for_each_safe(el, el1, &oi->archive_file_list) { + oi1 = list_entry(el, FSOpenInfo, archive_link); + fs_wget_set_error(oi1->n); + } +} + +static void fs_open_cb(void *opaque, int err, void *data, size_t size) +{ + FSOpenInfo *oi = opaque; + FSINode *n = oi->n; + + // printf("open_cb: err=%d size=%ld\n", err, size); + if (err < 0) { + error: + if (oi->open_type == FS_OPEN_WGET_ARCHIVE) + fs_error_archive(oi); + fs_wget_set_error(n); + } else { + if (oi->dec_state) { + if (decrypt_file(oi->dec_state, data, size) < 0) + goto error; + if (err == 0) { + if (decrypt_file_flush(oi->dec_state) < 0) + goto error; + } + } else { + fs_open_write_cb(oi, data, size); + } + + if (err == 0) { + /* end of transfer */ + if (oi->cur_pos != n->u.reg.size) + goto error; +#ifdef DUMP_CACHE_LOAD + dump_loaded_file(oi->fs, n); +#endif + if (oi->open_type == FS_OPEN_WGET_ARCHIVE) + fs_read_archive(oi); + fs_wget_set_loaded(n); + } + } +} + + +static int fs_open_wget(FSDevice *fs1, FSINode *n, FSOpenWgetEnum open_type) +{ + char *url; + FSOpenInfo *oi; + char fname[FILEID_SIZE_MAX]; + FSBaseURL *bu; + + assert(n->u.reg.state == REG_STATE_UNLOADED); + + fs_trim_cache(fs1, n->u.reg.size); + + if (file_buffer_resize(&n->u.reg.fbuf, n->u.reg.size) < 0) + return -P9_EIO; + n->u.reg.state = REG_STATE_LOADING; + oi = mallocz(sizeof(*oi)); + oi->cur_pos = 0; + oi->fs = fs1; + oi->n = n; + oi->open_type = open_type; + if (open_type != FS_OPEN_WGET_ARCHIVE_FILE) { + if (open_type == FS_OPEN_WGET_ARCHIVE) + init_list_head(&oi->archive_file_list); + file_id_to_filename(fname, n->u.reg.file_id); + bu = n->u.reg.base_url; + url = compose_path(bu->url, fname); + if (bu->encrypted) { + oi->dec_state = decrypt_file_init(&bu->aes_state, fs_open_write_cb, oi); + } + oi->xhr = fs_wget(url, bu->user, bu->password, oi, fs_open_cb, FALSE); + } + n->u.reg.open_info = oi; + return 0; +} + + +static void fs_preload_file(FSDevice *fs1, const char *filename) +{ + FSINode *n; + + n = inode_search_path(fs1, filename); + if (n && n->type == FT_REG && n->u.reg.state == REG_STATE_UNLOADED) { +#if defined(DEBUG_CACHE) + printf("preload: %s\n", filename); +#endif + fs_open_wget(fs1, n, FS_OPEN_WGET_REG); + } +} + +static PreloadArchive *find_preload_archive(FSDeviceMem *fs, + const char *filename) +{ + PreloadArchive *pa; + struct list_head *el; + list_for_each(el, &fs->preload_archive_list) { + pa = list_entry(el, PreloadArchive, link); + if (!strcmp(pa->name, filename)) + return pa; + } + return NULL; +} + +static void fs_preload_archive(FSDevice *fs1, const char *filename) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + PreloadArchive *pa; + PreloadArchiveFile *paf; + struct list_head *el; + FSINode *n, *n1; + uint64_t offset; + BOOL has_unloaded; + + pa = find_preload_archive(fs, filename); + if (!pa) + return; +#if defined(DEBUG_CACHE) + printf("preload archive: %s\n", filename); +#endif + n = inode_search_path(fs1, filename); + if (n && n->type == FT_REG && n->u.reg.state == REG_STATE_UNLOADED) { + /* if all the files are loaded, no need to load the archive */ + offset = 0; + has_unloaded = FALSE; + list_for_each(el, &pa->file_list) { + paf = list_entry(el, PreloadArchiveFile, link); + n1 = inode_search_path(fs1, paf->name); + if (n1 && n1->type == FT_REG && + n1->u.reg.state == REG_STATE_UNLOADED) { + has_unloaded = TRUE; + } + offset += paf->size; + } + if (!has_unloaded) { +#if defined(DEBUG_CACHE) + printf("archive files already loaded\n"); +#endif + return; + } + /* check archive size consistency */ + if (offset != n->u.reg.size) { +#if defined(DEBUG_CACHE) + printf(" inconsistent archive size: %" PRId64 " %" PRId64 "\n", + offset, n->u.reg.size); +#endif + goto load_fallback; + } + + /* start loading the archive */ + fs_open_wget(fs1, n, FS_OPEN_WGET_ARCHIVE); + + /* indicate that all the archive files are being loaded. Also + check consistency of size and file id */ + offset = 0; + list_for_each(el, &pa->file_list) { + paf = list_entry(el, PreloadArchiveFile, link); + n1 = inode_search_path(fs1, paf->name); + if (n1 && n1->type == FT_REG && + n1->u.reg.state == REG_STATE_UNLOADED) { + if (n1->u.reg.size == paf->size && + n1->u.reg.file_id == paf->file_id) { + fs_open_wget(fs1, n1, FS_OPEN_WGET_ARCHIVE_FILE); + list_add_tail(&n1->u.reg.open_info->archive_link, + &n->u.reg.open_info->archive_file_list); + n1->u.reg.open_info->archive_offset = offset; + } else { +#if defined(DEBUG_CACHE) + printf(" inconsistent archive file: %s\n", paf->name); +#endif + /* fallback to file preload */ + fs_preload_file(fs1, paf->name); + } + } + offset += paf->size; + } + } else { + load_fallback: + /* if the archive is already loaded or not loaded, we load the + files separately (XXX: not optimal if the archive is + already loaded, but it should not happen often) */ + list_for_each(el, &pa->file_list) { + paf = list_entry(el, PreloadArchiveFile, link); + fs_preload_file(fs1, paf->name); + } + } +} + +static void fs_preload_files(FSDevice *fs1, FSFileID file_id) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + struct list_head *el; + PreloadEntry *pe; + PreloadFile *pf; + + list_for_each(el, &fs->preload_list) { + pe = list_entry(el, PreloadEntry, link); + if (pe->file_id == file_id) + goto found; + } + return; + found: + list_for_each(el, &pe->file_list) { + pf = list_entry(el, PreloadFile, link); + if (pf->is_archive) + fs_preload_archive(fs1, pf->name); + else + fs_preload_file(fs1, pf->name); + } +} + +/* return < 0 if error, 0 if OK, 1 if asynchronous completion */ +/* XXX: we don't support several simultaneous asynchronous open on the + same inode */ +static int fs_open(FSDevice *fs1, FSQID *qid, FSFile *f, uint32_t flags, + FSOpenCompletionFunc *cb, void *opaque) +{ + FSINode *n = f->inode; + FSDeviceMem *fs = (FSDeviceMem *)fs1; + int ret; + + fs_close(fs1, f); + + if (flags & P9_O_DIRECTORY) { + if (n->type != FT_DIR) + return -P9_ENOTDIR; + } else { + if (n->type != FT_REG && n->type != FT_DIR) + return -P9_EINVAL; /* XXX */ + } + f->open_flags = flags; + if (n->type == FT_REG) { + if ((flags & P9_O_TRUNC) && (flags & P9_O_NOACCESS) != P9_O_RDONLY) { + fs_truncate(fs1, n, 0); + } + + switch(n->u.reg.state) { + case REG_STATE_UNLOADED: + { + FSOpenInfo *oi; + /* need to load the file */ + fs_preload_files(fs1, n->u.reg.file_id); + /* The state can be modified by the fs_preload_files */ + if (n->u.reg.state == REG_STATE_LOADING) + goto handle_loading; + ret = fs_open_wget(fs1, n, FS_OPEN_WGET_REG); + if (ret) + return ret; + oi = n->u.reg.open_info; + oi->f = f; + oi->cb = cb; + oi->opaque = opaque; + return 1; /* completion callback will be called later */ + } + break; + case REG_STATE_LOADING: + handle_loading: + { + FSOpenInfo *oi; + /* we only handle the case where the file is being preloaded */ + oi = n->u.reg.open_info; + if (oi->cb) + return -P9_EIO; + oi = n->u.reg.open_info; + oi->f = f; + oi->cb = cb; + oi->opaque = opaque; + return 1; /* completion callback will be called later */ + } + break; + case REG_STATE_LOCAL: + goto do_open; + case REG_STATE_LOADED: + /* move to front */ + list_del(&n->u.reg.link); + list_add(&n->u.reg.link, &fs->inode_cache_list); + goto do_open; + default: + abort(); + } + } else { + do_open: + f->is_opened = TRUE; + inode_to_qid(qid, n); + return 0; + } +} + +static int fs_create(FSDevice *fs, FSQID *qid, FSFile *f, const char *name, + uint32_t flags, uint32_t mode, uint32_t gid) +{ + FSINode *n1, *n = f->inode; + + if (n->type != FT_DIR) + return -P9_ENOTDIR; + if (inode_search(n, name)) { + /* XXX: support it, but Linux does not seem to use this case */ + return -P9_EEXIST; + } else { + fs_close(fs, f); + + n1 = inode_new(fs, FT_REG, mode, f->uid, gid); + inode_dir_add(fs, n, name, n1); + + inode_dec_open(fs, f->inode); + f->inode = inode_inc_open(fs, n1); + f->is_opened = TRUE; + f->open_flags = flags; + inode_to_qid(qid, n1); + return 0; + } +} + +static int fs_readdir(FSDevice *fs, FSFile *f, uint64_t offset1, + uint8_t *buf, int count) +{ + FSINode *n1, *n = f->inode; + int len, pos, name_len, type; + struct list_head *el; + FSDirEntry *de; + uint64_t offset; + + if (!f->is_opened || n->type != FT_DIR) + return -P9_EPROTO; + + el = n->u.dir.de_list.next; + offset = 0; + while (offset < offset1) { + if (el == &n->u.dir.de_list) + return 0; /* no more entries */ + offset++; + el = el->next; + } + + pos = 0; + for(;;) { + if (el == &n->u.dir.de_list) + break; + de = list_entry(el, FSDirEntry, link); + name_len = strlen(de->name); + len = 13 + 8 + 1 + 2 + name_len; + if ((pos + len) > count) + break; + offset++; + n1 = de->inode; + if (n1->type == FT_DIR) + type = P9_QTDIR; + else if (n1->type == FT_LNK) + type = P9_QTSYMLINK; + else + type = P9_QTFILE; + buf[pos++] = type; + put_le32(buf + pos, 0); /* version */ + pos += 4; + put_le64(buf + pos, n1->inode_num); + pos += 8; + put_le64(buf + pos, offset); + pos += 8; + buf[pos++] = n1->type; + put_le16(buf + pos, name_len); + pos += 2; + memcpy(buf + pos, de->name, name_len); + pos += name_len; + el = el->next; + } + return pos; +} + +static int fs_read(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int count) +{ + FSINode *n = f->inode; + uint64_t count1; + + if (!f->is_opened) + return -P9_EPROTO; + if (n->type != FT_REG) + return -P9_EIO; + if ((f->open_flags & P9_O_NOACCESS) == P9_O_WRONLY) + return -P9_EIO; + if (n->u.reg.is_fscmd) + return fs_cmd_read(fs, f, offset, buf, count); + if (offset >= n->u.reg.size) + return 0; + count1 = n->u.reg.size - offset; + if (count1 < count) + count = count1; + file_buffer_read(&n->u.reg.fbuf, offset, buf, count); + return count; +} + +static int fs_truncate(FSDevice *fs1, FSINode *n, uint64_t size) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + intptr_t diff, diff_blocks; + size_t new_allocated_size; + + if (n->type != FT_REG) + return -P9_EINVAL; + if (size > UINTPTR_MAX) + return -P9_ENOSPC; + diff = size - n->u.reg.size; + if (diff == 0) + return 0; + diff_blocks = to_blocks(fs, size) - to_blocks(fs, n->u.reg.size); + /* currently cannot resize while loading */ + switch(n->u.reg.state) { + case REG_STATE_LOADING: + return -P9_EIO; + case REG_STATE_UNLOADED: + if (size == 0) { + /* now local content */ + n->u.reg.state = REG_STATE_LOCAL; + } + break; + case REG_STATE_LOADED: + case REG_STATE_LOCAL: + if (diff > 0) { + if ((fs->fs_blocks + diff_blocks) > fs->fs_max_blocks) + return -P9_ENOSPC; + if (size > n->u.reg.fbuf.allocated_size) { + new_allocated_size = n->u.reg.fbuf.allocated_size * 5 / 4; + if (size > new_allocated_size) + new_allocated_size = size; + if (file_buffer_resize(&n->u.reg.fbuf, new_allocated_size) < 0) + return -P9_ENOSPC; + } + file_buffer_set(&n->u.reg.fbuf, n->u.reg.size, 0, diff); + } else { + new_allocated_size = n->u.reg.fbuf.allocated_size * 4 / 5; + if (size <= new_allocated_size) { + if (file_buffer_resize(&n->u.reg.fbuf, new_allocated_size) < 0) + return -P9_ENOSPC; + } + } + /* file is modified, so it is now local */ + if (n->u.reg.state == REG_STATE_LOADED) { + list_del(&n->u.reg.link); + fs->inode_cache_size -= n->u.reg.size; + assert(fs->inode_cache_size >= 0); + n->u.reg.state = REG_STATE_LOCAL; + } + break; + default: + abort(); + } + fs->fs_blocks += diff_blocks; + assert(fs->fs_blocks >= 0); + n->u.reg.size = size; + return 0; +} + +static int fs_write(FSDevice *fs1, FSFile *f, uint64_t offset, + const uint8_t *buf, int count) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + FSINode *n = f->inode; + uint64_t end; + int err; + + if (!f->is_opened) + return -P9_EPROTO; + if (n->type != FT_REG) + return -P9_EIO; + if ((f->open_flags & P9_O_NOACCESS) == P9_O_RDONLY) + return -P9_EIO; + if (count == 0) + return 0; + if (n->u.reg.is_fscmd) { + return fs_cmd_write(fs1, f, offset, buf, count); + } + end = offset + count; + if (end > n->u.reg.size) { + err = fs_truncate(fs1, n, end); + if (err) + return err; + } + inode_update_mtime(fs1, n); + /* file is modified, so it is now local */ + if (n->u.reg.state == REG_STATE_LOADED) { + list_del(&n->u.reg.link); + fs->inode_cache_size -= n->u.reg.size; + assert(fs->inode_cache_size >= 0); + n->u.reg.state = REG_STATE_LOCAL; + } + file_buffer_write(&n->u.reg.fbuf, offset, buf, count); + return count; +} + +static void fs_close(FSDevice *fs, FSFile *f) +{ + if (f->is_opened) { + f->is_opened = FALSE; + } + if (f->req) + fs_cmd_close(fs, f); +} + +static int fs_stat(FSDevice *fs1, FSFile *f, FSStat *st) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + FSINode *n = f->inode; + + inode_to_qid(&st->qid, n); + st->st_mode = n->mode | (n->type << 12); + st->st_uid = n->uid; + st->st_gid = n->gid; + st->st_nlink = n->refcount; + if (n->type == FT_BLK || n->type == FT_CHR) { + /* XXX: check */ + st->st_rdev = (n->u.dev.major << 8) | n->u.dev.minor; + } else { + st->st_rdev = 0; + } + st->st_blksize = fs->block_size; + if (n->type == FT_REG) { + st->st_size = n->u.reg.size; + } else if (n->type == FT_LNK) { + st->st_size = strlen(n->u.symlink.name); + } else if (n->type == FT_DIR) { + st->st_size = n->u.dir.size; + } else { + st->st_size = 0; + } + /* in 512 byte blocks */ + st->st_blocks = to_blocks(fs, st->st_size) << (fs->block_size_log2 - 9); + + /* Note: atime is not supported */ + st->st_atime_sec = n->mtime_sec; + st->st_atime_nsec = n->mtime_nsec; + st->st_mtime_sec = n->mtime_sec; + st->st_mtime_nsec = n->mtime_nsec; + st->st_ctime_sec = n->ctime_sec; + st->st_ctime_nsec = n->ctime_nsec; + return 0; +} + +static int fs_setattr(FSDevice *fs1, FSFile *f, uint32_t mask, + uint32_t mode, uint32_t uid, uint32_t gid, + uint64_t size, uint64_t atime_sec, uint64_t atime_nsec, + uint64_t mtime_sec, uint64_t mtime_nsec) +{ + FSINode *n = f->inode; + int ret; + + if (mask & P9_SETATTR_MODE) { + n->mode = mode; + } + if (mask & P9_SETATTR_UID) { + n->uid = uid; + } + if (mask & P9_SETATTR_GID) { + n->gid = gid; + } + if (mask & P9_SETATTR_SIZE) { + ret = fs_truncate(fs1, n, size); + if (ret) + return ret; + } + if (mask & P9_SETATTR_MTIME) { + if (mask & P9_SETATTR_MTIME_SET) { + n->mtime_sec = mtime_sec; + n->mtime_nsec = mtime_nsec; + } else { + inode_update_mtime(fs1, n); + } + } + if (mask & P9_SETATTR_CTIME) { + struct timeval tv; + gettimeofday(&tv, NULL); + n->ctime_sec = tv.tv_sec; + n->ctime_nsec = tv.tv_usec * 1000; + } + return 0; +} + +static int fs_link(FSDevice *fs, FSFile *df, FSFile *f, const char *name) +{ + FSINode *n = df->inode; + + if (f->inode->type == FT_DIR) + return -P9_EPERM; + if (inode_search(n, name)) + return -P9_EEXIST; + inode_dir_add(fs, n, name, inode_incref(fs, f->inode)); + return 0; +} + +static int fs_symlink(FSDevice *fs, FSQID *qid, + FSFile *f, const char *name, const char *symgt, uint32_t gid) +{ + FSINode *n1, *n = f->inode; + + if (inode_search(n, name)) + return -P9_EEXIST; + + n1 = inode_new(fs, FT_LNK, 0777, f->uid, gid); + n1->u.symlink.name = strdup(symgt); + inode_dir_add(fs, n, name, n1); + inode_to_qid(qid, n1); + return 0; +} + +static int fs_mknod(FSDevice *fs, FSQID *qid, + FSFile *f, const char *name, uint32_t mode, uint32_t major, + uint32_t minor, uint32_t gid) +{ + int type; + FSINode *n1, *n = f->inode; + + type = (mode & P9_S_IFMT) >> 12; + /* XXX: add FT_DIR support */ + if (type != FT_FIFO && type != FT_CHR && type != FT_BLK && + type != FT_REG && type != FT_SOCK) + return -P9_EINVAL; + if (inode_search(n, name)) + return -P9_EEXIST; + n1 = inode_new(fs, type, mode, f->uid, gid); + if (type == FT_CHR || type == FT_BLK) { + n1->u.dev.major = major; + n1->u.dev.minor = minor; + } + inode_dir_add(fs, n, name, n1); + inode_to_qid(qid, n1); + return 0; +} + +static int fs_readlink(FSDevice *fs, char *buf, int buf_size, FSFile *f) +{ + FSINode *n = f->inode; + int len; + if (n->type != FT_LNK) + return -P9_EIO; + len = min_int(strlen(n->u.symlink.name), buf_size - 1); + memcpy(buf, n->u.symlink.name, len); + buf[len] = '\0'; + return 0; +} + +static int fs_renameat(FSDevice *fs, FSFile *f, const char *name, + FSFile *new_f, const char *new_name) +{ + FSDirEntry *de, *de1; + FSINode *n1; + + de = inode_search(f->inode, name); + if (!de) + return -P9_ENOENT; + de1 = inode_search(new_f->inode, new_name); + n1 = NULL; + if (de1) { + n1 = de1->inode; + if (n1->type == FT_DIR) + return -P9_EEXIST; /* XXX: handle the case */ + inode_dirent_delete_no_decref(fs, new_f->inode, de1); + } + inode_dir_add(fs, new_f->inode, new_name, inode_incref(fs, de->inode)); + inode_dirent_delete(fs, f->inode, de); + if (n1) + inode_decref(fs, n1); + return 0; +} + +static int fs_unlinkat(FSDevice *fs, FSFile *f, const char *name) +{ + FSDirEntry *de; + FSINode *n; + + if (!strcmp(name, ".") || !strcmp(name, "..")) + return -P9_ENOENT; + de = inode_search(f->inode, name); + if (!de) + return -P9_ENOENT; + n = de->inode; + if (n->type == FT_DIR) { + if (!is_empty_dir(fs, n)) + return -P9_ENOTEMPTY; + flush_dir(fs, n); + } + inode_dirent_delete(fs, f->inode, de); + return 0; +} + +static int fs_lock(FSDevice *fs, FSFile *f, const FSLock *lock) +{ + FSINode *n = f->inode; + if (!f->is_opened) + return -P9_EPROTO; + if (n->type != FT_REG) + return -P9_EIO; + /* XXX: implement it */ + return P9_LOCK_SUCCESS; +} + +static int fs_getlock(FSDevice *fs, FSFile *f, FSLock *lock) +{ + FSINode *n = f->inode; + if (!f->is_opened) + return -P9_EPROTO; + if (n->type != FT_REG) + return -P9_EIO; + /* XXX: implement it */ + return 0; +} + +/* XXX: only used with file lists, so not all the data is released */ +static void fs_mem_end(FSDevice *fs1) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + struct list_head *el, *el1, *el2, *el3; + FSINode *n; + FSDirEntry *de; + + list_for_each_safe(el, el1, &fs->inode_list) { + n = list_entry(el, FSINode, link); + n->refcount = 0; + if (n->type == FT_DIR) { + list_for_each_safe(el2, el3, &n->u.dir.de_list) { + de = list_entry(el2, FSDirEntry, link); + list_del(&de->link); + free(de); + } + init_list_head(&n->u.dir.de_list); + } + inode_free(fs1, n); + } + assert(list_empty(&fs->inode_cache_list)); + free(fs->import_dir); +} + +FSDevice *fs_mem_init(void) +{ + FSDeviceMem *fs; + FSDevice *fs1; + FSINode *n; + + fs = mallocz(sizeof(*fs)); + fs1 = &fs->common; + + fs->common.fs_end = fs_mem_end; + fs->common.fs_delete = fs_delete; + fs->common.fs_statfs = fs_statfs; + fs->common.fs_attach = fs_attach; + fs->common.fs_walk = fs_walk; + fs->common.fs_mkdir = fs_mkdir; + fs->common.fs_open = fs_open; + fs->common.fs_create = fs_create; + fs->common.fs_stat = fs_stat; + fs->common.fs_setattr = fs_setattr; + fs->common.fs_close = fs_close; + fs->common.fs_readdir = fs_readdir; + fs->common.fs_read = fs_read; + fs->common.fs_write = fs_write; + fs->common.fs_link = fs_link; + fs->common.fs_symlink = fs_symlink; + fs->common.fs_mknod = fs_mknod; + fs->common.fs_readlink = fs_readlink; + fs->common.fs_renameat = fs_renameat; + fs->common.fs_unlinkat = fs_unlinkat; + fs->common.fs_lock = fs_lock; + fs->common.fs_getlock = fs_getlock; + + init_list_head(&fs->inode_list); + fs->inode_num_alloc = 1; + fs->block_size_log2 = FS_BLOCK_SIZE_LOG2; + fs->block_size = 1 << fs->block_size_log2; + fs->inode_limit = 1 << 20; /* arbitrary */ + fs->fs_max_blocks = 1 << (30 - fs->block_size_log2); /* arbitrary */ + + init_list_head(&fs->inode_cache_list); + fs->inode_cache_size_limit = DEFAULT_INODE_CACHE_SIZE; + + init_list_head(&fs->preload_list); + init_list_head(&fs->preload_archive_list); + + init_list_head(&fs->base_url_list); + + /* create the root inode */ + n = inode_new(fs1, FT_DIR, 0777, 0, 0); + inode_dir_add(fs1, n, ".", inode_incref(fs1, n)); + inode_dir_add(fs1, n, "..", inode_incref(fs1, n)); + fs->root_inode = n; + + return (FSDevice *)fs; +} + +static BOOL fs_is_net(FSDevice *fs) +{ + return (fs->fs_end == fs_mem_end); +} + +static FSBaseURL *fs_find_base_url(FSDevice *fs1, + const char *base_url_id) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + struct list_head *el; + FSBaseURL *bu; + + list_for_each(el, &fs->base_url_list) { + bu = list_entry(el, FSBaseURL, link); + if (!strcmp(bu->base_url_id, base_url_id)) + return bu; + } + return NULL; +} + +static void fs_base_url_decref(FSDevice *fs, FSBaseURL *bu) +{ + assert(bu->ref_count >= 1); + if (--bu->ref_count == 0) { + free(bu->base_url_id); + free(bu->url); + free(bu->user); + free(bu->password); + list_del(&bu->link); + free(bu); + } +} + +static FSBaseURL *fs_net_set_base_url(FSDevice *fs1, + const char *base_url_id, + const char *url, + const char *user, const char *password, + AES_KEY *aes_state) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + FSBaseURL *bu; + + assert(fs_is_net(fs1)); + bu = fs_find_base_url(fs1, base_url_id); + if (!bu) { + bu = mallocz(sizeof(*bu)); + bu->base_url_id = strdup(base_url_id); + bu->ref_count = 1; + list_add_tail(&bu->link, &fs->base_url_list); + } else { + free(bu->url); + free(bu->user); + free(bu->password); + } + + bu->url = strdup(url); + if (user) + bu->user = strdup(user); + else + bu->user = NULL; + if (password) + bu->password = strdup(password); + else + bu->password = NULL; + if (aes_state) { + bu->encrypted = TRUE; + bu->aes_state = *aes_state; + } else { + bu->encrypted = FALSE; + } + return bu; +} + +static int fs_net_reset_base_url(FSDevice *fs1, + const char *base_url_id) +{ + FSBaseURL *bu; + + assert(fs_is_net(fs1)); + bu = fs_find_base_url(fs1, base_url_id); + if (!bu) + return -P9_ENOENT; + fs_base_url_decref(fs1, bu); + return 0; +} + +static void fs_net_set_fs_max_size(FSDevice *fs1, uint64_t fs_max_size) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + + assert(fs_is_net(fs1)); + fs->fs_max_blocks = to_blocks(fs, fs_max_size); +} + +static int fs_net_set_url(FSDevice *fs1, FSINode *n, + const char *base_url_id, FSFileID file_id, uint64_t size) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + FSBaseURL *bu; + + assert(fs_is_net(fs1)); + + bu = fs_find_base_url(fs1, base_url_id); + if (!bu) + return -P9_ENOENT; + + /* XXX: could accept more state */ + if (n->type != FT_REG || + n->u.reg.state != REG_STATE_LOCAL || + n->u.reg.fbuf.allocated_size != 0) + return -P9_EIO; + + if (size > 0) { + n->u.reg.state = REG_STATE_UNLOADED; + n->u.reg.base_url = bu; + bu->ref_count++; + n->u.reg.size = size; + fs->fs_blocks += to_blocks(fs, size); + n->u.reg.file_id = file_id; + } + return 0; +} + +#ifdef DUMP_CACHE_LOAD + +#include "json.h" + +#define ARCHIVE_SIZE_MAX (4 << 20) + +static void fs_dump_add_file(struct list_head *head, const char *name) +{ + PreloadFile *pf; + pf = mallocz(sizeof(*pf)); + pf->name = strdup(name); + list_add_tail(&pf->link, head); +} + +static PreloadFile *fs_dump_find_file(struct list_head *head, const char *name) +{ + PreloadFile *pf; + struct list_head *el; + list_for_each(el, head) { + pf = list_entry(el, PreloadFile, link); + if (!strcmp(pf->name, name)) + return pf; + } + return NULL; +} + +static void dump_close_archive(FSDevice *fs1) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + if (fs->dump_archive_file) { + fclose(fs->dump_archive_file); + } + fs->dump_archive_file = NULL; + fs->dump_archive_size = 0; +} + +static void dump_loaded_file(FSDevice *fs1, FSINode *n) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + char filename[1024]; + const char *fname, *p; + + if (!fs->dump_cache_load || !n->u.reg.filename) + return; + fname = n->u.reg.filename; + + if (fs_dump_find_file(&fs->dump_preload_list, fname)) { + dump_close_archive(fs1); + p = strrchr(fname, '/'); + if (!p) + p = fname; + else + p++; + free(fs->dump_archive_name); + fs->dump_archive_name = strdup(p); + fs->dump_started = TRUE; + fs->dump_archive_num = 0; + + fprintf(fs->dump_preload_file, "\n%s :\n", fname); + } + if (!fs->dump_started) + return; + + if (!fs->dump_archive_file) { + snprintf(filename, sizeof(filename), "%s/%s%d", + fs->dump_preload_dir, fs->dump_archive_name, + fs->dump_archive_num); + fs->dump_archive_file = fopen(filename, "wb"); + if (!fs->dump_archive_file) { + perror(filename); + exit(1); + } + fprintf(fs->dump_preload_archive_file, "\n@.preload2/%s%d :\n", + fs->dump_archive_name, fs->dump_archive_num); + fprintf(fs->dump_preload_file, " @.preload2/%s%d\n", + fs->dump_archive_name, fs->dump_archive_num); + fflush(fs->dump_preload_file); + fs->dump_archive_num++; + } + + if (n->u.reg.size >= ARCHIVE_SIZE_MAX) { + /* exclude large files from archive */ + /* add indicative size */ + fprintf(fs->dump_preload_file, " %s %" PRId64 "\n", + fname, n->u.reg.size); + fflush(fs->dump_preload_file); + } else { + fprintf(fs->dump_preload_archive_file, " %s %" PRId64 " %" PRIx64 "\n", + n->u.reg.filename, n->u.reg.size, n->u.reg.file_id); + fflush(fs->dump_preload_archive_file); + fwrite(n->u.reg.fbuf.data, 1, n->u.reg.size, fs->dump_archive_file); + fflush(fs->dump_archive_file); + fs->dump_archive_size += n->u.reg.size; + if (fs->dump_archive_size >= ARCHIVE_SIZE_MAX) { + dump_close_archive(fs1); + } + } +} + +static JSONValue json_load(const char *filename) +{ + FILE *f; + JSONValue val; + size_t size; + char *buf; + + f = fopen(filename, "rb"); + if (!f) { + perror(filename); + exit(1); + } + fseek(f, 0, SEEK_END); + size = ftell(f); + fseek(f, 0, SEEK_SET); + buf = malloc(size + 1); + fread(buf, 1, size, f); + fclose(f); + val = json_parse_value_len(buf, size); + free(buf); + return val; +} + +void fs_dump_cache_load(FSDevice *fs1, const char *cfg_filename) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + JSONValue cfg, val, array; + char *fname; + const char *preload_dir, *name; + int i; + + if (!fs_is_net(fs1)) + return; + cfg = json_load(cfg_filename); + if (json_is_error(cfg)) { + fprintf(stderr, "%s\n", json_get_error(cfg)); + exit(1); + } + + val = json_object_get(cfg, "preload_dir"); + if (json_is_undefined(cfg)) { + config_error: + exit(1); + } + preload_dir = json_get_str(val); + if (!preload_dir) { + fprintf(stderr, "expecting preload_filename\n"); + goto config_error; + } + fs->dump_preload_dir = strdup(preload_dir); + + init_list_head(&fs->dump_preload_list); + init_list_head(&fs->dump_exclude_list); + + array = json_object_get(cfg, "preload"); + if (array.type != JSON_ARRAY) { + fprintf(stderr, "expecting preload array\n"); + goto config_error; + } + for(i = 0; i < array.u.array->len; i++) { + val = json_array_get(array, i); + name = json_get_str(val); + if (!name) { + fprintf(stderr, "expecting a string\n"); + goto config_error; + } + fs_dump_add_file(&fs->dump_preload_list, name); + } + json_free(cfg); + + fname = compose_path(fs->dump_preload_dir, "preload.txt"); + fs->dump_preload_file = fopen(fname, "w"); + if (!fs->dump_preload_file) { + perror(fname); + exit(1); + } + free(fname); + + fname = compose_path(fs->dump_preload_dir, "preload_archive.txt"); + fs->dump_preload_archive_file = fopen(fname, "w"); + if (!fs->dump_preload_archive_file) { + perror(fname); + exit(1); + } + free(fname); + + fs->dump_cache_load = TRUE; +} +#else +void fs_dump_cache_load(FSDevice *fs1, const char *cfg_filename) +{ +} +#endif + +/***********************************************/ +/* file list processing */ + +static int filelist_load_rec(FSDevice *fs1, const char **pp, FSINode *dir, + const char *path) +{ + // FSDeviceMem *fs = (FSDeviceMem *)fs1; + char fname[1024], lname[1024]; + int ret; + const char *p; + FSINodeTypeEnum type; + uint32_t mode, uid, gid; + uint64_t size; + FSINode *n; + + p = *pp; + for(;;) { + /* skip comments or empty lines */ + if (*p == '\0') + break; + if (*p == '#') { + skip_line(&p); + continue; + } + /* end of directory */ + if (*p == '.') { + p++; + skip_line(&p); + break; + } + if (parse_uint32_base(&mode, &p, 8) < 0) { + fprintf(stderr, "invalid mode\n"); + return -1; + } + type = mode >> 12; + mode &= 0xfff; + + if (parse_uint32(&uid, &p) < 0) { + fprintf(stderr, "invalid uid\n"); + return -1; + } + + if (parse_uint32(&gid, &p) < 0) { + fprintf(stderr, "invalid gid\n"); + return -1; + } + + n = inode_new(fs1, type, mode, uid, gid); + + size = 0; + switch(type) { + case FT_CHR: + case FT_BLK: + if (parse_uint32(&n->u.dev.major, &p) < 0) { + fprintf(stderr, "invalid major\n"); + return -1; + } + if (parse_uint32(&n->u.dev.minor, &p) < 0) { + fprintf(stderr, "invalid minor\n"); + return -1; + } + break; + case FT_REG: + if (parse_uint64(&size, &p) < 0) { + fprintf(stderr, "invalid size\n"); + return -1; + } + break; + case FT_DIR: + inode_dir_add(fs1, n, ".", inode_incref(fs1, n)); + inode_dir_add(fs1, n, "..", inode_incref(fs1, dir)); + break; + default: + break; + } + + /* modification time */ + if (parse_time(&n->mtime_sec, &n->mtime_nsec, &p) < 0) { + fprintf(stderr, "invalid mtime\n"); + return -1; + } + + if (parse_fname(fname, sizeof(fname), &p) < 0) { + fprintf(stderr, "invalid filename\n"); + return -1; + } + inode_dir_add(fs1, dir, fname, n); + + if (type == FT_LNK) { + if (parse_fname(lname, sizeof(lname), &p) < 0) { + fprintf(stderr, "invalid symlink name\n"); + return -1; + } + n->u.symlink.name = strdup(lname); + } else if (type == FT_REG && size > 0) { + FSFileID file_id; + if (parse_file_id(&file_id, &p) < 0) { + fprintf(stderr, "invalid file id\n"); + return -1; + } + fs_net_set_url(fs1, n, "/", file_id, size); +#ifdef DUMP_CACHE_LOAD + { + FSDeviceMem *fs = (FSDeviceMem *)fs1; + if (fs->dump_cache_load +#ifdef DEBUG_CACHE + || 1 +#endif + ) { + n->u.reg.filename = compose_path(path, fname); + } else { + n->u.reg.filename = NULL; + } + } +#endif + } + + skip_line(&p); + + if (type == FT_DIR) { + char *path1; + path1 = compose_path(path, fname); + ret = filelist_load_rec(fs1, &p, n, path1); + free(path1); + if (ret) + return ret; + } + } + *pp = p; + return 0; +} + +static int filelist_load(FSDevice *fs1, const char *str) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + int ret; + const char *p; + + if (parse_tag_version(str) != 1) + return -1; + p = skip_header(str); + if (!p) + return -1; + ret = filelist_load_rec(fs1, &p, fs->root_inode, ""); + return ret; +} + +/************************************************************/ +/* FS init from network */ + +static void __attribute__((format(printf, 1, 2))) fatal_error(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "Error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +static void fs_create_cmd(FSDevice *fs) +{ + FSFile *root_fd; + FSQID qid; + FSINode *n; + + assert(!fs->fs_attach(fs, &root_fd, &qid, 0, "", "")); + assert(!fs->fs_create(fs, &qid, root_fd, FSCMD_NAME, P9_O_RDWR | P9_O_TRUNC, + 0666, 0)); + n = root_fd->inode; + n->u.reg.is_fscmd = TRUE; + fs->fs_delete(fs, root_fd); +} + +typedef struct { + FSDevice *fs; + char *url; + void (*start_cb)(void *opaque); + void *start_opaque; + + FSFile *root_fd; + FSFile *fd; + int file_index; + +} FSNetInitState; + +static void fs_initial_sync(FSDevice *fs, + const char *url, void (*start_cb)(void *opaque), + void *start_opaque); +static void head_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque); +static void filelist_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque); +static void kernel_load_cb(FSDevice *fs, FSQID *qid, int err, + void *opaque); +static int preload_parse(FSDevice *fs, const char *fname, BOOL is_new); + +#ifdef EMSCRIPTEN +static FSDevice *fs_import_fs; +#endif + +#define DEFAULT_IMPORT_FILE_PATH "/tmp" + +FSDevice *fs_net_init(const char *url, void (*start_cb)(void *opaque), + void *start_opaque) +{ + FSDevice *fs; + FSDeviceMem *fs1; + + fs_wget_init(); + + fs = fs_mem_init(); +#ifdef EMSCRIPTEN + if (!fs_import_fs) + fs_import_fs = fs; +#endif + fs1 = (FSDeviceMem *)fs; + fs1->import_dir = strdup(DEFAULT_IMPORT_FILE_PATH); + + fs_create_cmd(fs); + + if (url) { + fs_initial_sync(fs, url, start_cb, start_opaque); + } + return fs; +} + +static void fs_initial_sync(FSDevice *fs, + const char *url, void (*start_cb)(void *opaque), + void *start_opaque) +{ + FSNetInitState *s; + FSFile *head_fd; + FSQID qid; + char *head_url; + char buf[128]; + struct timeval tv; + + s = mallocz(sizeof(*s)); + s->fs = fs; + s->url = strdup(url); + s->start_cb = start_cb; + s->start_opaque = start_opaque; + assert(!fs->fs_attach(fs, &s->root_fd, &qid, 0, "", "")); + + /* avoid using cached version */ + gettimeofday(&tv, NULL); + snprintf(buf, sizeof(buf), HEAD_FILENAME "?nocache=%" PRId64, + (int64_t)tv.tv_sec * 1000000 + tv.tv_usec); + head_url = compose_url(s->url, buf); + head_fd = fs_dup(fs, s->root_fd); + assert(!fs->fs_create(fs, &qid, head_fd, ".head", + P9_O_RDWR | P9_O_TRUNC, 0644, 0)); + fs_wget_file2(fs, head_fd, head_url, NULL, NULL, NULL, 0, + head_loaded, s, NULL); + free(head_url); +} + +static void head_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque) +{ + FSNetInitState *s = opaque; + char *buf, *root_url, *url; + char fname[FILEID_SIZE_MAX]; + FSFileID root_id; + FSFile *new_filelist_fd; + FSQID qid; + uint64_t fs_max_size; + + if (size < 0) + fatal_error("could not load 'head' file (HTTP error=%d)", -(int)size); + + buf = malloc(size + 1); + fs->fs_read(fs, f, 0, (uint8_t *)buf, size); + buf[size] = '\0'; + fs->fs_delete(fs, f); + fs->fs_unlinkat(fs, s->root_fd, ".head"); + + if (parse_tag_version(buf) != 1) + fatal_error("invalid head version"); + + if (parse_tag_file_id(&root_id, buf, "RootID") < 0) + fatal_error("expected RootID tag"); + + if (parse_tag_uint64(&fs_max_size, buf, "FSMaxSize") == 0 && + fs_max_size >= ((uint64_t)1 << 20)) { + fs_net_set_fs_max_size(fs, fs_max_size); + } + + /* set the Root URL in the filesystem */ + root_url = compose_url(s->url, ROOT_FILENAME); + fs_net_set_base_url(fs, "/", root_url, NULL, NULL, NULL); + + new_filelist_fd = fs_dup(fs, s->root_fd); + assert(!fs->fs_create(fs, &qid, new_filelist_fd, ".filelist.txt", + P9_O_RDWR | P9_O_TRUNC, 0644, 0)); + + file_id_to_filename(fname, root_id); + url = compose_url(root_url, fname); + fs_wget_file2(fs, new_filelist_fd, url, NULL, NULL, NULL, 0, + filelist_loaded, s, NULL); + free(root_url); + free(url); +} + +static void filelist_loaded(FSDevice *fs, FSFile *f, int64_t size, void *opaque) +{ + FSNetInitState *s = opaque; + uint8_t *buf; + + if (size < 0) + fatal_error("could not load file list (HTTP error=%d)", -(int)size); + + buf = malloc(size + 1); + fs->fs_read(fs, f, 0, buf, size); + buf[size] = '\0'; + fs->fs_delete(fs, f); + fs->fs_unlinkat(fs, s->root_fd, ".filelist.txt"); + + if (filelist_load(fs, (char *)buf) != 0) + fatal_error("error while parsing file list"); + + /* try to load the kernel and the preload file */ + s->file_index = 0; + kernel_load_cb(fs, NULL, 0, s); +} + + +#define FILE_LOAD_COUNT 2 + +static const char *kernel_file_list[FILE_LOAD_COUNT] = { + ".preload", + ".preload2/preload.txt", +}; + +static void kernel_load_cb(FSDevice *fs, FSQID *qid1, int err, + void *opaque) +{ + FSNetInitState *s = opaque; + FSQID qid; + +#ifdef DUMP_CACHE_LOAD + /* disable preloading if dumping cache load */ + if (((FSDeviceMem *)fs)->dump_cache_load) + return; +#endif + + if (s->fd) { + fs->fs_delete(fs, s->fd); + s->fd = NULL; + } + + if (s->file_index >= FILE_LOAD_COUNT) { + /* all files are loaded */ + if (preload_parse(fs, ".preload2/preload.txt", TRUE) < 0) { + preload_parse(fs, ".preload", FALSE); + } + fs->fs_delete(fs, s->root_fd); + if (s->start_cb) + s->start_cb(s->start_opaque); + free(s); + } else { + s->fd = fs_walk_path(fs, s->root_fd, kernel_file_list[s->file_index++]); + if (!s->fd) + goto done; + err = fs->fs_open(fs, &qid, s->fd, P9_O_RDONLY, kernel_load_cb, s); + if (err <= 0) { + done: + kernel_load_cb(fs, NULL, 0, s); + } + } +} + +static void preload_parse_str_old(FSDevice *fs1, const char *p) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + char fname[1024]; + PreloadEntry *pe; + PreloadFile *pf; + FSINode *n; + + for(;;) { + while (isspace_nolf(*p)) + p++; + if (*p == '\n') { + p++; + continue; + } + if (*p == '\0') + break; + if (parse_fname(fname, sizeof(fname), &p) < 0) { + fprintf(stderr, "invalid filename\n"); + return; + } + // printf("preload file='%s\n", fname); + n = inode_search_path(fs1, fname); + if (!n || n->type != FT_REG || n->u.reg.state == REG_STATE_LOCAL) { + fprintf(stderr, "invalid preload file: '%s'\n", fname); + while (*p != '\n' && *p != '\0') + p++; + } else { + pe = mallocz(sizeof(*pe)); + pe->file_id = n->u.reg.file_id; + init_list_head(&pe->file_list); + list_add_tail(&pe->link, &fs->preload_list); + for(;;) { + while (isspace_nolf(*p)) + p++; + if (*p == '\0' || *p == '\n') + break; + if (parse_fname(fname, sizeof(fname), &p) < 0) { + fprintf(stderr, "invalid filename\n"); + return; + } + // printf(" adding '%s'\n", fname); + pf = mallocz(sizeof(*pf)); + pf->name = strdup(fname); + list_add_tail(&pf->link, &pe->file_list); + } + } + } +} + +static void preload_parse_str(FSDevice *fs1, const char *p) +{ + FSDeviceMem *fs = (FSDeviceMem *)fs1; + PreloadEntry *pe; + PreloadArchive *pa; + FSINode *n; + BOOL is_archive; + char fname[1024]; + + pe = NULL; + pa = NULL; + for(;;) { + while (isspace_nolf(*p)) + p++; + if (*p == '\n') { + pe = NULL; + p++; + continue; + } + if (*p == '#') + continue; /* comment */ + if (*p == '\0') + break; + + is_archive = FALSE; + if (*p == '@') { + is_archive = TRUE; + p++; + } + if (parse_fname(fname, sizeof(fname), &p) < 0) { + fprintf(stderr, "invalid filename\n"); + return; + } + while (isspace_nolf(*p)) + p++; + if (*p == ':') { + p++; + // printf("preload file='%s' archive=%d\n", fname, is_archive); + n = inode_search_path(fs1, fname); + pe = NULL; + pa = NULL; + if (!n || n->type != FT_REG || n->u.reg.state == REG_STATE_LOCAL) { + fprintf(stderr, "invalid preload file: '%s'\n", fname); + while (*p != '\n' && *p != '\0') + p++; + } else if (is_archive) { + pa = mallocz(sizeof(*pa)); + pa->name = strdup(fname); + init_list_head(&pa->file_list); + list_add_tail(&pa->link, &fs->preload_archive_list); + } else { + pe = mallocz(sizeof(*pe)); + pe->file_id = n->u.reg.file_id; + init_list_head(&pe->file_list); + list_add_tail(&pe->link, &fs->preload_list); + } + } else { + if (!pe && !pa) { + fprintf(stderr, "filename without target: %s\n", fname); + return; + } + if (pa) { + PreloadArchiveFile *paf; + FSFileID file_id; + uint64_t size; + + if (parse_uint64(&size, &p) < 0) { + fprintf(stderr, "invalid size\n"); + return; + } + + if (parse_file_id(&file_id, &p) < 0) { + fprintf(stderr, "invalid file id\n"); + return; + } + + paf = mallocz(sizeof(*paf)); + paf->name = strdup(fname); + paf->file_id = file_id; + paf->size = size; + list_add_tail(&paf->link, &pa->file_list); + } else { + PreloadFile *pf; + pf = mallocz(sizeof(*pf)); + pf->name = strdup(fname); + pf->is_archive = is_archive; + list_add_tail(&pf->link, &pe->file_list); + } + } + /* skip the rest of the line */ + while (*p != '\n' && *p != '\0') + p++; + if (*p == '\n') + p++; + } +} + +static int preload_parse(FSDevice *fs, const char *fname, BOOL is_new) +{ + FSINode *n; + char *buf; + size_t size; + + n = inode_search_path(fs, fname); + if (!n || n->type != FT_REG || n->u.reg.state != REG_STATE_LOADED) + return -1; + /* transform to zero terminated string */ + size = n->u.reg.size; + buf = malloc(size + 1); + file_buffer_read(&n->u.reg.fbuf, 0, (uint8_t *)buf, size); + buf[size] = '\0'; + if (is_new) + preload_parse_str(fs, buf); + else + preload_parse_str_old(fs, buf); + free(buf); + return 0; +} + + + +/************************************************************/ +/* FS user interface */ + +typedef struct CmdXHRState { + FSFile *req_fd; + FSFile *root_fd; + FSFile *fd; + FSFile *post_fd; + AES_KEY aes_state; +} CmdXHRState; + +static void fs_cmd_xhr_on_load(FSDevice *fs, FSFile *f, int64_t size, + void *opaque); + +static int parse_hex_buf(uint8_t *buf, int buf_size, const char **pp) +{ + char buf1[1024]; + int len; + + if (parse_fname(buf1, sizeof(buf1), pp) < 0) + return -1; + len = strlen(buf1); + if ((len & 1) != 0) + return -1; + len >>= 1; + if (len > buf_size) + return -1; + if (decode_hex(buf, buf1, len) < 0) + return -1; + return len; +} + +static int fs_cmd_xhr(FSDevice *fs, FSFile *f, + const char *p, uint32_t uid, uint32_t gid) +{ + char url[1024], post_filename[1024], filename[1024]; + char user_buf[128], *user; + char password_buf[128], *password; + FSQID qid; + FSFile *fd, *root_fd, *post_fd; + uint64_t post_data_len; + int err, aes_key_len; + CmdXHRState *s; + char *name; + AES_KEY *paes_state; + uint8_t aes_key[FS_KEY_LEN]; + uint32_t flags; + FSCMDRequest *req; + + /* a request is already done or in progress */ + if (f->req != NULL) + return -P9_EIO; + + if (parse_fname(url, sizeof(url), &p) < 0) + goto fail; + if (parse_fname(user_buf, sizeof(user_buf), &p) < 0) + goto fail; + if (parse_fname(password_buf, sizeof(password_buf), &p) < 0) + goto fail; + if (parse_fname(post_filename, sizeof(post_filename), &p) < 0) + goto fail; + if (parse_fname(filename, sizeof(filename), &p) < 0) + goto fail; + aes_key_len = parse_hex_buf(aes_key, FS_KEY_LEN, &p); + if (aes_key_len < 0) + goto fail; + if (parse_uint32(&flags, &p) < 0) + goto fail; + if (aes_key_len != 0 && aes_key_len != FS_KEY_LEN) + goto fail; + + if (user_buf[0] != '\0') + user = user_buf; + else + user = NULL; + if (password_buf[0] != '\0') + password = password_buf; + else + password = NULL; + + // printf("url='%s' '%s' '%s' filename='%s'\n", url, user, password, filename); + assert(!fs->fs_attach(fs, &root_fd, &qid, uid, "", "")); + post_fd = NULL; + + fd = fs_walk_path1(fs, root_fd, filename, &name); + if (!fd) { + err = -P9_ENOENT; + goto fail1; + } + /* XXX: until fs_create is fixed */ + fs->fs_unlinkat(fs, fd, name); + + err = fs->fs_create(fs, &qid, fd, name, + P9_O_RDWR | P9_O_TRUNC, 0600, gid); + if (err < 0) { + goto fail1; + } + + if (post_filename[0] != '\0') { + FSINode *n; + + post_fd = fs_walk_path(fs, root_fd, post_filename); + if (!post_fd) { + err = -P9_ENOENT; + goto fail1; + } + err = fs->fs_open(fs, &qid, post_fd, P9_O_RDONLY, NULL, NULL); + if (err < 0) + goto fail1; + n = post_fd->inode; + assert(n->type == FT_REG && n->u.reg.state == REG_STATE_LOCAL); + post_data_len = n->u.reg.size; + } else { + post_data_len = 0; + } + + s = mallocz(sizeof(*s)); + s->root_fd = root_fd; + s->fd = fd; + s->post_fd = post_fd; + if (aes_key_len != 0) { + AES_set_decrypt_key(aes_key, FS_KEY_LEN * 8, &s->aes_state); + paes_state = &s->aes_state; + } else { + paes_state = NULL; + } + + req = mallocz(sizeof(*req)); + req->type = FS_CMD_XHR; + req->reply_len = 0; + req->xhr_state = s; + s->req_fd = f; + f->req = req; + + fs_wget_file2(fs, fd, url, user, password, post_fd, post_data_len, + fs_cmd_xhr_on_load, s, paes_state); + return 0; + fail1: + if (fd) + fs->fs_delete(fs, fd); + if (post_fd) + fs->fs_delete(fs, post_fd); + fs->fs_delete(fs, root_fd); + return err; + fail: + return -P9_EIO; +} + +static void fs_cmd_xhr_on_load(FSDevice *fs, FSFile *f, int64_t size, + void *opaque) +{ + CmdXHRState *s = opaque; + FSCMDRequest *req; + int ret; + + // printf("fs_cmd_xhr_on_load: size=%d\n", (int)size); + + if (s->fd) + fs->fs_delete(fs, s->fd); + if (s->post_fd) + fs->fs_delete(fs, s->post_fd); + fs->fs_delete(fs, s->root_fd); + + if (s->req_fd) { + req = s->req_fd->req; + if (size < 0) { + ret = size; + } else { + ret = 0; + } + put_le32(req->reply_buf, ret); + req->reply_len = sizeof(ret); + req->xhr_state = NULL; + } + free(s); +} + +static int fs_cmd_set_base_url(FSDevice *fs, const char *p) +{ + // FSDeviceMem *fs1 = (FSDeviceMem *)fs; + char url[1024], base_url_id[1024]; + char user_buf[128], *user; + char password_buf[128], *password; + AES_KEY aes_state, *paes_state; + uint8_t aes_key[FS_KEY_LEN]; + int aes_key_len; + + if (parse_fname(base_url_id, sizeof(base_url_id), &p) < 0) + goto fail; + if (parse_fname(url, sizeof(url), &p) < 0) + goto fail; + if (parse_fname(user_buf, sizeof(user_buf), &p) < 0) + goto fail; + if (parse_fname(password_buf, sizeof(password_buf), &p) < 0) + goto fail; + aes_key_len = parse_hex_buf(aes_key, FS_KEY_LEN, &p); + if (aes_key_len < 0) + goto fail; + + if (user_buf[0] != '\0') + user = user_buf; + else + user = NULL; + if (password_buf[0] != '\0') + password = password_buf; + else + password = NULL; + + if (aes_key_len != 0) { + if (aes_key_len != FS_KEY_LEN) + goto fail; + AES_set_decrypt_key(aes_key, FS_KEY_LEN * 8, &aes_state); + paes_state = &aes_state; + } else { + paes_state = NULL; + } + + fs_net_set_base_url(fs, base_url_id, url, user, password, + paes_state); + return 0; + fail: + return -P9_EINVAL; +} + +static int fs_cmd_reset_base_url(FSDevice *fs, const char *p) +{ + char base_url_id[1024]; + + if (parse_fname(base_url_id, sizeof(base_url_id), &p) < 0) + goto fail; + fs_net_reset_base_url(fs, base_url_id); + return 0; + fail: + return -P9_EINVAL; +} + +static int fs_cmd_set_url(FSDevice *fs, const char *p) +{ + char base_url_id[1024]; + char filename[1024]; + FSFileID file_id; + uint64_t size; + FSINode *n; + + if (parse_fname(filename, sizeof(filename), &p) < 0) + goto fail; + if (parse_fname(base_url_id, sizeof(base_url_id), &p) < 0) + goto fail; + if (parse_file_id(&file_id, &p) < 0) + goto fail; + if (parse_uint64(&size, &p) < 0) + goto fail; + + n = inode_search_path(fs, filename); + if (!n) { + return -P9_ENOENT; + } + return fs_net_set_url(fs, n, base_url_id, file_id, size); + fail: + return -P9_EINVAL; +} + +static int fs_cmd_export_file(FSDevice *fs, const char *p) +{ + char filename[1024]; + FSINode *n; + const char *name; + uint8_t *buf; + + if (parse_fname(filename, sizeof(filename), &p) < 0) + goto fail; + n = inode_search_path(fs, filename); + if (!n) + return -P9_ENOENT; + if (n->type != FT_REG || + (n->u.reg.state != REG_STATE_LOCAL && + n->u.reg.state != REG_STATE_LOADED)) + goto fail; + name = strrchr(filename, '/'); + if (name) + name++; + else + name = filename; + /* XXX: pass the buffer to JS to avoid the allocation */ + buf = malloc(n->u.reg.size); + file_buffer_read(&n->u.reg.fbuf, 0, buf, n->u.reg.size); + fs_export_file(name, buf, n->u.reg.size); + free(buf); + return 0; + fail: + return -P9_EIO; +} + +/* PBKDF2 crypto acceleration */ +static int fs_cmd_pbkdf2(FSDevice *fs, FSFile *f, const char *p) +{ + uint8_t pwd[1024]; + uint8_t salt[128]; + uint32_t iter, key_len; + int pwd_len, salt_len; + FSCMDRequest *req; + + /* a request is already done or in progress */ + if (f->req != NULL) + return -P9_EIO; + + pwd_len = parse_hex_buf(pwd, sizeof(pwd), &p); + if (pwd_len < 0) + goto fail; + salt_len = parse_hex_buf(salt, sizeof(salt), &p); + if (pwd_len < 0) + goto fail; + if (parse_uint32(&iter, &p) < 0) + goto fail; + if (parse_uint32(&key_len, &p) < 0) + goto fail; + if (key_len > FS_CMD_REPLY_LEN_MAX || + key_len == 0) + goto fail; + req = mallocz(sizeof(*req)); + req->type = FS_CMD_PBKDF2; + req->reply_len = key_len; + pbkdf2_hmac_sha256(pwd, pwd_len, salt, salt_len, iter, key_len, + req->reply_buf); + f->req = req; + return 0; + fail: + return -P9_EINVAL; +} + +static int fs_cmd_set_import_dir(FSDevice *fs, FSFile *f, const char *p) +{ + FSDeviceMem *fs1 = (FSDeviceMem *)fs; + char filename[1024]; + + if (parse_fname(filename, sizeof(filename), &p) < 0) + return -P9_EINVAL; + free(fs1->import_dir); + fs1->import_dir = strdup(filename); + return 0; +} + +static int fs_cmd_write(FSDevice *fs, FSFile *f, uint64_t offset, + const uint8_t *buf, int buf_len) +{ + char *buf1; + const char *p; + char cmd[64]; + int err; + + /* transform into a string */ + buf1 = malloc(buf_len + 1); + memcpy(buf1, buf, buf_len); + buf1[buf_len] = '\0'; + + err = 0; + p = buf1; + if (parse_fname(cmd, sizeof(cmd), &p) < 0) + goto fail; + if (!strcmp(cmd, "xhr")) { + err = fs_cmd_xhr(fs, f, p, f->uid, 0); + } else if (!strcmp(cmd, "set_base_url")) { + err = fs_cmd_set_base_url(fs, p); + } else if (!strcmp(cmd, "reset_base_url")) { + err = fs_cmd_reset_base_url(fs, p); + } else if (!strcmp(cmd, "set_url")) { + err = fs_cmd_set_url(fs, p); + } else if (!strcmp(cmd, "export_file")) { + err = fs_cmd_export_file(fs, p); + } else if (!strcmp(cmd, "pbkdf2")) { + err = fs_cmd_pbkdf2(fs, f, p); + } else if (!strcmp(cmd, "set_import_dir")) { + err = fs_cmd_set_import_dir(fs, f, p); + } else { + printf("unknown command: '%s'\n", cmd); + fail: + err = -P9_EIO; + } + free(buf1); + if (err == 0) + return buf_len; + else + return err; +} + +static int fs_cmd_read(FSDevice *fs, FSFile *f, uint64_t offset, + uint8_t *buf, int buf_len) +{ + FSCMDRequest *req; + int l; + + req = f->req; + if (!req) + return -P9_EIO; + l = min_int(req->reply_len, buf_len); + memcpy(buf, req->reply_buf, l); + return l; +} + +static void fs_cmd_close(FSDevice *fs, FSFile *f) +{ + FSCMDRequest *req; + req = f->req; + + if (req) { + if (req->xhr_state) { + req->xhr_state->req_fd = NULL; + } + free(req); + f->req = NULL; + } +} + +/* Create a .fscmd_pwd file to avoid passing the password thru the + Linux command line */ +void fs_net_set_pwd(FSDevice *fs, const char *pwd) +{ + FSFile *root_fd; + FSQID qid; + + assert(fs_is_net(fs)); + + assert(!fs->fs_attach(fs, &root_fd, &qid, 0, "", "")); + assert(!fs->fs_create(fs, &qid, root_fd, ".fscmd_pwd", P9_O_RDWR | P9_O_TRUNC, + 0600, 0)); + fs->fs_write(fs, root_fd, 0, (uint8_t *)pwd, strlen(pwd)); + fs->fs_delete(fs, root_fd); +} + +/* external file import */ + +#ifdef EMSCRIPTEN + +void fs_import_file(const char *filename, uint8_t *buf, int buf_len) +{ + FSDevice *fs; + FSDeviceMem *fs1; + FSFile *fd, *root_fd; + FSQID qid; + + // printf("importing file: %s len=%d\n", filename, buf_len); + fs = fs_import_fs; + if (!fs) { + free(buf); + return; + } + + assert(!fs->fs_attach(fs, &root_fd, &qid, 1000, "", "")); + fs1 = (FSDeviceMem *)fs; + fd = fs_walk_path(fs, root_fd, fs1->import_dir); + if (!fd) + goto fail; + fs_unlinkat(fs, root_fd, filename); + if (fs->fs_create(fs, &qid, fd, filename, P9_O_RDWR | P9_O_TRUNC, + 0600, 0) < 0) + goto fail; + fs->fs_write(fs, fd, 0, buf, buf_len); + fail: + if (fd) + fs->fs_delete(fs, fd); + if (root_fd) + fs->fs_delete(fs, root_fd); + free(buf); +} + +#else + +void fs_export_file(const char *filename, + const uint8_t *buf, int buf_len) +{ +} + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c new file mode 100644 index 0000000..37f399d --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.c @@ -0,0 +1,370 @@ +/* + * Misc FS utilities + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <ctype.h> +#include <sys/file.h> + +#include "cutils.h" +#include "list.h" +#include "fs_utils.h" + +/* last byte is the version */ +const uint8_t encrypted_file_magic[4] = { 0xfb, 0xa2, 0xe9, 0x01 }; + +char *compose_path(const char *path, const char *name) +{ + int path_len, name_len; + char *d, *q; + + if (path[0] == '\0') { + d = strdup(name); + } else { + path_len = strlen(path); + name_len = strlen(name); + d = malloc(path_len + 1 + name_len + 1); + q = d; + memcpy(q, path, path_len); + q += path_len; + if (path[path_len - 1] != '/') + *q++ = '/'; + memcpy(q, name, name_len + 1); + } + return d; +} + +char *compose_url(const char *base_url, const char *name) +{ + if (strchr(name, ':')) { + return strdup(name); + } else { + return compose_path(base_url, name); + } +} + +void skip_line(const char **pp) +{ + const char *p; + p = *pp; + while (*p != '\n' && *p != '\0') + p++; + if (*p == '\n') + p++; + *pp = p; +} + +char *quoted_str(const char *str) +{ + const char *s; + char *q; + int c; + char *buf; + + if (str[0] == '\0') + goto use_quote; + s = str; + while (*s != '\0') { + if (*s <= ' ' || *s > '~') + goto use_quote; + s++; + } + return strdup(str); + use_quote: + buf = malloc(strlen(str) * 4 + 2 + 1); + q = buf; + s = str; + *q++ = '"'; + while (*s != '\0') { + c = *(uint8_t *)s; + if (c < ' ' || c == 127) { + q += sprintf(q, "\\x%02x", c); + } else if (c == '\\' || c == '\"') { + q += sprintf(q, "\\%c", c); + } else { + *q++ = c; + } + s++; + } + *q++ = '"'; + *q = '\0'; + return buf; +} + +int parse_fname(char *buf, int buf_size, const char **pp) +{ + const char *p; + char *q; + int c, h; + + p = *pp; + while (isspace_nolf(*p)) + p++; + if (*p == '\0') + return -1; + q = buf; + if (*p == '"') { + p++; + for(;;) { + c = *p++; + if (c == '\0' || c == '\n') { + return -1; + } else if (c == '\"') { + break; + } else if (c == '\\') { + c = *p++; + switch(c) { + case '\'': + case '\"': + case '\\': + goto add_char; + case 'n': + c = '\n'; + goto add_char; + case 'r': + c = '\r'; + goto add_char; + case 't': + c = '\t'; + goto add_char; + case 'x': + h = from_hex(*p++); + if (h < 0) + return -1; + c = h << 4; + h = from_hex(*p++); + if (h < 0) + return -1; + c |= h; + goto add_char; + default: + return -1; + } + } else { + add_char: + if (q >= buf + buf_size - 1) + return -1; + *q++ = c; + } + } + } else { + while (!isspace_nolf(*p) && *p != '\0' && *p != '\n') { + if (q >= buf + buf_size - 1) + return -1; + *q++ = *p++; + } + } + *q = '\0'; + *pp = p; + return 0; +} + +int parse_uint32_base(uint32_t *pval, const char **pp, int base) +{ + const char *p, *p1; + p = *pp; + while (isspace_nolf(*p)) + p++; + *pval = strtoul(p, (char **)&p1, base); + if (p1 == p) + return -1; + *pp = p1; + return 0; +} + +int parse_uint64_base(uint64_t *pval, const char **pp, int base) +{ + const char *p, *p1; + p = *pp; + while (isspace_nolf(*p)) + p++; + *pval = strtoull(p, (char **)&p1, base); + if (p1 == p) + return -1; + *pp = p1; + return 0; +} + +int parse_uint64(uint64_t *pval, const char **pp) +{ + return parse_uint64_base(pval, pp, 0); +} + +int parse_uint32(uint32_t *pval, const char **pp) +{ + return parse_uint32_base(pval, pp, 0); +} + +int parse_time(uint32_t *psec, uint32_t *pnsec, const char **pp) +{ + const char *p; + uint32_t v, m; + p = *pp; + if (parse_uint32(psec, &p) < 0) + return -1; + v = 0; + if (*p == '.') { + p++; + /* XXX: inefficient */ + m = 1000000000; + v = 0; + while (*p >= '0' && *p <= '9') { + m /= 10; + v += (*p - '0') * m; + p++; + } + } + *pnsec = v; + *pp = p; + return 0; +} + +int parse_file_id(FSFileID *pval, const char **pp) +{ + return parse_uint64_base(pval, pp, 16); +} + +char *file_id_to_filename(char *buf, FSFileID file_id) +{ + sprintf(buf, "%016" PRIx64, file_id); + return buf; +} + +void encode_hex(char *str, const uint8_t *buf, int len) +{ + int i; + for(i = 0; i < len; i++) + sprintf(str + 2 * i, "%02x", buf[i]); +} + +int decode_hex(uint8_t *buf, const char *str, int len) +{ + int h0, h1, i; + + for(i = 0; i < len; i++) { + h0 = from_hex(str[2 * i]); + if (h0 < 0) + return -1; + h1 = from_hex(str[2 * i + 1]); + if (h1 < 0) + return -1; + buf[i] = (h0 << 4) | h1; + } + return 0; +} + +/* return NULL if no end of header found */ +const char *skip_header(const char *p) +{ + p = strstr(p, "\n\n"); + if (!p) + return NULL; + return p + 2; +} + +/* return 0 if OK, < 0 if error */ +int parse_tag(char *buf, int buf_size, const char *str, const char *tag) +{ + char tagname[128], *q; + const char *p, *p1; + int len; + + p = str; + for(;;) { + if (*p == '\0' || *p == '\n') + break; + q = tagname; + while (*p != ':' && *p != '\n' && *p != '\0') { + if ((q - tagname) < sizeof(tagname) - 1) + *q++ = *p; + p++; + } + *q = '\0'; + if (*p != ':') + return -1; + p++; + while (isspace_nolf(*p)) + p++; + p1 = p; + p = strchr(p, '\n'); + if (!p) + len = strlen(p1); + else + len = p - p1; + if (!strcmp(tagname, tag)) { + if (len > buf_size - 1) + len = buf_size - 1; + memcpy(buf, p1, len); + buf[len] = '\0'; + return 0; + } + if (!p) + break; + else + p++; + } + return -1; +} + +int parse_tag_uint64(uint64_t *pval, const char *str, const char *tag) +{ + char buf[64]; + const char *p; + if (parse_tag(buf, sizeof(buf), str, tag)) + return -1; + p = buf; + return parse_uint64(pval, &p); +} + +int parse_tag_file_id(FSFileID *pval, const char *str, const char *tag) +{ + char buf[64]; + const char *p; + if (parse_tag(buf, sizeof(buf), str, tag)) + return -1; + p = buf; + return parse_uint64_base(pval, &p, 16); +} + +int parse_tag_version(const char *str) +{ + uint64_t version; + if (parse_tag_uint64(&version, str, "Version")) + return -1; + return version; +} + +BOOL is_url(const char *path) +{ + return (strstart(path, "http:", NULL) || + strstart(path, "https:", NULL) || + strstart(path, "file:", NULL)); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h new file mode 100644 index 0000000..4e4b9cd --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_utils.h @@ -0,0 +1,95 @@ +/* + * Misc FS utilities + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#define HEAD_FILENAME "head" +#define ROOT_FILENAME "files" + +#define FILEID_SIZE_MAX 32 + +#define FS_KEY_LEN 16 + +/* default block size to determine the total filesytem size */ +#define FS_BLOCK_SIZE_LOG2 12 +#define FS_BLOCK_SIZE (1 << FS_BLOCK_SIZE_LOG2) + +typedef enum { + FS_ERR_OK = 0, + FS_ERR_GENERIC = -1, + FS_ERR_SYNTAX = -2, + FS_ERR_REVISION = -3, + FS_ERR_FILE_ID = -4, + FS_ERR_IO = -5, + FS_ERR_NOENT = -6, + FS_ERR_COUNTERS = -7, + FS_ERR_QUOTA = -8, + FS_ERR_PROTOCOL_VERSION = -9, + FS_ERR_HEAD = -10, +} FSCommitErrorCode; + +typedef uint64_t FSFileID; + +static inline BOOL isspace_nolf(int c) +{ + return (c == ' ' || c == '\t'); +} + +static inline int from_hex(int c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else + return -1; +} + +static inline uint64_t block_align(uint64_t val, uint64_t align) +{ + return (val + align - 1) & ~(align - 1); +} + +void pstrcpy(char *buf, int buf_size, const char *str); +char *pstrcat(char *buf, int buf_size, const char *s); +char *compose_path(const char *path, const char *name); +char *compose_url(const char *base_url, const char *name); +void skip_line(const char **pp); +char *quoted_str(const char *str); +int parse_fname(char *buf, int buf_size, const char **pp); +int parse_uint32_base(uint32_t *pval, const char **pp, int base); +int parse_uint64_base(uint64_t *pval, const char **pp, int base); +int parse_uint64(uint64_t *pval, const char **pp); +int parse_uint32(uint32_t *pval, const char **pp); +int parse_time(uint32_t *psec, uint32_t *pnsec, const char **pp); +int parse_file_id(FSFileID *pval, const char **pp); +char *file_id_to_filename(char *buf, FSFileID file_id); +void encode_hex(char *str, const uint8_t *buf, int len); +int decode_hex(uint8_t *buf, const char *str, int len); +BOOL is_url(const char *path); + +const char *skip_header(const char *p); +int parse_tag(char *buf, int buf_size, const char *str, const char *tag); +int parse_tag_uint64(uint64_t *pval, const char *str, const char *tag); +int parse_tag_file_id(FSFileID *pval, const char *str, const char *tag); +int parse_tag_version(const char *str); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c new file mode 100644 index 0000000..b4857b0 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.c @@ -0,0 +1,625 @@ +/* + * HTTP file download + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> +#include <sys/time.h> +#include <ctype.h> + +#include "cutils.h" +#include "list.h" +#include "fs.h" +#include "fs_utils.h" +#include "fs_wget.h" + +#if defined(EMSCRIPTEN) +#include <emscripten.h> +#else +#include <curl/multi.h> +#endif + +/***********************************************/ +/* HTTP get */ + +#ifdef EMSCRIPTEN + +struct XHRState { + void *opaque; + WGetWriteCallback *cb; +}; + +static int downloading_count; + +void fs_wget_init(void) +{ +} + +extern void fs_wget_update_downloading(int flag); + +static void fs_wget_update_downloading_count(int incr) +{ + int prev_state, state; + prev_state = (downloading_count > 0); + downloading_count += incr; + state = (downloading_count > 0); + if (prev_state != state) + fs_wget_update_downloading(state); +} + +static void fs_wget_onerror(unsigned int handle, void *opaque, int status, + const char *status_text) +{ + XHRState *s = opaque; + if (status <= 0) + status = -404; /* HTTP not found error */ + else + status = -status; + fs_wget_update_downloading_count(-1); + if (s->cb) + s->cb(s->opaque, status, NULL, 0); +} + +static void fs_wget_onload(unsigned int handle, + void *opaque, void *data, unsigned int size) +{ + XHRState *s = opaque; + fs_wget_update_downloading_count(-1); + if (s->cb) + s->cb(s->opaque, 0, data, size); +} + +extern int emscripten_async_wget3_data(const char* url, const char* requesttype, const char *user, const char *password, const uint8_t *post_data, int post_data_len, void *arg, int free, em_async_wget2_data_onload_func onload, em_async_wget2_data_onerror_func onerror, em_async_wget2_data_onprogress_func onprogress); + +XHRState *fs_wget2(const char *url, const char *user, const char *password, + WGetReadCallback *read_cb, uint64_t post_data_len, + void *opaque, WGetWriteCallback *cb, BOOL single_write) +{ + XHRState *s; + const char *request; + uint8_t *post_data; + + s = mallocz(sizeof(*s)); + s->opaque = opaque; + s->cb = cb; + + if (post_data_len != 0) { + request = "POST"; + post_data = malloc(post_data_len); + read_cb(opaque, post_data, post_data_len); + } else { + request = "GET"; + post_data = NULL; + } + fs_wget_update_downloading_count(1); + + emscripten_async_wget3_data(url, request, user, password, + post_data, post_data_len, s, 1, fs_wget_onload, + fs_wget_onerror, NULL); + if (post_data_len != 0) + free(post_data); + return s; +} + +void fs_wget_free(XHRState *s) +{ + s->cb = NULL; + s->opaque = NULL; +} + +#else + +struct XHRState { + struct list_head link; + CURL *eh; + void *opaque; + WGetWriteCallback *write_cb; + WGetReadCallback *read_cb; + + BOOL single_write; + DynBuf dbuf; /* used if single_write */ +}; + +typedef struct { + struct list_head link; + int64_t timeout; + void (*cb)(void *opaque); + void *opaque; +} AsyncCallState; + +static CURLM *curl_multi_ctx; +static struct list_head xhr_list; /* list of XHRState.link */ + +void fs_wget_init(void) +{ + if (curl_multi_ctx) + return; + curl_global_init(CURL_GLOBAL_ALL); + curl_multi_ctx = curl_multi_init(); + init_list_head(&xhr_list); +} + +void fs_wget_end(void) +{ + curl_multi_cleanup(curl_multi_ctx); + curl_global_cleanup(); +} + +static size_t fs_wget_write_cb(char *ptr, size_t size, size_t nmemb, + void *userdata) +{ + XHRState *s = userdata; + size *= nmemb; + + if (s->single_write) { + dbuf_write(&s->dbuf, s->dbuf.size, (void *)ptr, size); + } else { + s->write_cb(s->opaque, 1, ptr, size); + } + return size; +} + +static size_t fs_wget_read_cb(char *ptr, size_t size, size_t nmemb, + void *userdata) +{ + XHRState *s = userdata; + size *= nmemb; + return s->read_cb(s->opaque, ptr, size); +} + +XHRState *fs_wget2(const char *url, const char *user, const char *password, + WGetReadCallback *read_cb, uint64_t post_data_len, + void *opaque, WGetWriteCallback *write_cb, BOOL single_write) +{ + XHRState *s; + s = mallocz(sizeof(*s)); + s->eh = curl_easy_init(); + s->opaque = opaque; + s->write_cb = write_cb; + s->read_cb = read_cb; + s->single_write = single_write; + dbuf_init(&s->dbuf); + + curl_easy_setopt(s->eh, CURLOPT_PRIVATE, s); + curl_easy_setopt(s->eh, CURLOPT_WRITEDATA, s); + curl_easy_setopt(s->eh, CURLOPT_WRITEFUNCTION, fs_wget_write_cb); + curl_easy_setopt(s->eh, CURLOPT_HEADER, 0); + curl_easy_setopt(s->eh, CURLOPT_URL, url); + curl_easy_setopt(s->eh, CURLOPT_VERBOSE, 0L); + curl_easy_setopt(s->eh, CURLOPT_ACCEPT_ENCODING, ""); + if (user) { + curl_easy_setopt(s->eh, CURLOPT_USERNAME, user); + curl_easy_setopt(s->eh, CURLOPT_PASSWORD, password); + } + if (post_data_len != 0) { + struct curl_slist *headers = NULL; + headers = curl_slist_append(headers, + "Content-Type: application/octet-stream"); + curl_easy_setopt(s->eh, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(s->eh, CURLOPT_POST, 1L); + curl_easy_setopt(s->eh, CURLOPT_POSTFIELDSIZE_LARGE, + (curl_off_t)post_data_len); + curl_easy_setopt(s->eh, CURLOPT_READDATA, s); + curl_easy_setopt(s->eh, CURLOPT_READFUNCTION, fs_wget_read_cb); + } + curl_multi_add_handle(curl_multi_ctx, s->eh); + list_add_tail(&s->link, &xhr_list); + return s; +} + +void fs_wget_free(XHRState *s) +{ + dbuf_free(&s->dbuf); + curl_easy_cleanup(s->eh); + list_del(&s->link); + free(s); +} + +/* timeout is in ms */ +void fs_net_set_fdset(int *pfd_max, fd_set *rfds, fd_set *wfds, fd_set *efds, + int *ptimeout) +{ + long timeout; + int n, fd_max; + CURLMsg *msg; + + if (!curl_multi_ctx) + return; + + curl_multi_perform(curl_multi_ctx, &n); + + for(;;) { + msg = curl_multi_info_read(curl_multi_ctx, &n); + if (!msg) + break; + if (msg->msg == CURLMSG_DONE) { + XHRState *s; + long http_code; + + curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, (char **)&s); + curl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE, + &http_code); + /* signal the end of the transfer or error */ + if (http_code == 200) { + if (s->single_write) { + s->write_cb(s->opaque, 0, s->dbuf.buf, s->dbuf.size); + } else { + s->write_cb(s->opaque, 0, NULL, 0); + } + } else { + s->write_cb(s->opaque, -http_code, NULL, 0); + } + curl_multi_remove_handle(curl_multi_ctx, s->eh); + curl_easy_cleanup(s->eh); + dbuf_free(&s->dbuf); + list_del(&s->link); + free(s); + } + } + + curl_multi_fdset(curl_multi_ctx, rfds, wfds, efds, &fd_max); + *pfd_max = max_int(*pfd_max, fd_max); + curl_multi_timeout(curl_multi_ctx, &timeout); + if (timeout >= 0) + *ptimeout = min_int(*ptimeout, timeout); +} + +void fs_net_event_loop(FSNetEventLoopCompletionFunc *cb, void *opaque) +{ + fd_set rfds, wfds, efds; + int timeout, fd_max; + struct timeval tv; + + if (!curl_multi_ctx) + return; + + for(;;) { + fd_max = -1; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + timeout = 10000; + fs_net_set_fdset(&fd_max, &rfds, &wfds, &efds, &timeout); + if (cb) { + if (cb(opaque)) + break; + } else { + if (list_empty(&xhr_list)) + break; + } + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + select(fd_max + 1, &rfds, &wfds, &efds, &tv); + } +} + +#endif /* !EMSCRIPTEN */ + +XHRState *fs_wget(const char *url, const char *user, const char *password, + void *opaque, WGetWriteCallback *cb, BOOL single_write) +{ + return fs_wget2(url, user, password, NULL, 0, opaque, cb, single_write); +} + +/***********************************************/ +/* file decryption */ + +#define ENCRYPTED_FILE_HEADER_SIZE (4 + AES_BLOCK_SIZE) + +#define DEC_BUF_SIZE (256 * AES_BLOCK_SIZE) + +struct DecryptFileState { + DecryptFileCB *write_cb; + void *opaque; + int dec_state; + int dec_buf_pos; + AES_KEY *aes_state; + uint8_t iv[AES_BLOCK_SIZE]; + uint8_t dec_buf[DEC_BUF_SIZE]; +}; + +DecryptFileState *decrypt_file_init(AES_KEY *aes_state, + DecryptFileCB *write_cb, + void *opaque) +{ + DecryptFileState *s; + s = mallocz(sizeof(*s)); + s->write_cb = write_cb; + s->opaque = opaque; + s->aes_state = aes_state; + return s; +} + +int decrypt_file(DecryptFileState *s, const uint8_t *data, + size_t size) +{ + int l, len, ret; + + while (size != 0) { + switch(s->dec_state) { + case 0: + l = min_int(size, ENCRYPTED_FILE_HEADER_SIZE - s->dec_buf_pos); + memcpy(s->dec_buf + s->dec_buf_pos, data, l); + s->dec_buf_pos += l; + if (s->dec_buf_pos >= ENCRYPTED_FILE_HEADER_SIZE) { + if (memcmp(s->dec_buf, encrypted_file_magic, 4) != 0) + return -1; + memcpy(s->iv, s->dec_buf + 4, AES_BLOCK_SIZE); + s->dec_state = 1; + s->dec_buf_pos = 0; + } + break; + case 1: + l = min_int(size, DEC_BUF_SIZE - s->dec_buf_pos); + memcpy(s->dec_buf + s->dec_buf_pos, data, l); + s->dec_buf_pos += l; + if (s->dec_buf_pos >= DEC_BUF_SIZE) { + /* keep one block in case it is the padding */ + len = s->dec_buf_pos - AES_BLOCK_SIZE; + AES_cbc_encrypt(s->dec_buf, s->dec_buf, len, + s->aes_state, s->iv, FALSE); + ret = s->write_cb(s->opaque, s->dec_buf, len); + if (ret < 0) + return ret; + memcpy(s->dec_buf, s->dec_buf + s->dec_buf_pos - AES_BLOCK_SIZE, + AES_BLOCK_SIZE); + s->dec_buf_pos = AES_BLOCK_SIZE; + } + break; + default: + abort(); + } + data += l; + size -= l; + } + return 0; +} + +/* write last blocks */ +int decrypt_file_flush(DecryptFileState *s) +{ + int len, pad_len, ret; + + if (s->dec_state != 1) + return -1; + len = s->dec_buf_pos; + if (len == 0 || + (len % AES_BLOCK_SIZE) != 0) + return -1; + AES_cbc_encrypt(s->dec_buf, s->dec_buf, len, + s->aes_state, s->iv, FALSE); + pad_len = s->dec_buf[s->dec_buf_pos - 1]; + if (pad_len < 1 || pad_len > AES_BLOCK_SIZE) + return -1; + len -= pad_len; + if (len != 0) { + ret = s->write_cb(s->opaque, s->dec_buf, len); + if (ret < 0) + return ret; + } + return 0; +} + +void decrypt_file_end(DecryptFileState *s) +{ + free(s); +} + +/* XHR file */ + +typedef struct { + FSDevice *fs; + FSFile *f; + int64_t pos; + FSWGetFileCB *cb; + void *opaque; + FSFile *posted_file; + int64_t read_pos; + DecryptFileState *dec_state; +} FSWGetFileState; + +static int fs_wget_file_write_cb(void *opaque, const uint8_t *data, + size_t size) +{ + FSWGetFileState *s = opaque; + FSDevice *fs = s->fs; + int ret; + + ret = fs->fs_write(fs, s->f, s->pos, data, size); + if (ret < 0) + return ret; + s->pos += ret; + return ret; +} + +static void fs_wget_file_on_load(void *opaque, int err, void *data, size_t size) +{ + FSWGetFileState *s = opaque; + FSDevice *fs = s->fs; + int ret; + int64_t ret_size; + + // printf("err=%d size=%ld\n", err, size); + if (err < 0) { + ret_size = err; + goto done; + } else { + if (s->dec_state) { + ret = decrypt_file(s->dec_state, data, size); + if (ret >= 0 && err == 0) { + /* handle the end of file */ + decrypt_file_flush(s->dec_state); + } + } else { + ret = fs_wget_file_write_cb(s, data, size); + } + if (ret < 0) { + ret_size = ret; + goto done; + } else if (err == 0) { + /* end of transfer */ + ret_size = s->pos; + done: + s->cb(fs, s->f, ret_size, s->opaque); + if (s->dec_state) + decrypt_file_end(s->dec_state); + free(s); + } + } +} + +static size_t fs_wget_file_read_cb(void *opaque, void *data, size_t size) +{ + FSWGetFileState *s = opaque; + FSDevice *fs = s->fs; + int ret; + + if (!s->posted_file) + return 0; + ret = fs->fs_read(fs, s->posted_file, s->read_pos, data, size); + if (ret < 0) + return 0; + s->read_pos += ret; + return ret; +} + +void fs_wget_file2(FSDevice *fs, FSFile *f, const char *url, + const char *user, const char *password, + FSFile *posted_file, uint64_t post_data_len, + FSWGetFileCB *cb, void *opaque, + AES_KEY *aes_state) +{ + FSWGetFileState *s; + s = mallocz(sizeof(*s)); + s->fs = fs; + s->f = f; + s->pos = 0; + s->cb = cb; + s->opaque = opaque; + s->posted_file = posted_file; + s->read_pos = 0; + if (aes_state) { + s->dec_state = decrypt_file_init(aes_state, fs_wget_file_write_cb, s); + } + + fs_wget2(url, user, password, fs_wget_file_read_cb, post_data_len, + s, fs_wget_file_on_load, FALSE); +} + +/***********************************************/ +/* PBKDF2 */ + +#ifdef USE_BUILTIN_CRYPTO + +#define HMAC_BLOCK_SIZE 64 + +typedef struct { + SHA256_CTX ctx; + uint8_t K[HMAC_BLOCK_SIZE + SHA256_DIGEST_LENGTH]; +} HMAC_SHA256_CTX; + +void hmac_sha256_init(HMAC_SHA256_CTX *s, const uint8_t *key, int key_len) +{ + int i, l; + + if (key_len > HMAC_BLOCK_SIZE) { + SHA256(key, key_len, s->K); + l = SHA256_DIGEST_LENGTH; + } else { + memcpy(s->K, key, key_len); + l = key_len; + } + memset(s->K + l, 0, HMAC_BLOCK_SIZE - l); + for(i = 0; i < HMAC_BLOCK_SIZE; i++) + s->K[i] ^= 0x36; + SHA256_Init(&s->ctx); + SHA256_Update(&s->ctx, s->K, HMAC_BLOCK_SIZE); +} + +void hmac_sha256_update(HMAC_SHA256_CTX *s, const uint8_t *buf, int len) +{ + SHA256_Update(&s->ctx, buf, len); +} + +/* out has a length of SHA256_DIGEST_LENGTH */ +void hmac_sha256_final(HMAC_SHA256_CTX *s, uint8_t *out) +{ + int i; + + SHA256_Final(s->K + HMAC_BLOCK_SIZE, &s->ctx); + for(i = 0; i < HMAC_BLOCK_SIZE; i++) + s->K[i] ^= (0x36 ^ 0x5c); + SHA256(s->K, HMAC_BLOCK_SIZE + SHA256_DIGEST_LENGTH, out); +} + +#define SALT_LEN_MAX 32 + +void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len, + const uint8_t *salt, int salt_len, + int iter, int key_len, uint8_t *out) +{ + uint8_t F[SHA256_DIGEST_LENGTH], U[SALT_LEN_MAX + 4]; + HMAC_SHA256_CTX ctx; + int it, U_len, j, l; + uint32_t i; + + assert(salt_len <= SALT_LEN_MAX); + i = 1; + while (key_len > 0) { + memset(F, 0, SHA256_DIGEST_LENGTH); + memcpy(U, salt, salt_len); + U[salt_len] = i >> 24; + U[salt_len + 1] = i >> 16; + U[salt_len + 2] = i >> 8; + U[salt_len + 3] = i; + U_len = salt_len + 4; + for(it = 0; it < iter; it++) { + hmac_sha256_init(&ctx, pwd, pwd_len); + hmac_sha256_update(&ctx, U, U_len); + hmac_sha256_final(&ctx, U); + for(j = 0; j < SHA256_DIGEST_LENGTH; j++) + F[j] ^= U[j]; + U_len = SHA256_DIGEST_LENGTH; + } + l = min_int(key_len, SHA256_DIGEST_LENGTH); + memcpy(out, F, l); + out += l; + key_len -= l; + i++; + } +} + +#else + +void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len, + const uint8_t *salt, int salt_len, + int iter, int key_len, uint8_t *out) +{ + PKCS5_PBKDF2_HMAC((const char *)pwd, pwd_len, salt, salt_len, + iter, EVP_sha256(), key_len, out); +} + +#endif /* !USE_BUILTIN_CRYPTO */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h new file mode 100644 index 0000000..35b6a4b --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/fs_wget.h @@ -0,0 +1,93 @@ +/* + * HTTP file download + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#if defined(EMSCRIPTEN) +#define USE_BUILTIN_CRYPTO +#endif + +#ifdef USE_BUILTIN_CRYPTO +#include "aes.h" +#include "sha256.h" +#else +#include <openssl/aes.h> +#include <openssl/sha.h> +#include <openssl/evp.h> +#endif +#ifdef _WIN32 +#include <winsock2.h> +#endif + +#define LOG() printf("%s:%d\n", __func__, __LINE__) + +/* XHR */ + +/* err < 0: error (no data provided) + err = 0: end of transfer (data can be provided too) + err = 1: data chunk +*/ +typedef void WGetWriteCallback(void *opaque, int err, void *data, size_t size); +typedef size_t WGetReadCallback(void *opaque, void *data, size_t size); +typedef struct XHRState XHRState; + +XHRState *fs_wget(const char *url, const char *user, const char *password, + void *opaque, WGetWriteCallback *cb, BOOL single_write); +void fs_wget_free(XHRState *s); + +void fs_wget_init(void); +void fs_wget_end(void); + +#ifndef EMSCRIPTEN +typedef BOOL FSNetEventLoopCompletionFunc(void *opaque); +void fs_net_set_fdset(int *pfd_max, fd_set *rfds, fd_set *wfds, fd_set *efds, + int *ptimeout); +void fs_net_event_loop(FSNetEventLoopCompletionFunc *cb, void *opaque); +#endif + +/* crypto */ + +extern const uint8_t encrypted_file_magic[4]; + +typedef int DecryptFileCB(void *opaque, const uint8_t *data, size_t len); +typedef struct DecryptFileState DecryptFileState; + +DecryptFileState *decrypt_file_init(AES_KEY *aes_state, + DecryptFileCB *write_cb, + void *opaque); +int decrypt_file(DecryptFileState *s, const uint8_t *data, + size_t size); +int decrypt_file_flush(DecryptFileState *s); +void decrypt_file_end(DecryptFileState *s); + +void pbkdf2_hmac_sha256(const uint8_t *pwd, int pwd_len, + const uint8_t *salt, int salt_len, + int iter, int key_len, uint8_t *out); + +/* XHR file */ + +typedef void FSWGetFileCB(FSDevice *fs, FSFile *f, int64_t size, void *opaque); + +void fs_wget_file2(FSDevice *fs, FSFile *f, const char *url, + const char *user, const char *password, + FSFile *posted_file, uint64_t post_data_len, + FSWGetFileCB *cb, void *opaque, + AES_KEY *aes_state); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ide.c b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.c new file mode 100644 index 0000000..4952965 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.c @@ -0,0 +1,835 @@ +/* + * IDE emulation + * + * Copyright (c) 2003-2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "ide.h" + +//#define DEBUG_IDE + +/* Bits of HD_STATUS */ +#define ERR_STAT 0x01 +#define INDEX_STAT 0x02 +#define ECC_STAT 0x04 /* Corrected error */ +#define DRQ_STAT 0x08 +#define SEEK_STAT 0x10 +#define SRV_STAT 0x10 +#define WRERR_STAT 0x20 +#define READY_STAT 0x40 +#define BUSY_STAT 0x80 + +/* Bits for HD_ERROR */ +#define MARK_ERR 0x01 /* Bad address mark */ +#define TRK0_ERR 0x02 /* couldn't find track 0 */ +#define ABRT_ERR 0x04 /* Command aborted */ +#define MCR_ERR 0x08 /* media change request */ +#define ID_ERR 0x10 /* ID field not found */ +#define MC_ERR 0x20 /* media changed */ +#define ECC_ERR 0x40 /* Uncorrectable ECC error */ +#define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */ +#define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */ + +/* Bits of HD_NSECTOR */ +#define CD 0x01 +#define IO 0x02 +#define REL 0x04 +#define TAG_MASK 0xf8 + +#define IDE_CMD_RESET 0x04 +#define IDE_CMD_DISABLE_IRQ 0x02 + +/* ATA/ATAPI Commands pre T13 Spec */ +#define WIN_NOP 0x00 +/* + * 0x01->0x02 Reserved + */ +#define CFA_REQ_EXT_ERROR_CODE 0x03 /* CFA Request Extended Error Code */ +/* + * 0x04->0x07 Reserved + */ +#define WIN_SRST 0x08 /* ATAPI soft reset command */ +#define WIN_DEVICE_RESET 0x08 +/* + * 0x09->0x0F Reserved + */ +#define WIN_RECAL 0x10 +#define WIN_RESTORE WIN_RECAL +/* + * 0x10->0x1F Reserved + */ +#define WIN_READ 0x20 /* 28-Bit */ +#define WIN_READ_ONCE 0x21 /* 28-Bit without retries */ +#define WIN_READ_LONG 0x22 /* 28-Bit */ +#define WIN_READ_LONG_ONCE 0x23 /* 28-Bit without retries */ +#define WIN_READ_EXT 0x24 /* 48-Bit */ +#define WIN_READDMA_EXT 0x25 /* 48-Bit */ +#define WIN_READDMA_QUEUED_EXT 0x26 /* 48-Bit */ +#define WIN_READ_NATIVE_MAX_EXT 0x27 /* 48-Bit */ +/* + * 0x28 + */ +#define WIN_MULTREAD_EXT 0x29 /* 48-Bit */ +/* + * 0x2A->0x2F Reserved + */ +#define WIN_WRITE 0x30 /* 28-Bit */ +#define WIN_WRITE_ONCE 0x31 /* 28-Bit without retries */ +#define WIN_WRITE_LONG 0x32 /* 28-Bit */ +#define WIN_WRITE_LONG_ONCE 0x33 /* 28-Bit without retries */ +#define WIN_WRITE_EXT 0x34 /* 48-Bit */ +#define WIN_WRITEDMA_EXT 0x35 /* 48-Bit */ +#define WIN_WRITEDMA_QUEUED_EXT 0x36 /* 48-Bit */ +#define WIN_SET_MAX_EXT 0x37 /* 48-Bit */ +#define CFA_WRITE_SECT_WO_ERASE 0x38 /* CFA Write Sectors without erase */ +#define WIN_MULTWRITE_EXT 0x39 /* 48-Bit */ +/* + * 0x3A->0x3B Reserved + */ +#define WIN_WRITE_VERIFY 0x3C /* 28-Bit */ +/* + * 0x3D->0x3F Reserved + */ +#define WIN_VERIFY 0x40 /* 28-Bit - Read Verify Sectors */ +#define WIN_VERIFY_ONCE 0x41 /* 28-Bit - without retries */ +#define WIN_VERIFY_EXT 0x42 /* 48-Bit */ +/* + * 0x43->0x4F Reserved + */ +#define WIN_FORMAT 0x50 +/* + * 0x51->0x5F Reserved + */ +#define WIN_INIT 0x60 +/* + * 0x61->0x5F Reserved + */ +#define WIN_SEEK 0x70 /* 0x70-0x7F Reserved */ +#define CFA_TRANSLATE_SECTOR 0x87 /* CFA Translate Sector */ +#define WIN_DIAGNOSE 0x90 +#define WIN_SPECIFY 0x91 /* set drive geometry translation */ +#define WIN_DOWNLOAD_MICROCODE 0x92 +#define WIN_STANDBYNOW2 0x94 +#define WIN_STANDBY2 0x96 +#define WIN_SETIDLE2 0x97 +#define WIN_CHECKPOWERMODE2 0x98 +#define WIN_SLEEPNOW2 0x99 +/* + * 0x9A VENDOR + */ +#define WIN_PACKETCMD 0xA0 /* Send a packet command. */ +#define WIN_PIDENTIFY 0xA1 /* identify ATAPI device */ +#define WIN_QUEUED_SERVICE 0xA2 +#define WIN_SMART 0xB0 /* self-monitoring and reporting */ +#define CFA_ERASE_SECTORS 0xC0 +#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/ +#define WIN_MULTWRITE 0xC5 /* write sectors using multiple mode */ +#define WIN_SETMULT 0xC6 /* enable/disable multiple mode */ +#define WIN_READDMA_QUEUED 0xC7 /* read sectors using Queued DMA transfers */ +#define WIN_READDMA 0xC8 /* read sectors using DMA transfers */ +#define WIN_READDMA_ONCE 0xC9 /* 28-Bit - without retries */ +#define WIN_WRITEDMA 0xCA /* write sectors using DMA transfers */ +#define WIN_WRITEDMA_ONCE 0xCB /* 28-Bit - without retries */ +#define WIN_WRITEDMA_QUEUED 0xCC /* write sectors using Queued DMA transfers */ +#define CFA_WRITE_MULTI_WO_ERASE 0xCD /* CFA Write multiple without erase */ +#define WIN_GETMEDIASTATUS 0xDA +#define WIN_ACKMEDIACHANGE 0xDB /* ATA-1, ATA-2 vendor */ +#define WIN_POSTBOOT 0xDC +#define WIN_PREBOOT 0xDD +#define WIN_DOORLOCK 0xDE /* lock door on removable drives */ +#define WIN_DOORUNLOCK 0xDF /* unlock door on removable drives */ +#define WIN_STANDBYNOW1 0xE0 +#define WIN_IDLEIMMEDIATE 0xE1 /* force drive to become "ready" */ +#define WIN_STANDBY 0xE2 /* Set device in Standby Mode */ +#define WIN_SETIDLE1 0xE3 +#define WIN_READ_BUFFER 0xE4 /* force read only 1 sector */ +#define WIN_CHECKPOWERMODE1 0xE5 +#define WIN_SLEEPNOW1 0xE6 +#define WIN_FLUSH_CACHE 0xE7 +#define WIN_WRITE_BUFFER 0xE8 /* force write only 1 sector */ +#define WIN_WRITE_SAME 0xE9 /* read ata-2 to use */ + /* SET_FEATURES 0x22 or 0xDD */ +#define WIN_FLUSH_CACHE_EXT 0xEA /* 48-Bit */ +#define WIN_IDENTIFY 0xEC /* ask drive to identify itself */ +#define WIN_MEDIAEJECT 0xED +#define WIN_IDENTIFY_DMA 0xEE /* same as WIN_IDENTIFY, but DMA */ +#define WIN_SETFEATURES 0xEF /* set special drive features */ +#define EXABYTE_ENABLE_NEST 0xF0 +#define WIN_SECURITY_SET_PASS 0xF1 +#define WIN_SECURITY_UNLOCK 0xF2 +#define WIN_SECURITY_ERASE_PREPARE 0xF3 +#define WIN_SECURITY_ERASE_UNIT 0xF4 +#define WIN_SECURITY_FREEZE_LOCK 0xF5 +#define WIN_SECURITY_DISABLE 0xF6 +#define WIN_READ_NATIVE_MAX 0xF8 /* return the native maximum address */ +#define WIN_SET_MAX 0xF9 +#define DISABLE_SEAGATE 0xFB + +#define MAX_MULT_SECTORS 128 + +typedef struct IDEState IDEState; + +typedef void EndTransferFunc(IDEState *); + +struct IDEState { + IDEIFState *ide_if; + BlockDevice *bs; + int cylinders, heads, sectors; + int mult_sectors; + int64_t nb_sectors; + + /* ide regs */ + uint8_t feature; + uint8_t error; + uint16_t nsector; /* 0 is 256 to ease computations */ + uint8_t sector; + uint8_t lcyl; + uint8_t hcyl; + uint8_t select; + uint8_t status; + + int io_nb_sectors; + int req_nb_sectors; + EndTransferFunc *end_transfer_func; + + int data_index; + int data_end; + uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4]; +}; + +struct IDEIFState { + IRQSignal *irq; + IDEState *cur_drive; + IDEState *drives[2]; + /* 0x3f6 command */ + uint8_t cmd; +}; + +static void ide_sector_read_cb(void *opaque, int ret); +static void ide_sector_read_cb_end(IDEState *s); +static void ide_sector_write_cb2(void *opaque, int ret); + +static void padstr(char *str, const char *src, int len) +{ + int i, v; + for(i = 0; i < len; i++) { + if (*src) + v = *src++; + else + v = ' '; + *(char *)((long)str ^ 1) = v; + str++; + } +} + +/* little endian assume */ +static void stw(uint16_t *buf, int v) +{ + *buf = v; +} + +static void ide_identify(IDEState *s) +{ + uint16_t *tab; + uint32_t oldsize; + + tab = (uint16_t *)s->io_buffer; + + memset(tab, 0, 512 * 2); + + stw(tab + 0, 0x0040); + stw(tab + 1, s->cylinders); + stw(tab + 3, s->heads); + stw(tab + 4, 512 * s->sectors); /* sectors */ + stw(tab + 5, 512); /* sector size */ + stw(tab + 6, s->sectors); + stw(tab + 20, 3); /* buffer type */ + stw(tab + 21, 512); /* cache size in sectors */ + stw(tab + 22, 4); /* ecc bytes */ + padstr((char *)(tab + 27), "RISCVEMU HARDDISK", 40); + stw(tab + 47, 0x8000 | MAX_MULT_SECTORS); + stw(tab + 48, 0); /* dword I/O */ + stw(tab + 49, 1 << 9); /* LBA supported, no DMA */ + stw(tab + 51, 0x200); /* PIO transfer cycle */ + stw(tab + 52, 0x200); /* DMA transfer cycle */ + stw(tab + 54, s->cylinders); + stw(tab + 55, s->heads); + stw(tab + 56, s->sectors); + oldsize = s->cylinders * s->heads * s->sectors; + stw(tab + 57, oldsize); + stw(tab + 58, oldsize >> 16); + if (s->mult_sectors) + stw(tab + 59, 0x100 | s->mult_sectors); + stw(tab + 60, s->nb_sectors); + stw(tab + 61, s->nb_sectors >> 16); + stw(tab + 80, (1 << 1) | (1 << 2)); + stw(tab + 82, (1 << 14)); + stw(tab + 83, (1 << 14)); + stw(tab + 84, (1 << 14)); + stw(tab + 85, (1 << 14)); + stw(tab + 86, 0); + stw(tab + 87, (1 << 14)); +} + +static void ide_set_signature(IDEState *s) +{ + s->select &= 0xf0; + s->nsector = 1; + s->sector = 1; + s->lcyl = 0; + s->hcyl = 0; +} + +static void ide_abort_command(IDEState *s) +{ + s->status = READY_STAT | ERR_STAT; + s->error = ABRT_ERR; +} + +static void ide_set_irq(IDEState *s) +{ + IDEIFState *ide_if = s->ide_if; + if (!(ide_if->cmd & IDE_CMD_DISABLE_IRQ)) { + set_irq(ide_if->irq, 1); + } +} + +/* prepare data transfer and tell what to do after */ +static void ide_transfer_start(IDEState *s, int size, + EndTransferFunc *end_transfer_func) +{ + s->end_transfer_func = end_transfer_func; + s->data_index = 0; + s->data_end = size; +} + +static void ide_transfer_stop(IDEState *s) +{ + s->end_transfer_func = ide_transfer_stop; + s->data_index = 0; + s->data_end = 0; +} + +static int64_t ide_get_sector(IDEState *s) +{ + int64_t sector_num; + if (s->select & 0x40) { + /* lba */ + sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) | + (s->lcyl << 8) | s->sector; + } else { + sector_num = ((s->hcyl << 8) | s->lcyl) * + s->heads * s->sectors + + (s->select & 0x0f) * s->sectors + (s->sector - 1); + } + return sector_num; +} + +static void ide_set_sector(IDEState *s, int64_t sector_num) +{ + unsigned int cyl, r; + if (s->select & 0x40) { + s->select = (s->select & 0xf0) | ((sector_num >> 24) & 0x0f); + s->hcyl = (sector_num >> 16) & 0xff; + s->lcyl = (sector_num >> 8) & 0xff; + s->sector = sector_num & 0xff; + } else { + cyl = sector_num / (s->heads * s->sectors); + r = sector_num % (s->heads * s->sectors); + s->hcyl = (cyl >> 8) & 0xff; + s->lcyl = cyl & 0xff; + s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f); + s->sector = (r % s->sectors) + 1; + } +} + +static void ide_sector_read(IDEState *s) +{ + int64_t sector_num; + int ret, n; + + sector_num = ide_get_sector(s); + n = s->nsector; + if (n == 0) + n = 256; + if (n > s->req_nb_sectors) + n = s->req_nb_sectors; +#if defined(DEBUG_IDE) + printf("read sector=%" PRId64 " count=%d\n", sector_num, n); +#endif + s->io_nb_sectors = n; + ret = s->bs->read_async(s->bs, sector_num, s->io_buffer, n, + ide_sector_read_cb, s); + if (ret < 0) { + /* error */ + ide_abort_command(s); + ide_set_irq(s); + } else if (ret == 0) { + /* synchronous case (needed for performance) */ + ide_sector_read_cb(s, 0); + } else { + /* async case */ + s->status = READY_STAT | SEEK_STAT | BUSY_STAT; + s->error = 0; /* not needed by IDE spec, but needed by Windows */ + } +} + +static void ide_sector_read_cb(void *opaque, int ret) +{ + IDEState *s = opaque; + int n; + EndTransferFunc *func; + + n = s->io_nb_sectors; + ide_set_sector(s, ide_get_sector(s) + n); + s->nsector = (s->nsector - n) & 0xff; + if (s->nsector == 0) + func = ide_sector_read_cb_end; + else + func = ide_sector_read; + ide_transfer_start(s, 512 * n, func); + ide_set_irq(s); + s->status = READY_STAT | SEEK_STAT | DRQ_STAT; + s->error = 0; /* not needed by IDE spec, but needed by Windows */ +} + +static void ide_sector_read_cb_end(IDEState *s) +{ + /* no more sector to read from disk */ + s->status = READY_STAT | SEEK_STAT; + s->error = 0; /* not needed by IDE spec, but needed by Windows */ + ide_transfer_stop(s); +} + +static void ide_sector_write_cb1(IDEState *s) +{ + int64_t sector_num; + int ret; + + ide_transfer_stop(s); + sector_num = ide_get_sector(s); +#if defined(DEBUG_IDE) + printf("write sector=%" PRId64 " count=%d\n", + sector_num, s->io_nb_sectors); +#endif + ret = s->bs->write_async(s->bs, sector_num, s->io_buffer, s->io_nb_sectors, + ide_sector_write_cb2, s); + if (ret < 0) { + /* error */ + ide_abort_command(s); + ide_set_irq(s); + } else if (ret == 0) { + /* synchronous case (needed for performance) */ + ide_sector_write_cb2(s, 0); + } else { + /* async case */ + s->status = READY_STAT | SEEK_STAT | BUSY_STAT; + } +} + +static void ide_sector_write_cb2(void *opaque, int ret) +{ + IDEState *s = opaque; + int n; + + n = s->io_nb_sectors; + ide_set_sector(s, ide_get_sector(s) + n); + s->nsector = (s->nsector - n) & 0xff; + if (s->nsector == 0) { + /* no more sectors to write */ + s->status = READY_STAT | SEEK_STAT; + } else { + n = s->nsector; + if (n > s->req_nb_sectors) + n = s->req_nb_sectors; + s->io_nb_sectors = n; + ide_transfer_start(s, 512 * n, ide_sector_write_cb1); + s->status = READY_STAT | SEEK_STAT | DRQ_STAT; + } + ide_set_irq(s); +} + +static void ide_sector_write(IDEState *s) +{ + int n; + n = s->nsector; + if (n == 0) + n = 256; + if (n > s->req_nb_sectors) + n = s->req_nb_sectors; + s->io_nb_sectors = n; + ide_transfer_start(s, 512 * n, ide_sector_write_cb1); + s->status = READY_STAT | SEEK_STAT | DRQ_STAT; +} + +static void ide_identify_cb(IDEState *s) +{ + ide_transfer_stop(s); + s->status = READY_STAT; +} + +static void ide_exec_cmd(IDEState *s, int val) +{ +#if defined(DEBUG_IDE) + printf("ide: exec_cmd=0x%02x\n", val); +#endif + switch(val) { + case WIN_IDENTIFY: + ide_identify(s); + s->status = READY_STAT | SEEK_STAT | DRQ_STAT; + ide_transfer_start(s, 512, ide_identify_cb); + ide_set_irq(s); + break; + case WIN_SPECIFY: + case WIN_RECAL: + s->error = 0; + s->status = READY_STAT | SEEK_STAT; + ide_set_irq(s); + break; + case WIN_SETMULT: + if (s->nsector > MAX_MULT_SECTORS || + (s->nsector & (s->nsector - 1)) != 0) { + ide_abort_command(s); + } else { + s->mult_sectors = s->nsector; +#if defined(DEBUG_IDE) + printf("ide: setmult=%d\n", s->mult_sectors); +#endif + s->status = READY_STAT; + } + ide_set_irq(s); + break; + case WIN_READ: + case WIN_READ_ONCE: + s->req_nb_sectors = 1; + ide_sector_read(s); + break; + case WIN_WRITE: + case WIN_WRITE_ONCE: + s->req_nb_sectors = 1; + ide_sector_write(s); + break; + case WIN_MULTREAD: + if (!s->mult_sectors) { + ide_abort_command(s); + ide_set_irq(s); + } else { + s->req_nb_sectors = s->mult_sectors; + ide_sector_read(s); + } + break; + case WIN_MULTWRITE: + if (!s->mult_sectors) { + ide_abort_command(s); + ide_set_irq(s); + } else { + s->req_nb_sectors = s->mult_sectors; + ide_sector_write(s); + } + break; + case WIN_READ_NATIVE_MAX: + ide_set_sector(s, s->nb_sectors - 1); + s->status = READY_STAT; + ide_set_irq(s); + break; + default: + ide_abort_command(s); + ide_set_irq(s); + break; + } +} + +static void ide_ioport_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + IDEIFState *s1 = opaque; + IDEState *s = s1->cur_drive; + int addr = offset + 1; + +#ifdef DEBUG_IDE + printf("ide: write addr=0x%02x val=0x%02x\n", addr, val); +#endif + switch(addr) { + case 0: + break; + case 1: + if (s) { + s->feature = val; + } + break; + case 2: + if (s) { + s->nsector = val; + } + break; + case 3: + if (s) { + s->sector = val; + } + break; + case 4: + if (s) { + s->lcyl = val; + } + break; + case 5: + if (s) { + s->hcyl = val; + } + break; + case 6: + /* select drive */ + s = s1->cur_drive = s1->drives[(val >> 4) & 1]; + if (s) { + s->select = val; + } + break; + default: + case 7: + /* command */ + if (s) { + ide_exec_cmd(s, val); + } + break; + } +} + +static uint32_t ide_ioport_read(void *opaque, uint32_t offset, int size_log2) +{ + IDEIFState *s1 = opaque; + IDEState *s = s1->cur_drive; + int ret, addr = offset + 1; + + if (!s) { + ret = 0x00; + } else { + switch(addr) { + case 0: + ret = 0xff; + break; + case 1: + ret = s->error; + break; + case 2: + ret = s->nsector; + break; + case 3: + ret = s->sector; + break; + case 4: + ret = s->lcyl; + break; + case 5: + ret = s->hcyl; + break; + case 6: + ret = s->select; + break; + default: + case 7: + ret = s->status; + set_irq(s1->irq, 0); + break; + } + } +#ifdef DEBUG_IDE + printf("ide: read addr=0x%02x val=0x%02x\n", addr, ret); +#endif + return ret; +} + +static uint32_t ide_status_read(void *opaque, uint32_t offset, int size_log2) +{ + IDEIFState *s1 = opaque; + IDEState *s = s1->cur_drive; + int ret; + + if (s) { + ret = s->status; + } else { + ret = 0; + } +#ifdef DEBUG_IDE + printf("ide: read status=0x%02x\n", ret); +#endif + return ret; +} + +static void ide_cmd_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + IDEIFState *s1 = opaque; + IDEState *s; + int i; + +#ifdef DEBUG_IDE + printf("ide: cmd write=0x%02x\n", val); +#endif + if (!(s1->cmd & IDE_CMD_RESET) && (val & IDE_CMD_RESET)) { + /* low to high */ + for(i = 0; i < 2; i++) { + s = s1->drives[i]; + if (s) { + s->status = BUSY_STAT | SEEK_STAT; + s->error = 0x01; + } + } + } else if ((s1->cmd & IDE_CMD_RESET) && !(val & IDE_CMD_RESET)) { + /* high to low */ + for(i = 0; i < 2; i++) { + s = s1->drives[i]; + if (s) { + s->status = READY_STAT | SEEK_STAT; + ide_set_signature(s); + } + } + } + s1->cmd = val; +} + +static void ide_data_writew(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + IDEIFState *s1 = opaque; + IDEState *s = s1->cur_drive; + int p; + uint8_t *tab; + + if (!s) + return; + p = s->data_index; + tab = s->io_buffer; + tab[p] = val & 0xff; + tab[p + 1] = (val >> 8) & 0xff; + p += 2; + s->data_index = p; + if (p >= s->data_end) + s->end_transfer_func(s); +} + +static uint32_t ide_data_readw(void *opaque, uint32_t offset, int size_log2) +{ + IDEIFState *s1 = opaque; + IDEState *s = s1->cur_drive; + int p, ret; + uint8_t *tab; + + if (!s) { + ret = 0; + } else { + p = s->data_index; + tab = s->io_buffer; + ret = tab[p] | (tab[p + 1] << 8); + p += 2; + s->data_index = p; + if (p >= s->data_end) + s->end_transfer_func(s); + } + return ret; +} + +static IDEState *ide_drive_init(IDEIFState *ide_if, BlockDevice *bs) +{ + IDEState *s; + uint32_t cylinders; + uint64_t nb_sectors; + + s = malloc(sizeof(*s)); + memset(s, 0, sizeof(*s)); + + s->ide_if = ide_if; + s->bs = bs; + + nb_sectors = s->bs->get_sector_count(s->bs); + cylinders = nb_sectors / (16 * 63); + if (cylinders > 16383) + cylinders = 16383; + else if (cylinders < 2) + cylinders = 2; + s->cylinders = cylinders; + s->heads = 16; + s->sectors = 63; + s->nb_sectors = nb_sectors; + + s->mult_sectors = MAX_MULT_SECTORS; + /* ide regs */ + s->feature = 0; + s->error = 0; + s->nsector = 0; + s->sector = 0; + s->lcyl = 0; + s->hcyl = 0; + s->select = 0xa0; + s->status = READY_STAT | SEEK_STAT; + + /* init I/O buffer */ + s->data_index = 0; + s->data_end = 0; + s->end_transfer_func = ide_transfer_stop; + + s->req_nb_sectors = 0; /* temp for read/write */ + s->io_nb_sectors = 0; /* temp for read/write */ + return s; +} + +IDEIFState *ide_init(PhysMemoryMap *port_map, uint32_t addr, uint32_t addr2, + IRQSignal *irq, BlockDevice **tab_bs) +{ + int i; + IDEIFState *s; + + s = malloc(sizeof(IDEIFState)); + memset(s, 0, sizeof(*s)); + + s->irq = irq; + s->cmd = 0; + + cpu_register_device(port_map, addr, 1, s, ide_data_readw, ide_data_writew, + DEVIO_SIZE16); + cpu_register_device(port_map, addr + 1, 7, s, ide_ioport_read, ide_ioport_write, + DEVIO_SIZE8); + if (addr2) { + cpu_register_device(port_map, addr2, 1, s, ide_status_read, ide_cmd_write, + DEVIO_SIZE8); + } + + for(i = 0; i < 2; i++) { + if (tab_bs[i]) + s->drives[i] = ide_drive_init(s, tab_bs[i]); + } + s->cur_drive = s->drives[0]; + return s; +} + +/* dummy PCI device for the IDE */ +PCIDevice *piix3_ide_init(PCIBus *pci_bus, int devfn) +{ + PCIDevice *d; + d = pci_register_device(pci_bus, "PIIX3 IDE", devfn, 0x8086, 0x7010, 0x00, 0x0101); + pci_device_set_config8(d, 0x09, 0x00); /* ISA IDE ports, no DMA */ + return d; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ide.h b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.h new file mode 100644 index 0000000..257a6a0 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ide.h @@ -0,0 +1,32 @@ +/* + * IDE emulation + * + * Copyright (c) 2003-2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "virtio.h" +#include "iomem.h" +#include "pci.h" + +typedef struct IDEIFState IDEIFState; + +IDEIFState *ide_init(PhysMemoryMap *port_map, uint32_t addr, uint32_t addr2, + IRQSignal *irq, BlockDevice **tab_bs); +PCIDevice *piix3_ide_init(PCIBus *pci_bus, int devfn); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c new file mode 100644 index 0000000..c63ada0 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.c @@ -0,0 +1,264 @@ +/* + * IO memory handling + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "iomem.h" + +static PhysMemoryRange *default_register_ram(PhysMemoryMap *s, uint64_t addr, + uint64_t size, int devram_flags); +static void default_free_ram(PhysMemoryMap *s, PhysMemoryRange *pr); +static const uint32_t *default_get_dirty_bits(PhysMemoryMap *map, PhysMemoryRange *pr); +static void default_set_addr(PhysMemoryMap *map, + PhysMemoryRange *pr, uint64_t addr, BOOL enabled); + +PhysMemoryMap *phys_mem_map_init(void) +{ + PhysMemoryMap *s; + s = mallocz(sizeof(*s)); + s->register_ram = default_register_ram; + s->free_ram = default_free_ram; + s->get_dirty_bits = default_get_dirty_bits; + s->set_ram_addr = default_set_addr; + return s; +} + +void phys_mem_map_end(PhysMemoryMap *s) +{ + int i; + PhysMemoryRange *pr; + + for(i = 0; i < s->n_phys_mem_range; i++) { + pr = &s->phys_mem_range[i]; + if (pr->is_ram) { + s->free_ram(s, pr); + } + } + free(s); +} + +/* return NULL if not found */ +/* XXX: optimize */ +PhysMemoryRange *get_phys_mem_range(PhysMemoryMap *s, uint64_t paddr) +{ + PhysMemoryRange *pr; + int i; + for(i = 0; i < s->n_phys_mem_range; i++) { + pr = &s->phys_mem_range[i]; + if (paddr >= pr->addr && paddr < pr->addr + pr->size) + return pr; + } + return NULL; +} + +PhysMemoryRange *register_ram_entry(PhysMemoryMap *s, uint64_t addr, + uint64_t size, int devram_flags) +{ + PhysMemoryRange *pr; + + assert(s->n_phys_mem_range < PHYS_MEM_RANGE_MAX); + assert((size & (DEVRAM_PAGE_SIZE - 1)) == 0 && size != 0); + pr = &s->phys_mem_range[s->n_phys_mem_range++]; + pr->map = s; + pr->is_ram = TRUE; + pr->devram_flags = devram_flags & ~DEVRAM_FLAG_DISABLED; + pr->addr = addr; + pr->org_size = size; + if (devram_flags & DEVRAM_FLAG_DISABLED) + pr->size = 0; + else + pr->size = pr->org_size; + pr->phys_mem = NULL; + pr->dirty_bits = NULL; + return pr; +} + +static PhysMemoryRange *default_register_ram(PhysMemoryMap *s, uint64_t addr, + uint64_t size, int devram_flags) +{ + PhysMemoryRange *pr; + + pr = register_ram_entry(s, addr, size, devram_flags); + + pr->phys_mem = mallocz(size); + if (!pr->phys_mem) { + fprintf(stderr, "Could not allocate VM memory\n"); + exit(1); + } + + if (devram_flags & DEVRAM_FLAG_DIRTY_BITS) { + size_t nb_pages; + int i; + nb_pages = size >> DEVRAM_PAGE_SIZE_LOG2; + pr->dirty_bits_size = ((nb_pages + 31) / 32) * sizeof(uint32_t); + pr->dirty_bits_index = 0; + for(i = 0; i < 2; i++) { + pr->dirty_bits_tab[i] = mallocz(pr->dirty_bits_size); + } + pr->dirty_bits = pr->dirty_bits_tab[pr->dirty_bits_index]; + } + return pr; +} + +/* return a pointer to the bitmap of dirty bits and reset them */ +static const uint32_t *default_get_dirty_bits(PhysMemoryMap *map, + PhysMemoryRange *pr) +{ + uint32_t *dirty_bits; + BOOL has_dirty_bits; + size_t n, i; + + dirty_bits = pr->dirty_bits; + + has_dirty_bits = FALSE; + n = pr->dirty_bits_size / sizeof(uint32_t); + for(i = 0; i < n; i++) { + if (dirty_bits[i] != 0) { + has_dirty_bits = TRUE; + break; + } + } + if (has_dirty_bits && pr->size != 0) { + /* invalidate the corresponding CPU write TLBs */ + map->flush_tlb_write_range(map->opaque, pr->phys_mem, pr->org_size); + } + + pr->dirty_bits_index ^= 1; + pr->dirty_bits = pr->dirty_bits_tab[pr->dirty_bits_index]; + memset(pr->dirty_bits, 0, pr->dirty_bits_size); + return dirty_bits; +} + +/* reset the dirty bit of one page at 'offset' inside 'pr' */ +void phys_mem_reset_dirty_bit(PhysMemoryRange *pr, size_t offset) +{ + size_t page_index; + uint32_t mask, *dirty_bits_ptr; + PhysMemoryMap *map; + if (pr->dirty_bits) { + page_index = offset >> DEVRAM_PAGE_SIZE_LOG2; + mask = 1 << (page_index & 0x1f); + dirty_bits_ptr = pr->dirty_bits + (page_index >> 5); + if (*dirty_bits_ptr & mask) { + *dirty_bits_ptr &= ~mask; + /* invalidate the corresponding CPU write TLBs */ + map = pr->map; + map->flush_tlb_write_range(map->opaque, + pr->phys_mem + (offset & ~(DEVRAM_PAGE_SIZE - 1)), + DEVRAM_PAGE_SIZE); + } + } +} + +static void default_free_ram(PhysMemoryMap *s, PhysMemoryRange *pr) +{ + free(pr->phys_mem); +} + +PhysMemoryRange *cpu_register_device(PhysMemoryMap *s, uint64_t addr, + uint64_t size, void *opaque, + DeviceReadFunc *read_func, DeviceWriteFunc *write_func, + int devio_flags) +{ + PhysMemoryRange *pr; + assert(s->n_phys_mem_range < PHYS_MEM_RANGE_MAX); + assert(size <= 0xffffffff); + pr = &s->phys_mem_range[s->n_phys_mem_range++]; + pr->map = s; + pr->addr = addr; + pr->org_size = size; + if (devio_flags & DEVIO_DISABLED) + pr->size = 0; + else + pr->size = pr->org_size; + pr->is_ram = FALSE; + pr->opaque = opaque; + pr->read_func = read_func; + pr->write_func = write_func; + pr->devio_flags = devio_flags; + return pr; +} + +static void default_set_addr(PhysMemoryMap *map, + PhysMemoryRange *pr, uint64_t addr, BOOL enabled) +{ + if (enabled) { + if (pr->size == 0 || pr->addr != addr) { + /* enable or move mapping */ + if (pr->is_ram) { + map->flush_tlb_write_range(map->opaque, + pr->phys_mem, pr->org_size); + } + pr->addr = addr; + pr->size = pr->org_size; + } + } else { + if (pr->size != 0) { + /* disable mapping */ + if (pr->is_ram) { + map->flush_tlb_write_range(map->opaque, + pr->phys_mem, pr->org_size); + } + pr->addr = 0; + pr->size = 0; + } + } +} + +void phys_mem_set_addr(PhysMemoryRange *pr, uint64_t addr, BOOL enabled) +{ + PhysMemoryMap *map = pr->map; + if (!pr->is_ram) { + default_set_addr(map, pr, addr, enabled); + } else { + return map->set_ram_addr(map, pr, addr, enabled); + } +} + +/* return NULL if no valid RAM page. The access can only be done in the page */ +uint8_t *phys_mem_get_ram_ptr(PhysMemoryMap *map, uint64_t paddr, BOOL is_rw) +{ + PhysMemoryRange *pr = get_phys_mem_range(map, paddr); + uintptr_t offset; + if (!pr || !pr->is_ram) + return NULL; + offset = paddr - pr->addr; + if (is_rw) + phys_mem_set_dirty_bit(pr, offset); + return pr->phys_mem + (uintptr_t)offset; +} + +/* IRQ support */ + +void irq_init(IRQSignal *irq, SetIRQFunc *set_irq, void *opaque, int irq_num) +{ + irq->set_irq = set_irq; + irq->opaque = opaque; + irq->irq_num = irq_num; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h new file mode 100644 index 0000000..cc561b4 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/iomem.h @@ -0,0 +1,148 @@ +/* + * IO memory handling + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef IOMEM_H +#define IOMEM_H + +typedef void DeviceWriteFunc(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +typedef uint32_t DeviceReadFunc(void *opaque, uint32_t offset, int size_log2); + +#define DEVIO_SIZE8 (1 << 0) +#define DEVIO_SIZE16 (1 << 1) +#define DEVIO_SIZE32 (1 << 2) +/* not supported, could add specific 64 bit callbacks when needed */ +//#define DEVIO_SIZE64 (1 << 3) +#define DEVIO_DISABLED (1 << 4) + +#define DEVRAM_FLAG_ROM (1 << 0) /* not writable */ +#define DEVRAM_FLAG_DIRTY_BITS (1 << 1) /* maintain dirty bits */ +#define DEVRAM_FLAG_DISABLED (1 << 2) /* allocated but not mapped */ +#define DEVRAM_PAGE_SIZE_LOG2 12 +#define DEVRAM_PAGE_SIZE (1 << DEVRAM_PAGE_SIZE_LOG2) + +typedef struct PhysMemoryMap PhysMemoryMap; + +typedef struct { + PhysMemoryMap *map; + uint64_t addr; + uint64_t org_size; /* original size */ + uint64_t size; /* =org_size or 0 if the mapping is disabled */ + BOOL is_ram; + /* the following is used for RAM access */ + int devram_flags; + uint8_t *phys_mem; + int dirty_bits_size; /* in bytes */ + uint32_t *dirty_bits; /* NULL if not used */ + uint32_t *dirty_bits_tab[2]; + int dirty_bits_index; /* 0-1 */ + /* the following is used for I/O access */ + void *opaque; + DeviceReadFunc *read_func; + DeviceWriteFunc *write_func; + int devio_flags; +} PhysMemoryRange; + +#define PHYS_MEM_RANGE_MAX 32 + +struct PhysMemoryMap { + int n_phys_mem_range; + PhysMemoryRange phys_mem_range[PHYS_MEM_RANGE_MAX]; + PhysMemoryRange *(*register_ram)(PhysMemoryMap *s, uint64_t addr, + uint64_t size, int devram_flags); + void (*free_ram)(PhysMemoryMap *s, PhysMemoryRange *pr); + const uint32_t *(*get_dirty_bits)(PhysMemoryMap *s, PhysMemoryRange *pr); + void (*set_ram_addr)(PhysMemoryMap *s, PhysMemoryRange *pr, uint64_t addr, + BOOL enabled); + void *opaque; + void (*flush_tlb_write_range)(void *opaque, uint8_t *ram_addr, + size_t ram_size); +}; + + +PhysMemoryMap *phys_mem_map_init(void); +void phys_mem_map_end(PhysMemoryMap *s); +PhysMemoryRange *register_ram_entry(PhysMemoryMap *s, uint64_t addr, + uint64_t size, int devram_flags); +static inline PhysMemoryRange *cpu_register_ram(PhysMemoryMap *s, uint64_t addr, + uint64_t size, int devram_flags) +{ + return s->register_ram(s, addr, size, devram_flags); +} +PhysMemoryRange *cpu_register_device(PhysMemoryMap *s, uint64_t addr, + uint64_t size, void *opaque, + DeviceReadFunc *read_func, DeviceWriteFunc *write_func, + int devio_flags); +PhysMemoryRange *get_phys_mem_range(PhysMemoryMap *s, uint64_t paddr); +void phys_mem_set_addr(PhysMemoryRange *pr, uint64_t addr, BOOL enabled); + +static inline const uint32_t *phys_mem_get_dirty_bits(PhysMemoryRange *pr) +{ + PhysMemoryMap *map = pr->map; + return map->get_dirty_bits(map, pr); +} + +static inline void phys_mem_set_dirty_bit(PhysMemoryRange *pr, size_t offset) +{ + size_t page_index; + uint32_t mask, *dirty_bits_ptr; + if (pr->dirty_bits) { + page_index = offset >> DEVRAM_PAGE_SIZE_LOG2; + mask = 1 << (page_index & 0x1f); + dirty_bits_ptr = pr->dirty_bits + (page_index >> 5); + *dirty_bits_ptr |= mask; + } +} + +static inline BOOL phys_mem_is_dirty_bit(PhysMemoryRange *pr, size_t offset) +{ + size_t page_index; + uint32_t *dirty_bits_ptr; + if (!pr->dirty_bits) + return TRUE; + page_index = offset >> DEVRAM_PAGE_SIZE_LOG2; + dirty_bits_ptr = pr->dirty_bits + (page_index >> 5); + return (*dirty_bits_ptr >> (page_index & 0x1f)) & 1; +} + +void phys_mem_reset_dirty_bit(PhysMemoryRange *pr, size_t offset); +uint8_t *phys_mem_get_ram_ptr(PhysMemoryMap *map, uint64_t paddr, BOOL is_rw); + +/* IRQ support */ + +typedef void SetIRQFunc(void *opaque, int irq_num, int level); + +typedef struct { + SetIRQFunc *set_irq; + void *opaque; + int irq_num; +} IRQSignal; + +void irq_init(IRQSignal *irq, SetIRQFunc *set_irq, void *opaque, int irq_num); + +static inline void set_irq(IRQSignal *irq, int level) +{ + irq->set_irq(irq->opaque, irq->irq_num, level); +} + +#endif /* IOMEM_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js b/jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js new file mode 100644 index 0000000..5dbf2b2 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/js/lib.js @@ -0,0 +1,280 @@ +/* + * JS emulator library + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +mergeInto(LibraryManager.library, { + console_write: function(opaque, buf, len) + { + var str; + /* Note: we really send byte values. It would be up to the + * terminal to support UTF-8 */ + str = String.fromCharCode.apply(String, HEAPU8.subarray(buf, buf + len)); + term.write(str); + }, + + console_get_size: function(pw, ph) + { + var w, h, r; + r = term.getSize(); + HEAPU32[pw >> 2] = r[0]; + HEAPU32[ph >> 2] = r[1]; + }, + + fs_export_file: function(filename, buf, buf_len) + { + var _filename = Pointer_stringify(filename); +// console.log("exporting " + _filename); + var data = HEAPU8.subarray(buf, buf + buf_len); + var file = new Blob([data], { type: "application/octet-stream" }); + var url = URL.createObjectURL(file); + var a = document.createElement("a"); + a.href = url; + a.setAttribute("download", _filename); + a.innerHTML = "downloading"; + document.body.appendChild(a); + /* click on the link and remove it */ + setTimeout(function() { + a.click(); + document.body.removeChild(a); + }, 50); + }, + + emscripten_async_wget3_data: function(url, request, user, password, post_data, post_data_len, arg, free, onload, onerror, onprogress) { + var _url = Pointer_stringify(url); + var _request = Pointer_stringify(request); + var _user; + var _password; + + var http = new XMLHttpRequest(); + + if (user) + _user = Pointer_stringify(user); + else + _user = null; + if (password) + _password = Pointer_stringify(password); + else + _password = null; + + http.open(_request, _url, true); + http.responseType = 'arraybuffer'; + if (_user) { + http.setRequestHeader("Authorization", "Basic " + btoa(_user + ':' + _password)); + } + + var handle = Browser.getNextWgetRequestHandle(); + + // LOAD + http.onload = function http_onload(e) { + if (http.status == 200 || _url.substr(0,4).toLowerCase() != "http") { + var byteArray = new Uint8Array(http.response); + var buffer = _malloc(byteArray.length); + HEAPU8.set(byteArray, buffer); + if (onload) Runtime.dynCall('viiii', onload, [handle, arg, buffer, byteArray.length]); + if (free) _free(buffer); + } else { + if (onerror) Runtime.dynCall('viiii', onerror, [handle, arg, http.status, http.statusText]); + } + delete Browser.wgetRequests[handle]; + }; + + // ERROR + http.onerror = function http_onerror(e) { + if (onerror) { + Runtime.dynCall('viiii', onerror, [handle, arg, http.status, http.statusText]); + } + delete Browser.wgetRequests[handle]; + }; + + // PROGRESS + http.onprogress = function http_onprogress(e) { + if (onprogress) Runtime.dynCall('viiii', onprogress, [handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0]); + }; + + // ABORT + http.onabort = function http_onabort(e) { + delete Browser.wgetRequests[handle]; + }; + + // Useful because the browser can limit the number of redirection + try { + if (http.channel instanceof Ci.nsIHttpChannel) + http.channel.redirectionLimit = 0; + } catch (ex) { /* whatever */ } + + if (_request == "POST") { + var _post_data = HEAPU8.subarray(post_data, post_data + post_data_len); + //Send the proper header information along with the request + http.setRequestHeader("Content-type", "application/octet-stream"); + http.setRequestHeader("Content-length", post_data_len); + http.setRequestHeader("Connection", "close"); + http.send(_post_data); + } else { + http.send(null); + } + + Browser.wgetRequests[handle] = http; + + return handle; + }, + + fs_wget_update_downloading: function (flag) + { + update_downloading(Boolean(flag)); + }, + + fb_refresh: function(opaque, data, x, y, w, h, stride) + { + var i, j, v, src, image_data, dst_pos, display, dst_pos1, image_stride; + + display = graphic_display; + /* current x = 0 and w = width for all refreshes */ +// console.log("fb_refresh: x=" + x + " y=" + y + " w=" + w + " h=" + h); + image_data = display.image.data; + image_stride = display.width * 4; + dst_pos1 = (y * display.width + x) * 4; + for(i = 0; i < h; i = (i + 1) | 0) { + src = data; + dst_pos = dst_pos1; + for(j = 0; j < w; j = (j + 1) | 0) { + v = HEAPU32[src >> 2]; + image_data[dst_pos] = (v >> 16) & 0xff; + image_data[dst_pos + 1] = (v >> 8) & 0xff; + image_data[dst_pos + 2] = v & 0xff; + image_data[dst_pos + 3] = 0xff; /* XXX: do it once */ + src = (src + 4) | 0; + dst_pos = (dst_pos + 4) | 0; + } + data = (data + stride) | 0; + dst_pos1 = (dst_pos1 + image_stride) | 0; + } + display.ctx.putImageData(display.image, 0, 0, x, y, w, h); + }, + + net_recv_packet: function(bs, buf, buf_len) + { + if (net_state) { + net_state.recv_packet(HEAPU8.subarray(buf, buf + buf_len)); + } + }, + + /* file buffer API */ + file_buffer_get_new_handle: function() + { + var h; + if (typeof Browser.fbuf_table == "undefined") { + Browser.fbuf_table = new Object(); + Browser.fbuf_next_handle = 1; + } + for(;;) { + h = Browser.fbuf_next_handle; + Browser.fbuf_next_handle++; + if (Browser.fbuf_next_handle == 0x80000000) + Browser.fbuf_next_handle = 1; + if (typeof Browser.fbuf_table[h] == "undefined") { +// console.log("new handle=" + h); + return h; + } + } + }, + + file_buffer_init: function(bs) + { + var h; + HEAPU32[bs >> 2] = 0; + HEAPU32[(bs + 4) >> 2] = 0; + }, + + file_buffer_resize__deps: ['file_buffer_get_new_handle'], + file_buffer_resize: function(bs, new_size) + { + var h, size, new_data, size1, i, data; + h = HEAPU32[bs >> 2]; + size = HEAPU32[(bs + 4) >> 2]; + if (new_size == 0) { + if (h != 0) { + delete Browser.fbuf_table[h]; + h = 0; + } + } else if (size == 0) { + h = _file_buffer_get_new_handle(); + new_data = new Uint8Array(new_size); + Browser.fbuf_table[h] = new_data; + } else if (size != new_size) { + data = Browser.fbuf_table[h]; + new_data = new Uint8Array(new_size); + if (new_size > size) { + new_data.set(data, 0); + } else { + for(i = 0; i < new_size; i = (i + 1) | 0) + new_data[i] = data[i]; + } + Browser.fbuf_table[h] = new_data; + } + HEAPU32[bs >> 2] = h; + HEAPU32[(bs + 4) >> 2] = new_size; + return 0; + }, + + file_buffer_reset: function(bs) + { + _file_buffer_resize(bs, 0); + _file_buffer_init(bs); + }, + + file_buffer_write: function(bs, offset, buf, size) + { + var h, data, i; + h = HEAPU32[bs >> 2]; + if (h) { + data = Browser.fbuf_table[h]; + for(i = 0; i < size; i = (i + 1) | 0) { + data[offset + i] = HEAPU8[buf + i]; + } + } + }, + + file_buffer_read: function(bs, offset, buf, size) + { + var h, data, i; + h = HEAPU32[bs >> 2]; + if (h) { + data = Browser.fbuf_table[h]; + for(i = 0; i < size; i = (i + 1) | 0) { + HEAPU8[buf + i] = data[offset + i]; + } + } + }, + + file_buffer_set: function(bs, offset, val, size) + { + var h, data, i; + h = HEAPU32[bs >> 2]; + if (h) { + data = Browser.fbuf_table[h]; + for(i = 0; i < size; i = (i + 1) | 0) { + data[offset + i] = val; + } + } + }, + +}); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c new file mode 100644 index 0000000..3641db4 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/jsemu.c @@ -0,0 +1,349 @@ +/* + * JS emulator main + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <emscripten.h> + +#include "cutils.h" +#include "iomem.h" +#include "virtio.h" +#include "machine.h" +#include "list.h" +#include "fbuf.h" + +void virt_machine_run(void *opaque); + +/* provided in lib.js */ +extern void console_write(void *opaque, const uint8_t *buf, int len); +extern void console_get_size(int *pw, int *ph); +extern void fb_refresh(void *opaque, void *data, + int x, int y, int w, int h, int stride); +extern void net_recv_packet(EthernetDevice *bs, + const uint8_t *buf, int len); + +static uint8_t console_fifo[1024]; +static int console_fifo_windex; +static int console_fifo_rindex; +static int console_fifo_count; +static BOOL console_resize_pending; + +static int global_width; +static int global_height; +static VirtMachine *global_vm; +static BOOL global_carrier_state; + +static int console_read(void *opaque, uint8_t *buf, int len) +{ + int out_len, l; + len = min_int(len, console_fifo_count); + console_fifo_count -= len; + out_len = 0; + while (len != 0) { + l = min_int(len, sizeof(console_fifo) - console_fifo_rindex); + memcpy(buf + out_len, console_fifo + console_fifo_rindex, l); + len -= l; + out_len += l; + console_fifo_rindex += l; + if (console_fifo_rindex == sizeof(console_fifo)) + console_fifo_rindex = 0; + } + return out_len; +} + +/* called from JS */ +void console_queue_char(int c) +{ + if (console_fifo_count < sizeof(console_fifo)) { + console_fifo[console_fifo_windex] = c; + if (++console_fifo_windex == sizeof(console_fifo)) + console_fifo_windex = 0; + console_fifo_count++; + } +} + +/* called from JS */ +void display_key_event(int is_down, int key_code) +{ + if (global_vm) { + vm_send_key_event(global_vm, is_down, key_code); + } +} + +/* called from JS */ +static int mouse_last_x, mouse_last_y, mouse_last_buttons; + +void display_mouse_event(int dx, int dy, int buttons) +{ + if (global_vm) { + if (vm_mouse_is_absolute(global_vm) || 1) { + dx = min_int(dx, global_width - 1); + dy = min_int(dy, global_height - 1); + dx = (dx * VIRTIO_INPUT_ABS_SCALE) / global_width; + dy = (dy * VIRTIO_INPUT_ABS_SCALE) / global_height; + } else { + /* relative mouse is not supported */ + dx = 0; + dy = 0; + } + mouse_last_x = dx; + mouse_last_y = dy; + mouse_last_buttons = buttons; + vm_send_mouse_event(global_vm, dx, dy, 0, buttons); + } +} + +/* called from JS */ +void display_wheel_event(int dz) +{ + if (global_vm) { + vm_send_mouse_event(global_vm, mouse_last_x, mouse_last_y, dz, + mouse_last_buttons); + } +} + +/* called from JS */ +void net_write_packet(const uint8_t *buf, int buf_len) +{ + EthernetDevice *net = global_vm->net; + if (net) { + net->device_write_packet(net, buf, buf_len); + } +} + +/* called from JS */ +void net_set_carrier(BOOL carrier_state) +{ + EthernetDevice *net; + global_carrier_state = carrier_state; + if (global_vm && global_vm->net) { + net = global_vm->net; + net->device_set_carrier(net, carrier_state); + } +} + +static void fb_refresh1(FBDevice *fb_dev, void *opaque, + int x, int y, int w, int h) +{ + int stride = fb_dev->stride; + fb_refresh(opaque, fb_dev->fb_data + y * stride + x * 4, x, y, w, h, + stride); +} + +static CharacterDevice *console_init(void) +{ + CharacterDevice *dev; + console_resize_pending = TRUE; + dev = mallocz(sizeof(*dev)); + dev->write_data = console_write; + dev->read_data = console_read; + return dev; +} + +typedef struct { + VirtMachineParams *p; + int ram_size; + char *cmdline; + BOOL has_network; + char *pwd; +} VMStartState; + +static void init_vm(void *arg); +static void init_vm_fs(void *arg); +static void init_vm_drive(void *arg); + +void vm_start(const char *url, int ram_size, const char *cmdline, + const char *pwd, int width, int height, BOOL has_network) +{ + VMStartState *s; + + s = mallocz(sizeof(*s)); + s->ram_size = ram_size; + s->cmdline = strdup(cmdline); + if (pwd) + s->pwd = strdup(pwd); + global_width = width; + global_height = height; + s->has_network = has_network; + s->p = mallocz(sizeof(VirtMachineParams)); + virt_machine_set_defaults(s->p); + virt_machine_load_config_file(s->p, url, init_vm_fs, s); +} + +static void init_vm_fs(void *arg) +{ + VMStartState *s = arg; + VirtMachineParams *p = s->p; + + if (p->fs_count > 0) { + assert(p->fs_count == 1); + p->tab_fs[0].fs_dev = fs_net_init(p->tab_fs[0].filename, + init_vm_drive, s); + if (s->pwd) { + fs_net_set_pwd(p->tab_fs[0].fs_dev, s->pwd); + } + } else { + init_vm_drive(s); + } +} + +static void init_vm_drive(void *arg) +{ + VMStartState *s = arg; + VirtMachineParams *p = s->p; + + if (p->drive_count > 0) { + assert(p->drive_count == 1); + p->tab_drive[0].block_dev = + block_device_init_http(p->tab_drive[0].filename, + 131072, + init_vm, s); + } else { + init_vm(s); + } +} + +static void init_vm(void *arg) +{ + VMStartState *s = arg; + VirtMachine *m; + VirtMachineParams *p = s->p; + int i; + + p->rtc_real_time = TRUE; + p->ram_size = s->ram_size << 20; + if (s->cmdline && s->cmdline[0] != '\0') { + vm_add_cmdline(s->p, s->cmdline); + } + + if (global_width > 0 && global_height > 0) { + /* enable graphic output if needed */ + if (!p->display_device) + p->display_device = strdup("simplefb"); + p->width = global_width; + p->height = global_height; + } else { + p->console = console_init(); + } + + if (p->eth_count > 0 && !s->has_network) { + /* remove the interfaces */ + for(i = 0; i < p->eth_count; i++) { + free(p->tab_eth[i].ifname); + free(p->tab_eth[i].driver); + } + p->eth_count = 0; + } + + if (p->eth_count > 0) { + EthernetDevice *net; + int i; + assert(p->eth_count == 1); + net = mallocz(sizeof(EthernetDevice)); + net->mac_addr[0] = 0x02; + for(i = 1; i < 6; i++) + net->mac_addr[i] = (int)(emscripten_random() * 256); + net->write_packet = net_recv_packet; + net->opaque = NULL; + p->tab_eth[0].net = net; + } + + m = virt_machine_init(p); + global_vm = m; + + virt_machine_free_config(s->p); + + if (m->net) { + m->net->device_set_carrier(m->net, global_carrier_state); + } + + free(s->p); + free(s->cmdline); + if (s->pwd) { + memset(s->pwd, 0, strlen(s->pwd)); + free(s->pwd); + } + free(s); + + emscripten_async_call(virt_machine_run, m, 0); +} + +/* need to be long enough to hide the non zero delay of setTimeout(_, 0) */ +#define MAX_EXEC_TOTAL_CYCLE 3000000 +#define MAX_EXEC_CYCLE 200000 + +#define MAX_SLEEP_TIME 10 /* in ms */ + +void virt_machine_run(void *opaque) +{ + VirtMachine *m = opaque; + int delay, i; + FBDevice *fb_dev; + + if (m->console_dev && virtio_console_can_write_data(m->console_dev)) { + uint8_t buf[128]; + int ret, len; + len = virtio_console_get_write_len(m->console_dev); + len = min_int(len, sizeof(buf)); + ret = m->console->read_data(m->console->opaque, buf, len); + if (ret > 0) + virtio_console_write_data(m->console_dev, buf, ret); + if (console_resize_pending) { + int w, h; + console_get_size(&w, &h); + virtio_console_resize_event(m->console_dev, w, h); + console_resize_pending = FALSE; + } + } + + fb_dev = m->fb_dev; + if (fb_dev) { + /* refresh the display */ + fb_dev->refresh(fb_dev, fb_refresh1, NULL); + } + + i = 0; + for(;;) { + /* wait for an event: the only asynchronous event is the RTC timer */ + delay = virt_machine_get_sleep_duration(m, MAX_SLEEP_TIME); + if (delay != 0 || i >= MAX_EXEC_TOTAL_CYCLE / MAX_EXEC_CYCLE) + break; + virt_machine_interp(m, MAX_EXEC_CYCLE); + i++; + } + + if (delay == 0) { + emscripten_async_call(virt_machine_run, m, 0); + } else { + emscripten_async_call(virt_machine_run, m, MAX_SLEEP_TIME); + } +} + diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/json.c b/jslinux-2019-12-21/tinyemu-2019-12-21/json.c new file mode 100644 index 0000000..d1ebe82 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/json.c @@ -0,0 +1,464 @@ +/* + * Pseudo JSON parser + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <ctype.h> + +#include "cutils.h" +#include "json.h" +#include "fs_utils.h" + +static JSONValue parse_string(const char **pp) +{ + char buf[4096], *q; + const char *p; + int c, h; + + q = buf; + p = *pp; + p++; + for(;;) { + c = *p++; + if (c == '\0' || c == '\n') { + return json_error_new("unterminated string"); + } else if (c == '\"') { + break; + } else if (c == '\\') { + c = *p++; + switch(c) { + case '\'': + case '\"': + case '\\': + goto add_char; + case 'n': + c = '\n'; + goto add_char; + case 'r': + c = '\r'; + goto add_char; + case 't': + c = '\t'; + goto add_char; + case 'x': + h = from_hex(*p++); + if (h < 0) + return json_error_new("invalig hex digit"); + c = h << 4; + h = from_hex(*p++); + if (h < 0) + return json_error_new("invalig hex digit"); + c |= h; + goto add_char; + default: + return json_error_new("unknown escape code"); + } + } else { + add_char: + if (q >= buf + sizeof(buf) - 1) + return json_error_new("string too long"); + *q++ = c; + } + } + *q = '\0'; + *pp = p; + return json_string_new(buf); +} + +static JSONProperty *json_object_get2(JSONObject *obj, const char *name) +{ + JSONProperty *f; + int i; + for(i = 0; i < obj->len; i++) { + f = &obj->props[i]; + if (!strcmp(f->name.u.str->data, name)) + return f; + } + return NULL; +} + +JSONValue json_object_get(JSONValue val, const char *name) +{ + JSONProperty *f; + JSONObject *obj; + + if (val.type != JSON_OBJ) + return json_undefined_new(); + obj = val.u.obj; + f = json_object_get2(obj, name); + if (!f) + return json_undefined_new(); + return f->value; +} + +int json_object_set(JSONValue val, const char *name, JSONValue prop_val) +{ + JSONObject *obj; + JSONProperty *f; + int new_size; + + if (val.type != JSON_OBJ) + return -1; + obj = val.u.obj; + f = json_object_get2(obj, name); + if (f) { + json_free(f->value); + f->value = prop_val; + } else { + if (obj->len >= obj->size) { + new_size = max_int(obj->len + 1, obj->size * 3 / 2); + obj->props = realloc(obj->props, new_size * sizeof(JSONProperty)); + obj->size = new_size; + } + f = &obj->props[obj->len++]; + f->name = json_string_new(name); + f->value = prop_val; + } + return 0; +} + +JSONValue json_array_get(JSONValue val, unsigned int idx) +{ + JSONArray *array; + + if (val.type != JSON_ARRAY) + return json_undefined_new(); + array = val.u.array; + if (idx < array->len) { + return array->tab[idx]; + } else { + return json_undefined_new(); + } +} + +int json_array_set(JSONValue val, unsigned int idx, JSONValue prop_val) +{ + JSONArray *array; + int new_size; + + if (val.type != JSON_ARRAY) + return -1; + array = val.u.array; + if (idx < array->len) { + json_free(array->tab[idx]); + array->tab[idx] = prop_val; + } else if (idx == array->len) { + if (array->len >= array->size) { + new_size = max_int(array->len + 1, array->size * 3 / 2); + array->tab = realloc(array->tab, new_size * sizeof(JSONValue)); + array->size = new_size; + } + array->tab[array->len++] = prop_val; + } else { + return -1; + } + return 0; +} + +const char *json_get_str(JSONValue val) +{ + if (val.type != JSON_STR) + return NULL; + return val.u.str->data; +} + +const char *json_get_error(JSONValue val) +{ + if (val.type != JSON_EXCEPTION) + return NULL; + return val.u.str->data; +} + +JSONValue json_string_new2(const char *str, int len) +{ + JSONValue val; + JSONString *str1; + + str1 = malloc(sizeof(JSONString) + len + 1); + str1->len = len; + memcpy(str1->data, str, len + 1); + val.type = JSON_STR; + val.u.str = str1; + return val; +} + +JSONValue json_string_new(const char *str) +{ + return json_string_new2(str, strlen(str)); +} + +JSONValue __attribute__((format(printf, 1, 2))) json_error_new(const char *fmt, ...) +{ + JSONValue val; + va_list ap; + char buf[256]; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + val = json_string_new(buf); + val.type = JSON_EXCEPTION; + return val; +} + +JSONValue json_object_new(void) +{ + JSONValue val; + JSONObject *obj; + obj = mallocz(sizeof(JSONObject)); + val.type = JSON_OBJ; + val.u.obj = obj; + return val; +} + +JSONValue json_array_new(void) +{ + JSONValue val; + JSONArray *array; + array = mallocz(sizeof(JSONArray)); + val.type = JSON_ARRAY; + val.u.array = array; + return val; +} + +void json_free(JSONValue val) +{ + switch(val.type) { + case JSON_STR: + case JSON_EXCEPTION: + free(val.u.str); + break; + case JSON_INT: + case JSON_BOOL: + case JSON_NULL: + case JSON_UNDEFINED: + break; + case JSON_ARRAY: + { + JSONArray *array = val.u.array; + int i; + + for(i = 0; i < array->len; i++) { + json_free(array->tab[i]); + } + free(array); + } + break; + case JSON_OBJ: + { + JSONObject *obj = val.u.obj; + JSONProperty *f; + int i; + + for(i = 0; i < obj->len; i++) { + f = &obj->props[i]; + json_free(f->name); + json_free(f->value); + } + free(obj); + } + break; + default: + abort(); + } +} + +static void skip_spaces(const char **pp) +{ + const char *p; + p = *pp; + for(;;) { + if (isspace(*p)) { + p++; + } else if (p[0] == '/' && p[1] == '/') { + p += 2; + while (*p != '\0' && *p != '\n') + p++; + } else if (p[0] == '/' && p[1] == '*') { + p += 2; + while (*p != '\0' && (p[0] != '*' || p[1] != '/')) + p++; + if (*p != '\0') + p += 2; + } else { + break; + } + } + *pp = p; +} + +static inline BOOL is_ident_first(int c) +{ + return (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + c == '_' || c == '$'; +} + +static int parse_ident(char *buf, int buf_size, const char **pp) +{ + char *q; + const char *p; + p = *pp; + q = buf; + *q++ = *p++; /* first char is already tested */ + while (is_ident_first(*p) || isdigit(*p)) { + if ((q - buf) >= buf_size - 1) + return -1; + *q++ = *p++; + } + *pp = p; + *q = '\0'; + return 0; +} + +JSONValue json_parse_value2(const char **pp) +{ + char buf[128]; + const char *p; + JSONValue val, val1, tag; + + p = *pp; + skip_spaces(&p); + if (*p == '\0') { + return json_error_new("unexpected end of file"); + } + if (isdigit(*p)) { + val = json_int32_new(strtol(p, (char **)&p, 0)); + } else if (*p == '"') { + val = parse_string(&p); + } else if (*p == '{') { + p++; + val = json_object_new(); + for(;;) { + skip_spaces(&p); + if (*p == '}') { + p++; + break; + } + if (*p == '"') { + tag = parse_string(&p); + if (json_is_error(tag)) + return tag; + } else if (is_ident_first(*p)) { + if (parse_ident(buf, sizeof(buf), &p) < 0) + goto invalid_prop; + tag = json_string_new(buf); + } else { + goto invalid_prop; + } + // printf("property: %s\n", json_get_str(tag)); + if (tag.u.str->len == 0) { + invalid_prop: + return json_error_new("Invalid property name"); + } + skip_spaces(&p); + if (*p != ':') { + return json_error_new("':' expected"); + } + p++; + + val1 = json_parse_value2(&p); + json_object_set(val, tag.u.str->data, val1); + + skip_spaces(&p); + if (*p == ',') { + p++; + } else if (*p != '}') { + return json_error_new("expecting ',' or '}'"); + } + } + } else if (*p == '[') { + int idx; + + p++; + val = json_array_new(); + idx = 0; + for(;;) { + skip_spaces(&p); + if (*p == ']') { + p++; + break; + } + val1 = json_parse_value2(&p); + json_array_set(val, idx++, val1); + + skip_spaces(&p); + if (*p == ',') { + p++; + } else if (*p != ']') { + return json_error_new("expecting ',' or ']'"); + } + } + } else if (is_ident_first(*p)) { + if (parse_ident(buf, sizeof(buf), &p) < 0) + goto unknown_id; + if (!strcmp(buf, "null")) { + val = json_null_new(); + } else if (!strcmp(buf, "true")) { + val = json_bool_new(TRUE); + } else if (!strcmp(buf, "false")) { + val = json_bool_new(FALSE); + } else { + unknown_id: + return json_error_new("unknown identifier: '%s'", buf); + } + } else { + return json_error_new("unexpected character"); + } + *pp = p; + return val; +} + +JSONValue json_parse_value(const char *p) +{ + JSONValue val; + val = json_parse_value2(&p); + if (json_is_error(val)) + return val; + skip_spaces(&p); + if (*p != '\0') { + json_free(val); + return json_error_new("unexpected characters at the end"); + } + return val; +} + +JSONValue json_parse_value_len(const char *p, int len) +{ + char *str; + JSONValue val; + str = malloc(len + 1); + memcpy(str, p, len); + str[len] = '\0'; + val = json_parse_value(str); + free(str); + return val; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/json.h b/jslinux-2019-12-21/tinyemu-2019-12-21/json.h new file mode 100644 index 0000000..148d050 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/json.h @@ -0,0 +1,132 @@ +/* + * Pseudo JSON parser + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef JSON_H +#define JSON_H + +typedef enum { + JSON_STR, + JSON_INT, + JSON_OBJ, + JSON_ARRAY, + JSON_BOOL, + JSON_NULL, + JSON_UNDEFINED, + JSON_EXCEPTION, +} JSONTypeEnum; + +typedef struct { + int len; + char data[0]; +} JSONString; + +typedef struct JSONValue { + JSONTypeEnum type; + union { + JSONString *str; + int int32; + BOOL b; + struct JSONObject *obj; + struct JSONArray *array; + } u; +} JSONValue; + +typedef struct JSONProperty { + JSONValue name; + JSONValue value; +} JSONProperty; + +typedef struct JSONObject { + int len; + int size; + JSONProperty *props; +} JSONObject; + +typedef struct JSONArray { + int len; + int size; + JSONValue *tab; +} JSONArray; + +JSONValue json_string_new2(const char *str, int len); +JSONValue json_string_new(const char *str); +JSONValue __attribute__((format(printf, 1, 2))) json_error_new(const char *fmt, ...); +void json_free(JSONValue val); + +JSONValue json_object_new(void); +JSONValue json_object_get(JSONValue val, const char *name); +int json_object_set(JSONValue val, const char *name, JSONValue prop_val); + +JSONValue json_array_new(void); +JSONValue json_array_get(JSONValue val, unsigned int idx); +int json_array_set(JSONValue val, unsigned int idx, JSONValue prop_val); + +static inline BOOL json_is_error(JSONValue val) +{ + return val.type == JSON_EXCEPTION; +} + +static inline BOOL json_is_undefined(JSONValue val) +{ + return val.type == JSON_UNDEFINED; +} + +static inline JSONValue json_undefined_new(void) +{ + JSONValue val; + val.type = JSON_UNDEFINED; + val.u.int32 = 0; + return val; +} + +static inline JSONValue json_null_new(void) +{ + JSONValue val; + val.type = JSON_NULL; + val.u.int32 = 0; + return val; +} + +static inline JSONValue json_int32_new(int v) +{ + JSONValue val; + val.type = JSON_INT; + val.u.int32 = v; + return val; +} + +static inline JSONValue json_bool_new(BOOL v) +{ + JSONValue val; + val.type = JSON_BOOL; + val.u.b = v; + return val; +} + +const char *json_get_str(JSONValue val); +const char *json_get_error(JSONValue val); + +JSONValue json_parse_value(const char *p); +JSONValue json_parse_value_len(const char *p, int len); + +#endif /* JSON_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/list.h b/jslinux-2019-12-21/tinyemu-2019-12-21/list.h new file mode 100644 index 0000000..3fbea04 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/list.h @@ -0,0 +1,94 @@ +/* + * Linux klist like system + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef LIST_H +#define LIST_H + +struct list_head { + struct list_head *prev; + struct list_head *next; +}; + +/* return the pointer of type 'type *' containing 'el' as field 'member' */ +#define list_entry(el, type, member) \ + ((type *)((uint8_t *)(el) - offsetof(type, member))) + +static inline void init_list_head(struct list_head *head) +{ + head->prev = head; + head->next = head; +} + +/* insert 'el' between 'prev' and 'next' */ +static inline void __list_add(struct list_head *el, + struct list_head *prev, struct list_head *next) +{ + prev->next = el; + el->prev = prev; + el->next = next; + next->prev = el; +} + +/* add 'el' at the head of the list 'head' (= after element head) */ +static inline void list_add(struct list_head *el, struct list_head *head) +{ + __list_add(el, head, head->next); +} + +/* add 'el' at the end of the list 'head' (= before element head) */ +static inline void list_add_tail(struct list_head *el, struct list_head *head) +{ + __list_add(el, head->prev, head); +} + +static inline void list_del(struct list_head *el) +{ + struct list_head *prev, *next; + prev = el->prev; + next = el->next; + prev->next = next; + next->prev = prev; + el->prev = NULL; /* fail safe */ + el->next = NULL; /* fail safe */ +} + +static inline int list_empty(struct list_head *el) +{ + return el->next == el; +} + +#define list_for_each(el, head) \ + for(el = (head)->next; el != (head); el = el->next) + +#define list_for_each_safe(el, el1, head) \ + for(el = (head)->next, el1 = el->next; el != (head); \ + el = el1, el1 = el->next) + +#define list_for_each_prev(el, head) \ + for(el = (head)->prev; el != (head); el = el->prev) + +#define list_for_each_prev_safe(el, el1, head) \ + for(el = (head)->prev, el1 = el->prev; el != (head); \ + el = el1, el1 = el->prev) + +#endif /* LIST_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/machine.c b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.c new file mode 100644 index 0000000..09c7940 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.c @@ -0,0 +1,640 @@ +/* + * VM utilities + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> + +#include "cutils.h" +#include "iomem.h" +#include "virtio.h" +#include "machine.h" +#include "fs_utils.h" +#ifdef CONFIG_FS_NET +#include "fs_wget.h" +#endif + +void __attribute__((format(printf, 1, 2))) vm_error(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); +#ifdef EMSCRIPTEN + vprintf(fmt, ap); +#else + vfprintf(stderr, fmt, ap); +#endif + va_end(ap); +} + +int vm_get_int(JSONValue obj, const char *name, int *pval) +{ + JSONValue val; + val = json_object_get(obj, name); + if (json_is_undefined(val)) { + vm_error("expecting '%s' property\n", name); + return -1; + } + if (val.type != JSON_INT) { + vm_error("%s: integer expected\n", name); + return -1; + } + *pval = val.u.int32; + return 0; +} + +int vm_get_int_opt(JSONValue obj, const char *name, int *pval, int def_val) +{ + JSONValue val; + val = json_object_get(obj, name); + if (json_is_undefined(val)) { + *pval = def_val; + return 0; + } + if (val.type != JSON_INT) { + vm_error("%s: integer expected\n", name); + return -1; + } + *pval = val.u.int32; + return 0; +} + +static int vm_get_str2(JSONValue obj, const char *name, const char **pstr, + BOOL is_opt) +{ + JSONValue val; + val = json_object_get(obj, name); + if (json_is_undefined(val)) { + if (is_opt) { + *pstr = NULL; + return 0; + } else { + vm_error("expecting '%s' property\n", name); + return -1; + } + } + if (val.type != JSON_STR) { + vm_error("%s: string expected\n", name); + return -1; + } + *pstr = val.u.str->data; + return 0; +} + +static int vm_get_str(JSONValue obj, const char *name, const char **pstr) +{ + return vm_get_str2(obj, name, pstr, FALSE); +} + +static int vm_get_str_opt(JSONValue obj, const char *name, const char **pstr) +{ + return vm_get_str2(obj, name, pstr, TRUE); +} + +static char *strdup_null(const char *str) +{ + if (!str) + return NULL; + else + return strdup(str); +} + +/* currently only for "TZ" */ +static char *cmdline_subst(const char *cmdline) +{ + DynBuf dbuf; + const char *p; + char var_name[32], *q, buf[32]; + + dbuf_init(&dbuf); + p = cmdline; + while (*p != '\0') { + if (p[0] == '$' && p[1] == '{') { + p += 2; + q = var_name; + while (*p != '\0' && *p != '}') { + if ((q - var_name) < sizeof(var_name) - 1) + *q++ = *p; + p++; + } + *q = '\0'; + if (*p == '}') + p++; + if (!strcmp(var_name, "TZ")) { + time_t ti; + struct tm tm; + int n, sg; + /* get the offset to UTC */ + time(&ti); + localtime_r(&ti, &tm); + n = tm.tm_gmtoff / 60; + sg = '-'; + if (n < 0) { + sg = '+'; + n = -n; + } + snprintf(buf, sizeof(buf), "UTC%c%02d:%02d", + sg, n / 60, n % 60); + dbuf_putstr(&dbuf, buf); + } + } else { + dbuf_putc(&dbuf, *p++); + } + } + dbuf_putc(&dbuf, 0); + return (char *)dbuf.buf; +} + +static BOOL find_name(const char *name, const char *name_list) +{ + size_t len; + const char *p, *r; + + p = name_list; + for(;;) { + r = strchr(p, ','); + if (!r) { + if (!strcmp(name, p)) + return TRUE; + break; + } else { + len = r - p; + if (len == strlen(name) && !memcmp(name, p, len)) + return TRUE; + p = r + 1; + } + } + return FALSE; +} + +static const VirtMachineClass *virt_machine_list[] = { +#if defined(EMSCRIPTEN) + /* only a single machine in the EMSCRIPTEN target */ +#ifndef CONFIG_X86EMU + &riscv_machine_class, +#endif +#else + &riscv_machine_class, +#endif /* !EMSCRIPTEN */ +#ifdef CONFIG_X86EMU + &pc_machine_class, +#endif + NULL, +}; + +static const VirtMachineClass *virt_machine_find_class(const char *machine_name) +{ + const VirtMachineClass *vmc, **pvmc; + + for(pvmc = virt_machine_list; *pvmc != NULL; pvmc++) { + vmc = *pvmc; + if (find_name(machine_name, vmc->machine_names)) + return vmc; + } + return NULL; +} + +static int virt_machine_parse_config(VirtMachineParams *p, + char *config_file_str, int len) +{ + int version, val; + const char *tag_name, *str; + char buf1[256]; + JSONValue cfg, obj, el; + + cfg = json_parse_value_len(config_file_str, len); + if (json_is_error(cfg)) { + vm_error("error: %s\n", json_get_error(cfg)); + json_free(cfg); + return -1; + } + + if (vm_get_int(cfg, "version", &version) < 0) + goto tag_fail; + if (version != VM_CONFIG_VERSION) { + if (version > VM_CONFIG_VERSION) { + vm_error("The emulator is too old to run this VM: please upgrade\n"); + return -1; + } else { + vm_error("The VM configuration file is too old for this emulator version: please upgrade the VM configuration file\n"); + return -1; + } + } + + if (vm_get_str(cfg, "machine", &str) < 0) + goto tag_fail; + p->machine_name = strdup(str); + p->vmc = virt_machine_find_class(p->machine_name); + if (!p->vmc) { + vm_error("Unknown machine name: %s\n", p->machine_name); + goto tag_fail; + } + p->vmc->virt_machine_set_defaults(p); + + tag_name = "memory_size"; + if (vm_get_int(cfg, tag_name, &val) < 0) + goto tag_fail; + p->ram_size = (uint64_t)val << 20; + + tag_name = "bios"; + if (vm_get_str_opt(cfg, tag_name, &str) < 0) + goto tag_fail; + if (str) { + p->files[VM_FILE_BIOS].filename = strdup(str); + } + + tag_name = "kernel"; + if (vm_get_str_opt(cfg, tag_name, &str) < 0) + goto tag_fail; + if (str) { + p->files[VM_FILE_KERNEL].filename = strdup(str); + } + + tag_name = "initrd"; + if (vm_get_str_opt(cfg, tag_name, &str) < 0) + goto tag_fail; + if (str) { + p->files[VM_FILE_INITRD].filename = strdup(str); + } + + if (vm_get_str_opt(cfg, "cmdline", &str) < 0) + goto tag_fail; + if (str) { + p->cmdline = cmdline_subst(str); + } + + for(;;) { + snprintf(buf1, sizeof(buf1), "drive%d", p->drive_count); + obj = json_object_get(cfg, buf1); + if (json_is_undefined(obj)) + break; + if (p->drive_count >= MAX_DRIVE_DEVICE) { + vm_error("Too many drives\n"); + return -1; + } + if (vm_get_str(obj, "file", &str) < 0) + goto tag_fail; + p->tab_drive[p->drive_count].filename = strdup(str); + if (vm_get_str_opt(obj, "device", &str) < 0) + goto tag_fail; + p->tab_drive[p->drive_count].device = strdup_null(str); + p->drive_count++; + } + + for(;;) { + snprintf(buf1, sizeof(buf1), "fs%d", p->fs_count); + obj = json_object_get(cfg, buf1); + if (json_is_undefined(obj)) + break; + if (p->fs_count >= MAX_DRIVE_DEVICE) { + vm_error("Too many filesystems\n"); + return -1; + } + if (vm_get_str(obj, "file", &str) < 0) + goto tag_fail; + p->tab_fs[p->fs_count].filename = strdup(str); + if (vm_get_str_opt(obj, "tag", &str) < 0) + goto tag_fail; + if (!str) { + if (p->fs_count == 0) + strcpy(buf1, "/dev/root"); + else + snprintf(buf1, sizeof(buf1), "/dev/root%d", p->fs_count); + str = buf1; + } + p->tab_fs[p->fs_count].tag = strdup(str); + p->fs_count++; + } + + for(;;) { + snprintf(buf1, sizeof(buf1), "eth%d", p->eth_count); + obj = json_object_get(cfg, buf1); + if (json_is_undefined(obj)) + break; + if (p->eth_count >= MAX_ETH_DEVICE) { + vm_error("Too many ethernet interfaces\n"); + return -1; + } + if (vm_get_str(obj, "driver", &str) < 0) + goto tag_fail; + p->tab_eth[p->eth_count].driver = strdup(str); + if (!strcmp(str, "tap")) { + if (vm_get_str(obj, "ifname", &str) < 0) + goto tag_fail; + p->tab_eth[p->eth_count].ifname = strdup(str); + } + p->eth_count++; + } + + p->display_device = NULL; + obj = json_object_get(cfg, "display0"); + if (!json_is_undefined(obj)) { + if (vm_get_str(obj, "device", &str) < 0) + goto tag_fail; + p->display_device = strdup(str); + if (vm_get_int(obj, "width", &p->width) < 0) + goto tag_fail; + if (vm_get_int(obj, "height", &p->height) < 0) + goto tag_fail; + if (vm_get_str_opt(obj, "vga_bios", &str) < 0) + goto tag_fail; + if (str) { + p->files[VM_FILE_VGA_BIOS].filename = strdup(str); + } + } + + if (vm_get_str_opt(cfg, "input_device", &str) < 0) + goto tag_fail; + p->input_device = strdup_null(str); + + if (vm_get_str_opt(cfg, "accel", &str) < 0) + goto tag_fail; + if (str) { + if (!strcmp(str, "none")) { + p->accel_enable = FALSE; + } else if (!strcmp(str, "auto")) { + p->accel_enable = TRUE; + } else { + vm_error("unsupported 'accel' config: %s\n", str); + return -1; + } + } + + tag_name = "rtc_local_time"; + el = json_object_get(cfg, tag_name); + if (!json_is_undefined(el)) { + if (el.type != JSON_BOOL) { + vm_error("%s: boolean expected\n", tag_name); + goto tag_fail; + } + p->rtc_local_time = el.u.b; + } + + json_free(cfg); + return 0; + tag_fail: + json_free(cfg); + return -1; +} + +typedef void FSLoadFileCB(void *opaque, uint8_t *buf, int buf_len); + +typedef struct { + VirtMachineParams *vm_params; + void (*start_cb)(void *opaque); + void *opaque; + + FSLoadFileCB *file_load_cb; + void *file_load_opaque; + int file_index; +} VMConfigLoadState; + +static void config_file_loaded(void *opaque, uint8_t *buf, int buf_len); +static void config_additional_file_load(VMConfigLoadState *s); +static void config_additional_file_load_cb(void *opaque, + uint8_t *buf, int buf_len); + +/* XXX: win32, URL */ +char *get_file_path(const char *base_filename, const char *filename) +{ + int len, len1; + char *fname, *p; + + if (!base_filename) + goto done; + if (strchr(filename, ':')) + goto done; /* full URL */ + if (filename[0] == '/') + goto done; + p = strrchr(base_filename, '/'); + if (!p) { + done: + return strdup(filename); + } + len = p + 1 - base_filename; + len1 = strlen(filename); + fname = malloc(len + len1 + 1); + memcpy(fname, base_filename, len); + memcpy(fname + len, filename, len1 + 1); + return fname; +} + + +#ifdef EMSCRIPTEN +static int load_file(uint8_t **pbuf, const char *filename) +{ + abort(); +} +#else +/* return -1 if error. */ +static int load_file(uint8_t **pbuf, const char *filename) +{ + FILE *f; + int size; + uint8_t *buf; + + f = fopen(filename, "rb"); + if (!f) { + perror(filename); + exit(1); + } + fseek(f, 0, SEEK_END); + size = ftell(f); + fseek(f, 0, SEEK_SET); + buf = malloc(size); + if (fread(buf, 1, size, f) != size) { + fprintf(stderr, "%s: read error\n", filename); + exit(1); + } + fclose(f); + *pbuf = buf; + return size; +} +#endif + +#ifdef CONFIG_FS_NET +static void config_load_file_cb(void *opaque, int err, void *data, size_t size) +{ + VMConfigLoadState *s = opaque; + + // printf("err=%d data=%p size=%ld\n", err, data, size); + if (err < 0) { + vm_error("Error %d while loading file\n", -err); + exit(1); + } + s->file_load_cb(s->file_load_opaque, data, size); +} +#endif + +static void config_load_file(VMConfigLoadState *s, const char *filename, + FSLoadFileCB *cb, void *opaque) +{ + // printf("loading %s\n", filename); +#ifdef CONFIG_FS_NET + if (is_url(filename)) { + s->file_load_cb = cb; + s->file_load_opaque = opaque; + fs_wget(filename, NULL, NULL, s, config_load_file_cb, TRUE); + } else +#endif + { + uint8_t *buf; + int size; + size = load_file(&buf, filename); + cb(opaque, buf, size); + free(buf); + } +} + +void virt_machine_load_config_file(VirtMachineParams *p, + const char *filename, + void (*start_cb)(void *opaque), + void *opaque) +{ + VMConfigLoadState *s; + + s = mallocz(sizeof(*s)); + s->vm_params = p; + s->start_cb = start_cb; + s->opaque = opaque; + p->cfg_filename = strdup(filename); + + config_load_file(s, filename, config_file_loaded, s); +} + +static void config_file_loaded(void *opaque, uint8_t *buf, int buf_len) +{ + VMConfigLoadState *s = opaque; + VirtMachineParams *p = s->vm_params; + + if (virt_machine_parse_config(p, (char *)buf, buf_len) < 0) + exit(1); + + /* load the additional files */ + s->file_index = 0; + config_additional_file_load(s); +} + +static void config_additional_file_load(VMConfigLoadState *s) +{ + VirtMachineParams *p = s->vm_params; + while (s->file_index < VM_FILE_COUNT && + p->files[s->file_index].filename == NULL) { + s->file_index++; + } + if (s->file_index == VM_FILE_COUNT) { + if (s->start_cb) + s->start_cb(s->opaque); + free(s); + } else { + char *fname; + + fname = get_file_path(p->cfg_filename, + p->files[s->file_index].filename); + config_load_file(s, fname, + config_additional_file_load_cb, s); + free(fname); + } +} + +static void config_additional_file_load_cb(void *opaque, + uint8_t *buf, int buf_len) +{ + VMConfigLoadState *s = opaque; + VirtMachineParams *p = s->vm_params; + + p->files[s->file_index].buf = malloc(buf_len); + memcpy(p->files[s->file_index].buf, buf, buf_len); + p->files[s->file_index].len = buf_len; + + /* load the next files */ + s->file_index++; + config_additional_file_load(s); +} + +void vm_add_cmdline(VirtMachineParams *p, const char *cmdline) +{ + char *new_cmdline, *old_cmdline; + if (cmdline[0] == '!') { + new_cmdline = strdup(cmdline + 1); + } else { + old_cmdline = p->cmdline; + if (!old_cmdline) + old_cmdline = ""; + new_cmdline = malloc(strlen(old_cmdline) + 1 + strlen(cmdline) + 1); + strcpy(new_cmdline, old_cmdline); + strcat(new_cmdline, " "); + strcat(new_cmdline, cmdline); + } + free(p->cmdline); + p->cmdline = new_cmdline; +} + +void virt_machine_free_config(VirtMachineParams *p) +{ + int i; + + free(p->machine_name); + free(p->cmdline); + for(i = 0; i < VM_FILE_COUNT; i++) { + free(p->files[i].filename); + free(p->files[i].buf); + } + for(i = 0; i < p->drive_count; i++) { + free(p->tab_drive[i].filename); + free(p->tab_drive[i].device); + } + for(i = 0; i < p->fs_count; i++) { + free(p->tab_fs[i].filename); + free(p->tab_fs[i].tag); + } + for(i = 0; i < p->eth_count; i++) { + free(p->tab_eth[i].driver); + free(p->tab_eth[i].ifname); + } + free(p->input_device); + free(p->display_device); + free(p->cfg_filename); +} + +VirtMachine *virt_machine_init(const VirtMachineParams *p) +{ + const VirtMachineClass *vmc = p->vmc; + return vmc->virt_machine_init(p); +} + +void virt_machine_set_defaults(VirtMachineParams *p) +{ + memset(p, 0, sizeof(*p)); +} + +void virt_machine_end(VirtMachine *s) +{ + s->vmc->virt_machine_end(s); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h new file mode 100644 index 0000000..76217ee --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/machine.h @@ -0,0 +1,196 @@ +/* + * VM definitions + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "json.h" + +typedef struct FBDevice FBDevice; + +typedef void SimpleFBDrawFunc(FBDevice *fb_dev, void *opaque, + int x, int y, int w, int h); + +struct FBDevice { + /* the following is set by the device */ + int width; + int height; + int stride; /* current stride in bytes */ + uint8_t *fb_data; /* current pointer to the pixel data */ + int fb_size; /* frame buffer memory size (info only) */ + void *device_opaque; + void (*refresh)(struct FBDevice *fb_dev, + SimpleFBDrawFunc *redraw_func, void *opaque); +}; + +#define MAX_DRIVE_DEVICE 4 +#define MAX_FS_DEVICE 4 +#define MAX_ETH_DEVICE 1 + +#define VM_CONFIG_VERSION 1 + +typedef enum { + VM_FILE_BIOS, + VM_FILE_VGA_BIOS, + VM_FILE_KERNEL, + VM_FILE_INITRD, + + VM_FILE_COUNT, +} VMFileTypeEnum; + +typedef struct { + char *filename; + uint8_t *buf; + int len; +} VMFileEntry; + +typedef struct { + char *device; + char *filename; + BlockDevice *block_dev; +} VMDriveEntry; + +typedef struct { + char *device; + char *tag; /* 9p mount tag */ + char *filename; + FSDevice *fs_dev; +} VMFSEntry; + +typedef struct { + char *driver; + char *ifname; + EthernetDevice *net; +} VMEthEntry; + +typedef struct VirtMachineClass VirtMachineClass; + +typedef struct { + char *cfg_filename; + const VirtMachineClass *vmc; + char *machine_name; + uint64_t ram_size; + BOOL rtc_real_time; + BOOL rtc_local_time; + char *display_device; /* NULL means no display */ + int width, height; /* graphic width & height */ + CharacterDevice *console; + VMDriveEntry tab_drive[MAX_DRIVE_DEVICE]; + int drive_count; + VMFSEntry tab_fs[MAX_FS_DEVICE]; + int fs_count; + VMEthEntry tab_eth[MAX_ETH_DEVICE]; + int eth_count; + + char *cmdline; /* bios or kernel command line */ + BOOL accel_enable; /* enable acceleration (KVM) */ + char *input_device; /* NULL means no input */ + + /* kernel, bios and other auxiliary files */ + VMFileEntry files[VM_FILE_COUNT]; +} VirtMachineParams; + +typedef struct VirtMachine { + const VirtMachineClass *vmc; + /* network */ + EthernetDevice *net; + /* console */ + VIRTIODevice *console_dev; + CharacterDevice *console; + /* graphics */ + FBDevice *fb_dev; +} VirtMachine; + +struct VirtMachineClass { + const char *machine_names; + void (*virt_machine_set_defaults)(VirtMachineParams *p); + VirtMachine *(*virt_machine_init)(const VirtMachineParams *p); + void (*virt_machine_end)(VirtMachine *s); + int (*virt_machine_get_sleep_duration)(VirtMachine *s, int delay); + void (*virt_machine_interp)(VirtMachine *s, int max_exec_cycle); + BOOL (*vm_mouse_is_absolute)(VirtMachine *s); + void (*vm_send_mouse_event)(VirtMachine *s1, int dx, int dy, int dz, + unsigned int buttons); + void (*vm_send_key_event)(VirtMachine *s1, BOOL is_down, uint16_t key_code); +}; + +extern const VirtMachineClass riscv_machine_class; +extern const VirtMachineClass pc_machine_class; + +void __attribute__((format(printf, 1, 2))) vm_error(const char *fmt, ...); +int vm_get_int(JSONValue obj, const char *name, int *pval); +int vm_get_int_opt(JSONValue obj, const char *name, int *pval, int def_val); + +void virt_machine_set_defaults(VirtMachineParams *p); +void virt_machine_load_config_file(VirtMachineParams *p, + const char *filename, + void (*start_cb)(void *opaque), + void *opaque); +void vm_add_cmdline(VirtMachineParams *p, const char *cmdline); +char *get_file_path(const char *base_filename, const char *filename); +void virt_machine_free_config(VirtMachineParams *p); +VirtMachine *virt_machine_init(const VirtMachineParams *p); +void virt_machine_end(VirtMachine *s); +static inline int virt_machine_get_sleep_duration(VirtMachine *s, int delay) +{ + return s->vmc->virt_machine_get_sleep_duration(s, delay); +} +static inline void virt_machine_interp(VirtMachine *s, int max_exec_cycle) +{ + s->vmc->virt_machine_interp(s, max_exec_cycle); +} +static inline BOOL vm_mouse_is_absolute(VirtMachine *s) +{ + return s->vmc->vm_mouse_is_absolute(s); +} +static inline void vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz, + unsigned int buttons) +{ + s1->vmc->vm_send_mouse_event(s1, dx, dy, dz, buttons); +} +static inline void vm_send_key_event(VirtMachine *s1, BOOL is_down, uint16_t key_code) +{ + s1->vmc->vm_send_key_event(s1, is_down, key_code); +} + +/* gui */ +void sdl_refresh(VirtMachine *m); +void sdl_init(int width, int height); + +/* simplefb.c */ +typedef struct SimpleFBState SimpleFBState; +SimpleFBState *simplefb_init(PhysMemoryMap *map, uint64_t phys_addr, + FBDevice *fb_dev, int width, int height); +void simplefb_refresh(FBDevice *fb_dev, + SimpleFBDrawFunc *redraw_func, void *opaque, + PhysMemoryRange *mem_range, + int fb_page_count); + +/* vga.c */ +typedef struct VGAState VGAState; +VGAState *pci_vga_init(PCIBus *bus, FBDevice *fb_dev, + int width, int height, + const uint8_t *vga_rom_buf, int vga_rom_size); + +/* block_net.c */ +BlockDevice *block_device_init_http(const char *url, + int max_cache_size_kb, + void (*start_cb)(void *opaque), + void *start_opaque); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh b/jslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh new file mode 100755 index 0000000..c2dadf9 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/netinit.sh @@ -0,0 +1,43 @@ +#!/bin/sh +# +# RISCVEMU Ethernet bridge and NAT configuration (run with sudo) +# +# Copyright (c) 2017 Fabrice Bellard +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + +# host network interface connected to Internet (change it) +internet_ifname="enp0s20f0u1" + +# setup bridge interface +ip link add br0 type bridge +# create and add tap0 interface to bridge +ip tuntap add dev tap0 mode tap user $USER +ip link set tap0 master br0 + +ip link set dev br0 up +ip link set dev tap0 up +ifconfig br0 192.168.3.1 + +# setup NAT to access to Internet +echo 1 > /proc/sys/net/ipv4/ip_forward +# delete forwarding reject rule if present +#iptables -D FORWARD 1 +iptables -t nat -A POSTROUTING -o $internet_ifname -j MASQUERADE diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/pci.c b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.c new file mode 100644 index 0000000..d37b737 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.c @@ -0,0 +1,588 @@ +/* + * Simple PCI bus driver + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> + +#include "cutils.h" +#include "pci.h" + +//#define DEBUG_CONFIG + +typedef struct { + uint32_t size; /* 0 means no mapping defined */ + uint8_t type; + uint8_t enabled; /* true if mapping is enabled */ + void *opaque; + PCIBarSetFunc *bar_set; +} PCIIORegion; + +struct PCIDevice { + PCIBus *bus; + uint8_t devfn; + IRQSignal irq[4]; + uint8_t config[256]; + uint8_t next_cap_offset; /* offset of the next capability */ + char *name; /* for debug only */ + PCIIORegion io_regions[PCI_NUM_REGIONS]; +}; + +struct PCIBus { + int bus_num; + PCIDevice *device[256]; + PhysMemoryMap *mem_map; + PhysMemoryMap *port_map; + uint32_t irq_state[4][8]; /* one bit per device */ + IRQSignal irq[4]; +}; + +static int bus_map_irq(PCIDevice *d, int irq_num) +{ + int slot_addend; + slot_addend = (d->devfn >> 3) - 1; + return (irq_num + slot_addend) & 3; +} + +static void pci_device_set_irq(void *opaque, int irq_num, int level) +{ + PCIDevice *d = opaque; + PCIBus *b = d->bus; + uint32_t mask; + int i, irq_level; + + // printf("%s: pci_device_seq_irq: %d %d\n", d->name, irq_num, level); + irq_num = bus_map_irq(d, irq_num); + mask = 1 << (d->devfn & 0x1f); + if (level) + b->irq_state[irq_num][d->devfn >> 5] |= mask; + else + b->irq_state[irq_num][d->devfn >> 5] &= ~mask; + + /* compute the IRQ state */ + mask = 0; + for(i = 0; i < 8; i++) + mask |= b->irq_state[irq_num][i]; + irq_level = (mask != 0); + set_irq(&b->irq[irq_num], irq_level); +} + +static int devfn_alloc(PCIBus *b) +{ + int devfn; + for(devfn = 0; devfn < 256; devfn += 8) { + if (!b->device[devfn]) + return devfn; + } + return -1; +} + +/* devfn < 0 means to allocate it */ +PCIDevice *pci_register_device(PCIBus *b, const char *name, int devfn, + uint16_t vendor_id, uint16_t device_id, + uint8_t revision, uint16_t class_id) +{ + PCIDevice *d; + int i; + + if (devfn < 0) { + devfn = devfn_alloc(b); + if (devfn < 0) + return NULL; + } + if (b->device[devfn]) + return NULL; + + d = mallocz(sizeof(PCIDevice)); + d->bus = b; + d->name = strdup(name); + d->devfn = devfn; + + put_le16(d->config + 0x00, vendor_id); + put_le16(d->config + 0x02, device_id); + d->config[0x08] = revision; + put_le16(d->config + 0x0a, class_id); + d->config[0x0e] = 0x00; /* header type */ + d->next_cap_offset = 0x40; + + for(i = 0; i < 4; i++) + irq_init(&d->irq[i], pci_device_set_irq, d, i); + b->device[devfn] = d; + + return d; +} + +IRQSignal *pci_device_get_irq(PCIDevice *d, unsigned int irq_num) +{ + assert(irq_num < 4); + return &d->irq[irq_num]; +} + +static uint32_t pci_device_config_read(PCIDevice *d, uint32_t addr, + int size_log2) +{ + uint32_t val; + switch(size_log2) { + case 0: + val = *(uint8_t *)(d->config + addr); + break; + case 1: + /* Note: may be unaligned */ + if (addr <= 0xfe) + val = get_le16(d->config + addr); + else + val = *(uint8_t *)(d->config + addr); + break; + case 2: + /* always aligned */ + val = get_le32(d->config + addr); + break; + default: + abort(); + } +#ifdef DEBUG_CONFIG + printf("pci_config_read: dev=%s addr=0x%02x val=0x%x s=%d\n", + d->name, addr, val, 1 << size_log2); +#endif + return val; +} + +PhysMemoryMap *pci_device_get_mem_map(PCIDevice *d) +{ + return d->bus->mem_map; +} + +PhysMemoryMap *pci_device_get_port_map(PCIDevice *d) +{ + return d->bus->port_map; +} + +void pci_register_bar(PCIDevice *d, unsigned int bar_num, + uint32_t size, int type, + void *opaque, PCIBarSetFunc *bar_set) +{ + PCIIORegion *r; + uint32_t val, config_addr; + + assert(bar_num < PCI_NUM_REGIONS); + assert((size & (size - 1)) == 0); /* power of two */ + assert(size >= 4); + r = &d->io_regions[bar_num]; + assert(r->size == 0); + r->size = size; + r->type = type; + r->enabled = FALSE; + r->opaque = opaque; + r->bar_set = bar_set; + /* set the config value */ + val = 0; + if (bar_num == PCI_ROM_SLOT) { + config_addr = 0x30; + } else { + val |= r->type; + config_addr = 0x10 + 4 * bar_num; + } + put_le32(&d->config[config_addr], val); +} + +static void pci_update_mappings(PCIDevice *d) +{ + int cmd, i, offset; + uint32_t new_addr; + BOOL new_enabled; + PCIIORegion *r; + + cmd = get_le16(&d->config[PCI_COMMAND]); + + for(i = 0; i < PCI_NUM_REGIONS; i++) { + r = &d->io_regions[i]; + if (i == PCI_ROM_SLOT) { + offset = 0x30; + } else { + offset = 0x10 + i * 4; + } + new_addr = get_le32(&d->config[offset]); + new_enabled = FALSE; + if (r->size != 0) { + if ((r->type & PCI_ADDRESS_SPACE_IO) && + (cmd & PCI_COMMAND_IO)) { + new_enabled = TRUE; + } else { + if (cmd & PCI_COMMAND_MEMORY) { + if (i == PCI_ROM_SLOT) { + new_enabled = (new_addr & 1); + } else { + new_enabled = TRUE; + } + } + } + } + if (new_enabled) { + /* new address */ + new_addr = get_le32(&d->config[offset]) & ~(r->size - 1); + r->bar_set(r->opaque, i, new_addr, TRUE); + r->enabled = TRUE; + } else if (r->enabled) { + r->bar_set(r->opaque, i, 0, FALSE); + r->enabled = FALSE; + } + } +} + +/* return != 0 if write is not handled */ +static int pci_write_bar(PCIDevice *d, uint32_t addr, + uint32_t val) +{ + PCIIORegion *r; + int reg; + + if (addr == 0x30) + reg = PCI_ROM_SLOT; + else + reg = (addr - 0x10) >> 2; + // printf("%s: write bar addr=%x data=%x\n", d->name, addr, val); + r = &d->io_regions[reg]; + if (r->size == 0) + return -1; + if (reg == PCI_ROM_SLOT) { + val = val & ((~(r->size - 1)) | 1); + } else { + val = (val & ~(r->size - 1)) | r->type; + } + put_le32(d->config + addr, val); + pci_update_mappings(d); + return 0; +} + +static void pci_device_config_write8(PCIDevice *d, uint32_t addr, + uint32_t data) +{ + int can_write; + + if (addr == PCI_STATUS || addr == (PCI_STATUS + 1)) { + /* write 1 reset bits */ + d->config[addr] &= ~data; + return; + } + + switch(d->config[0x0e]) { + case 0x00: + case 0x80: + switch(addr) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0e: + case 0x10 ... 0x27: /* base */ + case 0x30 ... 0x33: /* rom */ + case 0x3d: + can_write = 0; + break; + default: + can_write = 1; + break; + } + break; + default: + case 0x01: + switch(addr) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0e: + case 0x38 ... 0x3b: /* rom */ + case 0x3d: + can_write = 0; + break; + default: + can_write = 1; + break; + } + break; + } + if (can_write) + d->config[addr] = data; +} + + +static void pci_device_config_write(PCIDevice *d, uint32_t addr, + uint32_t data, int size_log2) +{ + int size, i; + uint32_t addr1; + +#ifdef DEBUG_CONFIG + printf("pci_config_write: dev=%s addr=0x%02x val=0x%x s=%d\n", + d->name, addr, data, 1 << size_log2); +#endif + if (size_log2 == 2 && + ((addr >= 0x10 && addr < 0x10 + 4 * 6) || + addr == 0x30)) { + if (pci_write_bar(d, addr, data) == 0) + return; + } + size = 1 << size_log2; + for(i = 0; i < size; i++) { + addr1 = addr + i; + if (addr1 <= 0xff) { + pci_device_config_write8(d, addr1, (data >> (i * 8)) & 0xff); + } + } + if (PCI_COMMAND >= addr && PCI_COMMAND < addr + size) { + pci_update_mappings(d); + } +} + + +static void pci_data_write(PCIBus *s, uint32_t addr, + uint32_t data, int size_log2) +{ + PCIDevice *d; + int bus_num, devfn, config_addr; + + bus_num = (addr >> 16) & 0xff; + if (bus_num != s->bus_num) + return; + devfn = (addr >> 8) & 0xff; + d = s->device[devfn]; + if (!d) + return; + config_addr = addr & 0xff; + pci_device_config_write(d, config_addr, data, size_log2); +} + +static const uint32_t val_ones[3] = { 0xff, 0xffff, 0xffffffff }; + +static uint32_t pci_data_read(PCIBus *s, uint32_t addr, int size_log2) +{ + PCIDevice *d; + int bus_num, devfn, config_addr; + + bus_num = (addr >> 16) & 0xff; + if (bus_num != s->bus_num) + return val_ones[size_log2]; + devfn = (addr >> 8) & 0xff; + d = s->device[devfn]; + if (!d) + return val_ones[size_log2]; + config_addr = addr & 0xff; + return pci_device_config_read(d, config_addr, size_log2); +} + +/* warning: only valid for one DEVIO page. Return NULL if no memory at + the given address */ +uint8_t *pci_device_get_dma_ptr(PCIDevice *d, uint64_t addr, BOOL is_rw) +{ + return phys_mem_get_ram_ptr(d->bus->mem_map, addr, is_rw); +} + +void pci_device_set_config8(PCIDevice *d, uint8_t addr, uint8_t val) +{ + d->config[addr] = val; +} + +void pci_device_set_config16(PCIDevice *d, uint8_t addr, uint16_t val) +{ + put_le16(&d->config[addr], val); +} + +int pci_device_get_devfn(PCIDevice *d) +{ + return d->devfn; +} + +/* return the offset of the capability or < 0 if error. */ +int pci_add_capability(PCIDevice *d, const uint8_t *buf, int size) +{ + int offset; + + offset = d->next_cap_offset; + if ((offset + size) > 256) + return -1; + d->next_cap_offset += size; + d->config[PCI_STATUS] |= PCI_STATUS_CAP_LIST; + memcpy(d->config + offset, buf, size); + d->config[offset + 1] = d->config[PCI_CAPABILITY_LIST]; + d->config[PCI_CAPABILITY_LIST] = offset; + return offset; +} + +/* i440FX host bridge */ + +struct I440FXState { + PCIBus *pci_bus; + PCIDevice *pci_dev; + PCIDevice *piix3_dev; + uint32_t config_reg; + uint8_t pic_irq_state[16]; + IRQSignal *pic_irqs; /* 16 irqs */ +}; + +static void i440fx_write_addr(void *opaque, uint32_t offset, + uint32_t data, int size_log2) +{ + I440FXState *s = opaque; + s->config_reg = data; +} + +static uint32_t i440fx_read_addr(void *opaque, uint32_t offset, int size_log2) +{ + I440FXState *s = opaque; + return s->config_reg; +} + +static void i440fx_write_data(void *opaque, uint32_t offset, + uint32_t data, int size_log2) +{ + I440FXState *s = opaque; + if (s->config_reg & 0x80000000) { + if (size_log2 == 2) { + /* it is simpler to assume 32 bit config accesses are + always aligned */ + pci_data_write(s->pci_bus, s->config_reg & ~3, data, size_log2); + } else { + pci_data_write(s->pci_bus, s->config_reg | offset, data, size_log2); + } + } +} + +static uint32_t i440fx_read_data(void *opaque, uint32_t offset, int size_log2) +{ + I440FXState *s = opaque; + if (!(s->config_reg & 0x80000000)) + return val_ones[size_log2]; + if (size_log2 == 2) { + /* it is simpler to assume 32 bit config accesses are + always aligned */ + return pci_data_read(s->pci_bus, s->config_reg & ~3, size_log2); + } else { + return pci_data_read(s->pci_bus, s->config_reg | offset, size_log2); + } +} + +static void i440fx_set_irq(void *opaque, int irq_num, int irq_level) +{ + I440FXState *s = opaque; + PCIDevice *hd = s->piix3_dev; + int pic_irq; + + /* map to the PIC irq (different IRQs can be mapped to the same + PIC irq) */ + hd->config[0x60 + irq_num] &= ~0x80; + pic_irq = hd->config[0x60 + irq_num]; + if (pic_irq < 16) { + if (irq_level) + s->pic_irq_state[pic_irq] |= 1 << irq_num; + else + s->pic_irq_state[pic_irq] &= ~(1 << irq_num); + set_irq(&s->pic_irqs[pic_irq], (s->pic_irq_state[pic_irq] != 0)); + } +} + +I440FXState *i440fx_init(PCIBus **pbus, int *ppiix3_devfn, + PhysMemoryMap *mem_map, PhysMemoryMap *port_map, + IRQSignal *pic_irqs) +{ + I440FXState *s; + PCIBus *b; + PCIDevice *d; + int i; + + s = mallocz(sizeof(*s)); + + b = mallocz(sizeof(PCIBus)); + b->bus_num = 0; + b->mem_map = mem_map; + b->port_map = port_map; + + s->pic_irqs = pic_irqs; + for(i = 0; i < 4; i++) { + irq_init(&b->irq[i], i440fx_set_irq, s, i); + } + + cpu_register_device(port_map, 0xcf8, 1, s, i440fx_read_addr, i440fx_write_addr, + DEVIO_SIZE32); + cpu_register_device(port_map, 0xcfc, 4, s, i440fx_read_data, i440fx_write_data, + DEVIO_SIZE8 | DEVIO_SIZE16 | DEVIO_SIZE32); + d = pci_register_device(b, "i440FX", 0, 0x8086, 0x1237, 0x02, 0x0600); + put_le16(&d->config[PCI_SUBSYSTEM_VENDOR_ID], 0x1af4); /* Red Hat, Inc. */ + put_le16(&d->config[PCI_SUBSYSTEM_ID], 0x1100); /* QEMU virtual machine */ + + s->pci_dev = d; + s->pci_bus = b; + + s->piix3_dev = pci_register_device(b, "PIIX3", 8, 0x8086, 0x7000, + 0x00, 0x0601); + pci_device_set_config8(s->piix3_dev, 0x0e, 0x80); /* header type */ + + *pbus = b; + *ppiix3_devfn = s->piix3_dev->devfn; + return s; +} + +/* in case no BIOS is used, map the interrupts. */ +void i440fx_map_interrupts(I440FXState *s, uint8_t *elcr, + const uint8_t *pci_irqs) +{ + PCIBus *b = s->pci_bus; + PCIDevice *d, *hd; + int irq_num, pic_irq, devfn, i; + + /* set a default PCI IRQ mapping to PIC IRQs */ + hd = s->piix3_dev; + + elcr[0] = 0; + elcr[1] = 0; + for(i = 0; i < 4; i++) { + irq_num = pci_irqs[i]; + hd->config[0x60 + i] = irq_num; + elcr[irq_num >> 3] |= (1 << (irq_num & 7)); + } + + for(devfn = 0; devfn < 256; devfn++) { + d = b->device[devfn]; + if (!d) + continue; + if (d->config[PCI_INTERRUPT_PIN]) { + irq_num = 0; + irq_num = bus_map_irq(d, irq_num); + pic_irq = hd->config[0x60 + irq_num]; + if (pic_irq < 16) { + d->config[PCI_INTERRUPT_LINE] = pic_irq; + } + } + } +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/pci.h b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.h new file mode 100644 index 0000000..39d6efe --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/pci.h @@ -0,0 +1,81 @@ +/* + * Simple PCI bus driver + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef PCI_H +#define PCI_H + +#include "iomem.h" + +typedef struct PCIBus PCIBus; +typedef struct PCIDevice PCIDevice; + +/* bar type */ +#define PCI_ADDRESS_SPACE_MEM 0x00 +#define PCI_ADDRESS_SPACE_IO 0x01 +#define PCI_ADDRESS_SPACE_MEM_PREFETCH 0x08 + +#define PCI_ROM_SLOT 6 +#define PCI_NUM_REGIONS 7 + +/* PCI config addresses */ +#define PCI_VENDOR_ID 0x00 /* 16 bits */ +#define PCI_DEVICE_ID 0x02 /* 16 bits */ +#define PCI_COMMAND 0x04 /* 16 bits */ +#define PCI_COMMAND_IO (1 << 0) +#define PCI_COMMAND_MEMORY (1 << 1) +#define PCI_STATUS 0x06 /* 16 bits */ +#define PCI_STATUS_CAP_LIST (1 << 4) +#define PCI_CLASS_PROG 0x09 +#define PCI_SUBSYSTEM_VENDOR_ID 0x2c /* 16 bits */ +#define PCI_SUBSYSTEM_ID 0x2e /* 16 bits */ +#define PCI_CAPABILITY_LIST 0x34 /* 8 bits */ +#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ +#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ + +typedef void PCIBarSetFunc(void *opaque, int bar_num, uint32_t addr, + BOOL enabled); + +PCIDevice *pci_register_device(PCIBus *b, const char *name, int devfn, + uint16_t vendor_id, uint16_t device_id, + uint8_t revision, uint16_t class_id); +PhysMemoryMap *pci_device_get_mem_map(PCIDevice *d); +PhysMemoryMap *pci_device_get_port_map(PCIDevice *d); +void pci_register_bar(PCIDevice *d, unsigned int bar_num, + uint32_t size, int type, + void *opaque, PCIBarSetFunc *bar_set); +IRQSignal *pci_device_get_irq(PCIDevice *d, unsigned int irq_num); +uint8_t *pci_device_get_dma_ptr(PCIDevice *d, uint64_t addr, BOOL is_rw); +void pci_device_set_config8(PCIDevice *d, uint8_t addr, uint8_t val); +void pci_device_set_config16(PCIDevice *d, uint8_t addr, uint16_t val); +int pci_device_get_devfn(PCIDevice *d); +int pci_add_capability(PCIDevice *d, const uint8_t *buf, int size); + +typedef struct I440FXState I440FXState; + +I440FXState *i440fx_init(PCIBus **pbus, int *ppiix3_devfn, + PhysMemoryMap *mem_map, PhysMemoryMap *port_map, + IRQSignal *pic_irqs); +void i440fx_map_interrupts(I440FXState *s, uint8_t *elcr, + const uint8_t *pci_irqs); + +#endif /* PCI_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c b/jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c new file mode 100644 index 0000000..e1c73d7 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/pckbd.c @@ -0,0 +1,342 @@ +/* + * QEMU PC keyboard emulation + * + * Copyright (c) 2003 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "iomem.h" +#include "ps2.h" +#include "virtio.h" +#include "machine.h" + +/* debug PC keyboard */ +//#define DEBUG_KBD + +/* debug PC keyboard : only mouse */ +//#define DEBUG_MOUSE + +/* Keyboard Controller Commands */ +#define KBD_CCMD_READ_MODE 0x20 /* Read mode bits */ +#define KBD_CCMD_WRITE_MODE 0x60 /* Write mode bits */ +#define KBD_CCMD_GET_VERSION 0xA1 /* Get controller version */ +#define KBD_CCMD_MOUSE_DISABLE 0xA7 /* Disable mouse interface */ +#define KBD_CCMD_MOUSE_ENABLE 0xA8 /* Enable mouse interface */ +#define KBD_CCMD_TEST_MOUSE 0xA9 /* Mouse interface test */ +#define KBD_CCMD_SELF_TEST 0xAA /* Controller self test */ +#define KBD_CCMD_KBD_TEST 0xAB /* Keyboard interface test */ +#define KBD_CCMD_KBD_DISABLE 0xAD /* Keyboard interface disable */ +#define KBD_CCMD_KBD_ENABLE 0xAE /* Keyboard interface enable */ +#define KBD_CCMD_READ_INPORT 0xC0 /* read input port */ +#define KBD_CCMD_READ_OUTPORT 0xD0 /* read output port */ +#define KBD_CCMD_WRITE_OUTPORT 0xD1 /* write output port */ +#define KBD_CCMD_WRITE_OBUF 0xD2 +#define KBD_CCMD_WRITE_AUX_OBUF 0xD3 /* Write to output buffer as if + initiated by the auxiliary device */ +#define KBD_CCMD_WRITE_MOUSE 0xD4 /* Write the following byte to the mouse */ +#define KBD_CCMD_DISABLE_A20 0xDD /* HP vectra only ? */ +#define KBD_CCMD_ENABLE_A20 0xDF /* HP vectra only ? */ +#define KBD_CCMD_RESET 0xFE + +/* Status Register Bits */ +#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */ +#define KBD_STAT_IBF 0x02 /* Keyboard input buffer full */ +#define KBD_STAT_SELFTEST 0x04 /* Self test successful */ +#define KBD_STAT_CMD 0x08 /* Last write was a command write (0=data) */ +#define KBD_STAT_UNLOCKED 0x10 /* Zero if keyboard locked */ +#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */ +#define KBD_STAT_GTO 0x40 /* General receive/xmit timeout */ +#define KBD_STAT_PERR 0x80 /* Parity error */ + +/* Controller Mode Register Bits */ +#define KBD_MODE_KBD_INT 0x01 /* Keyboard data generate IRQ1 */ +#define KBD_MODE_MOUSE_INT 0x02 /* Mouse data generate IRQ12 */ +#define KBD_MODE_SYS 0x04 /* The system flag (?) */ +#define KBD_MODE_NO_KEYLOCK 0x08 /* The keylock doesn't affect the keyboard if set */ +#define KBD_MODE_DISABLE_KBD 0x10 /* Disable keyboard interface */ +#define KBD_MODE_DISABLE_MOUSE 0x20 /* Disable mouse interface */ +#define KBD_MODE_KCC 0x40 /* Scan code conversion to PC format */ +#define KBD_MODE_RFU 0x80 + +#define KBD_PENDING_KBD 1 +#define KBD_PENDING_AUX 2 + +struct KBDState { + uint8_t write_cmd; /* if non zero, write data to port 60 is expected */ + uint8_t status; + uint8_t mode; + /* Bitmask of devices with data available. */ + uint8_t pending; + PS2KbdState *kbd; + PS2MouseState *mouse; + + IRQSignal *irq_kbd; + IRQSignal *irq_mouse; +}; + +static void qemu_system_reset_request(void) +{ + printf("system_reset_request\n"); + exit(1); + /* XXX */ +} + +static void ioport_set_a20(int val) +{ +} + +static int ioport_get_a20(void) +{ + return 1; +} + +/* update irq and KBD_STAT_[MOUSE_]OBF */ +/* XXX: not generating the irqs if KBD_MODE_DISABLE_KBD is set may be + incorrect, but it avoids having to simulate exact delays */ +static void kbd_update_irq(KBDState *s) +{ + int irq_kbd_level, irq_mouse_level; + + irq_kbd_level = 0; + irq_mouse_level = 0; + s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); + if (s->pending) { + s->status |= KBD_STAT_OBF; + /* kbd data takes priority over aux data. */ + if (s->pending == KBD_PENDING_AUX) { + s->status |= KBD_STAT_MOUSE_OBF; + if (s->mode & KBD_MODE_MOUSE_INT) + irq_mouse_level = 1; + } else { + if ((s->mode & KBD_MODE_KBD_INT) && + !(s->mode & KBD_MODE_DISABLE_KBD)) + irq_kbd_level = 1; + } + } + set_irq(s->irq_kbd, irq_kbd_level); + set_irq(s->irq_mouse, irq_mouse_level); +} + +static void kbd_update_kbd_irq(void *opaque, int level) +{ + KBDState *s = (KBDState *)opaque; + + if (level) + s->pending |= KBD_PENDING_KBD; + else + s->pending &= ~KBD_PENDING_KBD; + kbd_update_irq(s); +} + +static void kbd_update_aux_irq(void *opaque, int level) +{ + KBDState *s = (KBDState *)opaque; + + if (level) + s->pending |= KBD_PENDING_AUX; + else + s->pending &= ~KBD_PENDING_AUX; + kbd_update_irq(s); +} + +static uint32_t kbd_read_status(void *opaque, uint32_t addr, int size_log2) +{ + KBDState *s = opaque; + int val; + val = s->status; +#if defined(DEBUG_KBD) + printf("kbd: read status=0x%02x\n", val); +#endif + return val; +} + +static void kbd_queue(KBDState *s, int b, int aux) +{ + if (aux) + ps2_queue(s->mouse, b); + else + ps2_queue(s->kbd, b); +} + +static void kbd_write_command(void *opaque, uint32_t addr, uint32_t val, + int size_log2) +{ + KBDState *s = opaque; + +#if defined(DEBUG_KBD) + printf("kbd: write cmd=0x%02x\n", val); +#endif + switch(val) { + case KBD_CCMD_READ_MODE: + kbd_queue(s, s->mode, 1); + break; + case KBD_CCMD_WRITE_MODE: + case KBD_CCMD_WRITE_OBUF: + case KBD_CCMD_WRITE_AUX_OBUF: + case KBD_CCMD_WRITE_MOUSE: + case KBD_CCMD_WRITE_OUTPORT: + s->write_cmd = val; + break; + case KBD_CCMD_MOUSE_DISABLE: + s->mode |= KBD_MODE_DISABLE_MOUSE; + break; + case KBD_CCMD_MOUSE_ENABLE: + s->mode &= ~KBD_MODE_DISABLE_MOUSE; + break; + case KBD_CCMD_TEST_MOUSE: + kbd_queue(s, 0x00, 0); + break; + case KBD_CCMD_SELF_TEST: + s->status |= KBD_STAT_SELFTEST; + kbd_queue(s, 0x55, 0); + break; + case KBD_CCMD_KBD_TEST: + kbd_queue(s, 0x00, 0); + break; + case KBD_CCMD_KBD_DISABLE: + s->mode |= KBD_MODE_DISABLE_KBD; + kbd_update_irq(s); + break; + case KBD_CCMD_KBD_ENABLE: + s->mode &= ~KBD_MODE_DISABLE_KBD; + kbd_update_irq(s); + break; + case KBD_CCMD_READ_INPORT: + kbd_queue(s, 0x00, 0); + break; + case KBD_CCMD_READ_OUTPORT: + /* XXX: check that */ + val = 0x01 | (ioport_get_a20() << 1); + if (s->status & KBD_STAT_OBF) + val |= 0x10; + if (s->status & KBD_STAT_MOUSE_OBF) + val |= 0x20; + kbd_queue(s, val, 0); + break; + case KBD_CCMD_ENABLE_A20: + ioport_set_a20(1); + break; + case KBD_CCMD_DISABLE_A20: + ioport_set_a20(0); + break; + case KBD_CCMD_RESET: + qemu_system_reset_request(); + break; + case 0xff: + /* ignore that - I don't know what is its use */ + break; + default: + fprintf(stderr, "qemu: unsupported keyboard cmd=0x%02x\n", val); + break; + } +} + +static uint32_t kbd_read_data(void *opaque, uint32_t addr, int size_log2) +{ + KBDState *s = opaque; + uint32_t val; + if (s->pending == KBD_PENDING_AUX) + val = ps2_read_data(s->mouse); + else + val = ps2_read_data(s->kbd); +#ifdef DEBUG_KBD + printf("kbd: read data=0x%02x\n", val); +#endif + return val; +} + +static void kbd_write_data(void *opaque, uint32_t addr, uint32_t val, int size_log2) +{ + KBDState *s = opaque; + +#ifdef DEBUG_KBD + printf("kbd: write data=0x%02x\n", val); +#endif + + switch(s->write_cmd) { + case 0: + ps2_write_keyboard(s->kbd, val); + break; + case KBD_CCMD_WRITE_MODE: + s->mode = val; + ps2_keyboard_set_translation(s->kbd, (s->mode & KBD_MODE_KCC) != 0); + /* ??? */ + kbd_update_irq(s); + break; + case KBD_CCMD_WRITE_OBUF: + kbd_queue(s, val, 0); + break; + case KBD_CCMD_WRITE_AUX_OBUF: + kbd_queue(s, val, 1); + break; + case KBD_CCMD_WRITE_OUTPORT: + ioport_set_a20((val >> 1) & 1); + if (!(val & 1)) { + qemu_system_reset_request(); + } + break; + case KBD_CCMD_WRITE_MOUSE: + ps2_write_mouse(s->mouse, val); + break; + default: + break; + } + s->write_cmd = 0; +} + +static void kbd_reset(void *opaque) +{ + KBDState *s = opaque; + + s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT; + s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED; +} + +KBDState *i8042_init(PS2KbdState **pkbd, + PS2MouseState **pmouse, + PhysMemoryMap *port_map, + IRQSignal *kbd_irq, IRQSignal *mouse_irq, uint32_t io_base) +{ + KBDState *s; + + s = mallocz(sizeof(*s)); + + s->irq_kbd = kbd_irq; + s->irq_mouse = mouse_irq; + + kbd_reset(s); + cpu_register_device(port_map, io_base, 1, s, kbd_read_data, kbd_write_data, + DEVIO_SIZE8); + cpu_register_device(port_map, io_base + 4, 1, s, kbd_read_status, kbd_write_command, + DEVIO_SIZE8); + + s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); + s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); + + *pkbd = s->kbd; + *pmouse = s->mouse; + return s; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c new file mode 100644 index 0000000..c787568 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.c @@ -0,0 +1,489 @@ +/* + * QEMU PS/2 keyboard/mouse emulation + * + * Copyright (c) 2003 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "iomem.h" +#include "ps2.h" + +/* debug PC keyboard */ +//#define DEBUG_KBD + +/* debug PC keyboard : only mouse */ +//#define DEBUG_MOUSE + +/* Keyboard Commands */ +#define KBD_CMD_SET_LEDS 0xED /* Set keyboard leds */ +#define KBD_CMD_ECHO 0xEE +#define KBD_CMD_GET_ID 0xF2 /* get keyboard ID */ +#define KBD_CMD_SET_RATE 0xF3 /* Set typematic rate */ +#define KBD_CMD_ENABLE 0xF4 /* Enable scanning */ +#define KBD_CMD_RESET_DISABLE 0xF5 /* reset and disable scanning */ +#define KBD_CMD_RESET_ENABLE 0xF6 /* reset and enable scanning */ +#define KBD_CMD_RESET 0xFF /* Reset */ + +/* Keyboard Replies */ +#define KBD_REPLY_POR 0xAA /* Power on reset */ +#define KBD_REPLY_ACK 0xFA /* Command ACK */ +#define KBD_REPLY_RESEND 0xFE /* Command NACK, send the cmd again */ + +/* Mouse Commands */ +#define AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */ +#define AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */ +#define AUX_SET_RES 0xE8 /* Set resolution */ +#define AUX_GET_SCALE 0xE9 /* Get scaling factor */ +#define AUX_SET_STREAM 0xEA /* Set stream mode */ +#define AUX_POLL 0xEB /* Poll */ +#define AUX_RESET_WRAP 0xEC /* Reset wrap mode */ +#define AUX_SET_WRAP 0xEE /* Set wrap mode */ +#define AUX_SET_REMOTE 0xF0 /* Set remote mode */ +#define AUX_GET_TYPE 0xF2 /* Get type */ +#define AUX_SET_SAMPLE 0xF3 /* Set sample rate */ +#define AUX_ENABLE_DEV 0xF4 /* Enable aux device */ +#define AUX_DISABLE_DEV 0xF5 /* Disable aux device */ +#define AUX_SET_DEFAULT 0xF6 +#define AUX_RESET 0xFF /* Reset aux device */ +#define AUX_ACK 0xFA /* Command byte ACK. */ + +#define MOUSE_STATUS_REMOTE 0x40 +#define MOUSE_STATUS_ENABLED 0x20 +#define MOUSE_STATUS_SCALE21 0x10 + +#define PS2_QUEUE_SIZE 256 + +typedef struct { + uint8_t data[PS2_QUEUE_SIZE]; + int rptr, wptr, count; +} PS2Queue; + +typedef struct { + PS2Queue queue; + int32_t write_cmd; + void (*update_irq)(void *, int); + void *update_arg; +} PS2State; + +struct PS2KbdState { + PS2State common; + int scan_enabled; + /* Qemu uses translated PC scancodes internally. To avoid multiple + conversions we do the translation (if any) in the PS/2 emulation + not the keyboard controller. */ + int translate; +}; + +struct PS2MouseState { + PS2State common; + uint8_t mouse_status; + uint8_t mouse_resolution; + uint8_t mouse_sample_rate; + uint8_t mouse_wrap; + uint8_t mouse_type; /* 0 = PS2, 3 = IMPS/2, 4 = IMEX */ + uint8_t mouse_detect_state; + int mouse_dx; /* current values, needed for 'poll' mode */ + int mouse_dy; + int mouse_dz; + uint8_t mouse_buttons; +}; + +void ps2_queue(void *opaque, int b) +{ + PS2State *s = (PS2State *)opaque; + PS2Queue *q = &s->queue; + + if (q->count >= PS2_QUEUE_SIZE) + return; + q->data[q->wptr] = b; + if (++q->wptr == PS2_QUEUE_SIZE) + q->wptr = 0; + q->count++; + s->update_irq(s->update_arg, 1); +} + +#define INPUT_MAKE_KEY_MIN 96 +#define INPUT_MAKE_KEY_MAX 127 + +static const uint8_t linux_input_to_keycode_set1[INPUT_MAKE_KEY_MAX - INPUT_MAKE_KEY_MIN + 1] = { + 0x1c, 0x1d, 0x35, 0x00, 0x38, 0x00, 0x47, 0x48, + 0x49, 0x4b, 0x4d, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5c, 0x5d, +}; + +/* keycode is a Linux input layer keycode. We only support the PS/2 + keycode set 1 */ +void ps2_put_keycode(PS2KbdState *s, BOOL is_down, int keycode) +{ + if (keycode >= INPUT_MAKE_KEY_MIN) { + if (keycode > INPUT_MAKE_KEY_MAX) + return; + keycode = linux_input_to_keycode_set1[keycode - INPUT_MAKE_KEY_MIN]; + if (keycode == 0) + return; + ps2_queue(&s->common, 0xe0); + } + ps2_queue(&s->common, keycode | ((!is_down) << 7)); +} + +uint32_t ps2_read_data(void *opaque) +{ + PS2State *s = (PS2State *)opaque; + PS2Queue *q; + int val, index; + + q = &s->queue; + if (q->count == 0) { + /* NOTE: if no data left, we return the last keyboard one + (needed for EMM386) */ + /* XXX: need a timer to do things correctly */ + index = q->rptr - 1; + if (index < 0) + index = PS2_QUEUE_SIZE - 1; + val = q->data[index]; + } else { + val = q->data[q->rptr]; + if (++q->rptr == PS2_QUEUE_SIZE) + q->rptr = 0; + q->count--; + /* reading deasserts IRQ */ + s->update_irq(s->update_arg, 0); + /* reassert IRQs if data left */ + s->update_irq(s->update_arg, q->count != 0); + } + return val; +} + +static void ps2_reset_keyboard(PS2KbdState *s) +{ + s->scan_enabled = 1; +} + +void ps2_write_keyboard(void *opaque, int val) +{ + PS2KbdState *s = (PS2KbdState *)opaque; + + switch(s->common.write_cmd) { + default: + case -1: + switch(val) { + case 0x00: + ps2_queue(&s->common, KBD_REPLY_ACK); + break; + case 0x05: + ps2_queue(&s->common, KBD_REPLY_RESEND); + break; + case KBD_CMD_GET_ID: + ps2_queue(&s->common, KBD_REPLY_ACK); + ps2_queue(&s->common, 0xab); + ps2_queue(&s->common, 0x83); + break; + case KBD_CMD_ECHO: + ps2_queue(&s->common, KBD_CMD_ECHO); + break; + case KBD_CMD_ENABLE: + s->scan_enabled = 1; + ps2_queue(&s->common, KBD_REPLY_ACK); + break; + case KBD_CMD_SET_LEDS: + case KBD_CMD_SET_RATE: + s->common.write_cmd = val; + ps2_queue(&s->common, KBD_REPLY_ACK); + break; + case KBD_CMD_RESET_DISABLE: + ps2_reset_keyboard(s); + s->scan_enabled = 0; + ps2_queue(&s->common, KBD_REPLY_ACK); + break; + case KBD_CMD_RESET_ENABLE: + ps2_reset_keyboard(s); + s->scan_enabled = 1; + ps2_queue(&s->common, KBD_REPLY_ACK); + break; + case KBD_CMD_RESET: + ps2_reset_keyboard(s); + ps2_queue(&s->common, KBD_REPLY_ACK); + ps2_queue(&s->common, KBD_REPLY_POR); + break; + default: + ps2_queue(&s->common, KBD_REPLY_ACK); + break; + } + break; + case KBD_CMD_SET_LEDS: + ps2_queue(&s->common, KBD_REPLY_ACK); + s->common.write_cmd = -1; + break; + case KBD_CMD_SET_RATE: + ps2_queue(&s->common, KBD_REPLY_ACK); + s->common.write_cmd = -1; + break; + } +} + +/* Set the scancode translation mode. + 0 = raw scancodes. + 1 = translated scancodes (used by qemu internally). */ + +void ps2_keyboard_set_translation(void *opaque, int mode) +{ + PS2KbdState *s = (PS2KbdState *)opaque; + s->translate = mode; +} + +static void ps2_mouse_send_packet(PS2MouseState *s) +{ + unsigned int b; + int dx1, dy1, dz1; + + dx1 = s->mouse_dx; + dy1 = s->mouse_dy; + dz1 = s->mouse_dz; + /* XXX: increase range to 8 bits ? */ + if (dx1 > 127) + dx1 = 127; + else if (dx1 < -127) + dx1 = -127; + if (dy1 > 127) + dy1 = 127; + else if (dy1 < -127) + dy1 = -127; + b = 0x08 | ((dx1 < 0) << 4) | ((dy1 < 0) << 5) | (s->mouse_buttons & 0x07); + ps2_queue(&s->common, b); + ps2_queue(&s->common, dx1 & 0xff); + ps2_queue(&s->common, dy1 & 0xff); + /* extra byte for IMPS/2 or IMEX */ + switch(s->mouse_type) { + default: + break; + case 3: + if (dz1 > 127) + dz1 = 127; + else if (dz1 < -127) + dz1 = -127; + ps2_queue(&s->common, dz1 & 0xff); + break; + case 4: + if (dz1 > 7) + dz1 = 7; + else if (dz1 < -7) + dz1 = -7; + b = (dz1 & 0x0f) | ((s->mouse_buttons & 0x18) << 1); + ps2_queue(&s->common, b); + break; + } + + /* update deltas */ + s->mouse_dx -= dx1; + s->mouse_dy -= dy1; + s->mouse_dz -= dz1; +} + +void ps2_mouse_event(PS2MouseState *s, + int dx, int dy, int dz, int buttons_state) +{ + /* check if deltas are recorded when disabled */ + if (!(s->mouse_status & MOUSE_STATUS_ENABLED)) + return; + + s->mouse_dx += dx; + s->mouse_dy -= dy; + s->mouse_dz += dz; + /* XXX: SDL sometimes generates nul events: we delete them */ + if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0 && + s->mouse_buttons == buttons_state) + return; + s->mouse_buttons = buttons_state; + + if (!(s->mouse_status & MOUSE_STATUS_REMOTE) && + (s->common.queue.count < (PS2_QUEUE_SIZE - 16))) { + for(;;) { + /* if not remote, send event. Multiple events are sent if + too big deltas */ + ps2_mouse_send_packet(s); + if (s->mouse_dx == 0 && s->mouse_dy == 0 && s->mouse_dz == 0) + break; + } + } +} + +void ps2_write_mouse(void *opaque, int val) +{ + PS2MouseState *s = (PS2MouseState *)opaque; +#ifdef DEBUG_MOUSE + printf("kbd: write mouse 0x%02x\n", val); +#endif + switch(s->common.write_cmd) { + default: + case -1: + /* mouse command */ + if (s->mouse_wrap) { + if (val == AUX_RESET_WRAP) { + s->mouse_wrap = 0; + ps2_queue(&s->common, AUX_ACK); + return; + } else if (val != AUX_RESET) { + ps2_queue(&s->common, val); + return; + } + } + switch(val) { + case AUX_SET_SCALE11: + s->mouse_status &= ~MOUSE_STATUS_SCALE21; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_SET_SCALE21: + s->mouse_status |= MOUSE_STATUS_SCALE21; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_SET_STREAM: + s->mouse_status &= ~MOUSE_STATUS_REMOTE; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_SET_WRAP: + s->mouse_wrap = 1; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_SET_REMOTE: + s->mouse_status |= MOUSE_STATUS_REMOTE; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_GET_TYPE: + ps2_queue(&s->common, AUX_ACK); + ps2_queue(&s->common, s->mouse_type); + break; + case AUX_SET_RES: + case AUX_SET_SAMPLE: + s->common.write_cmd = val; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_GET_SCALE: + ps2_queue(&s->common, AUX_ACK); + ps2_queue(&s->common, s->mouse_status); + ps2_queue(&s->common, s->mouse_resolution); + ps2_queue(&s->common, s->mouse_sample_rate); + break; + case AUX_POLL: + ps2_queue(&s->common, AUX_ACK); + ps2_mouse_send_packet(s); + break; + case AUX_ENABLE_DEV: + s->mouse_status |= MOUSE_STATUS_ENABLED; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_DISABLE_DEV: + s->mouse_status &= ~MOUSE_STATUS_ENABLED; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_SET_DEFAULT: + s->mouse_sample_rate = 100; + s->mouse_resolution = 2; + s->mouse_status = 0; + ps2_queue(&s->common, AUX_ACK); + break; + case AUX_RESET: + s->mouse_sample_rate = 100; + s->mouse_resolution = 2; + s->mouse_status = 0; + s->mouse_type = 0; + ps2_queue(&s->common, AUX_ACK); + ps2_queue(&s->common, 0xaa); + ps2_queue(&s->common, s->mouse_type); + break; + default: + break; + } + break; + case AUX_SET_SAMPLE: + s->mouse_sample_rate = val; + /* detect IMPS/2 or IMEX */ + switch(s->mouse_detect_state) { + default: + case 0: + if (val == 200) + s->mouse_detect_state = 1; + break; + case 1: + if (val == 100) + s->mouse_detect_state = 2; + else if (val == 200) + s->mouse_detect_state = 3; + else + s->mouse_detect_state = 0; + break; + case 2: + if (val == 80) + s->mouse_type = 3; /* IMPS/2 */ + s->mouse_detect_state = 0; + break; + case 3: + if (val == 80) + s->mouse_type = 4; /* IMEX */ + s->mouse_detect_state = 0; + break; + } + ps2_queue(&s->common, AUX_ACK); + s->common.write_cmd = -1; + break; + case AUX_SET_RES: + s->mouse_resolution = val; + ps2_queue(&s->common, AUX_ACK); + s->common.write_cmd = -1; + break; + } +} + +static void ps2_reset(void *opaque) +{ + PS2State *s = (PS2State *)opaque; + PS2Queue *q; + s->write_cmd = -1; + q = &s->queue; + q->rptr = 0; + q->wptr = 0; + q->count = 0; +} + +PS2KbdState *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg) +{ + PS2KbdState *s = (PS2KbdState *)mallocz(sizeof(PS2KbdState)); + + s->common.update_irq = update_irq; + s->common.update_arg = update_arg; + ps2_reset(&s->common); + return s; +} + +PS2MouseState *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg) +{ + PS2MouseState *s = (PS2MouseState *)mallocz(sizeof(PS2MouseState)); + + s->common.update_irq = update_irq; + s->common.update_arg = update_arg; + ps2_reset(&s->common); + return s; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h new file mode 100644 index 0000000..47bcfe9 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/ps2.h @@ -0,0 +1,34 @@ +/* ps2.c */ +typedef struct PS2MouseState PS2MouseState; +typedef struct PS2KbdState PS2KbdState; + +PS2KbdState *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg); +PS2MouseState *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg); +void ps2_write_mouse(void *, int val); +void ps2_write_keyboard(void *, int val); +uint32_t ps2_read_data(void *); +void ps2_queue(void *, int b); +void ps2_keyboard_set_translation(void *opaque, int mode); + +void ps2_put_keycode(PS2KbdState *s, BOOL is_down, int keycode); +void ps2_mouse_event(PS2MouseState *s, + int dx, int dy, int dz, int buttons_state); + +/* vmmouse.c */ +typedef struct VMMouseState VMMouseState; + +VMMouseState *vmmouse_init(PS2MouseState *ps2_mouse); +BOOL vmmouse_is_absolute(VMMouseState *s); +void vmmouse_send_mouse_event(VMMouseState *s, int x, int y, int dz, + int buttons); +void vmmouse_handler(VMMouseState *s, uint32_t *regs); + +/* pckbd.c */ + +typedef struct KBDState KBDState; + +KBDState *i8042_init(PS2KbdState **pkbd, + PS2MouseState **pmouse, + PhysMemoryMap *port_map, + IRQSignal *kbd_irq, IRQSignal *mouse_irq, + uint32_t io_base); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt b/jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt new file mode 100644 index 0000000..ca72f7d --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/readme.txt @@ -0,0 +1,204 @@ +TinyEMU System Emulator by Fabrice Bellard +========================================== + +1) Features +----------- + +- RISC-V system emulator supporting the RV128IMAFDQC base ISA (user + level ISA version 2.2, priviledged architecture version 1.10) + including: + + - 32/64/128 bit integer registers + - 32/64/128 bit floating point instructions + - Compressed instructions + - dynamic XLEN change + +- x86 system emulator based on KVM + +- VirtIO console, network, block device, input and 9P filesystem + +- Graphical display with SDL + +- JSON configuration file + +- Remote HTTP block device and filesystem + +- small code, easy to modify, no external dependancies + +- Javascript demo version + +2) Installation +--------------- + +- The libraries libcurl, OpenSSL and SDL should be installed. On a Fedora + system you can do it with: + + sudo dnf install openssl-devel libcurl-devel SDL-devel + + It is possible to compile the programs without these libraries by + commenting CONFIG_FS_NET and/or CONFIG_SDL in the Makefile. + +- Edit the Makefile to disable the 128 bit target if you compile on a + 32 bit host (for the 128 bit RISCV target the compiler must support + the __int128 C extension). + +- Use 'make' to compile the binaries. + +- You can optionally install the program to '/usr/local/bin' with: + + make install + +3) Usage +-------- + +3.1 Quick examples +------------------ + +- Use the VM images available from https://bellard.org/jslinux (no + need to download them): + + Terminal: + + ./temu https://bellard.org/jslinux/buildroot-riscv64.cfg + + Graphical (with SDL): + + ./temu https://bellard.org/jslinux/buildroot-x86-xwin.cfg + + ./temu https://bellard.org/jslinux/win2k.cfg + +- Download the example RISC-V Linux image + (diskimage-linux-riscv-yyyy-mm-dd.tar.gz) and use it: + + ./temu root-riscv64.cfg + + ./temu rv128test/rv128test.cfg + +- Access to your local hard disk (/tmp directory) in the guest: + + ./temu root_9p-riscv64.cfg + +then type: +mount -t 9p /dev/root /mnt + +in the guest. The content of the host '/tmp' directory is visible in '/mnt'. + +3.2 Invocation +-------------- + +usage: temu [options] config_file +options are: +-m ram_size set the RAM size in MB +-rw allow write access to the disk image (default=snapshot) +-ctrlc the C-c key stops the emulator instead of being sent to the + emulated software +-append cmdline append cmdline to the kernel command line +-no-accel disable VM acceleration (KVM, x86 machine only) + +Console keys: +Press C-a x to exit the emulator, C-a h to get some help. + +3.3 Network usage +----------------- + +The easiest way is to use the "user" mode network driver. No specific +configuration is necessary. + +TinyEMU also supports a "tap" network driver to redirect the network +traffic from a VirtIO network adapter. + +You can look at the netinit.sh script to create the tap network +interface and to redirect the virtual traffic to Internet thru a +NAT. The exact configuration may depend on the Linux distribution and +local firewall configuration. + +The VM configuration file must include: + +eth0: { driver: "tap", ifname: "tap0" } + +and configure the network in the guest system with: + +ifconfig eth0 192.168.3.2 +route add -net 0.0.0.0 gw 192.168.3.1 eth0 + +3.4 Network filesystem +---------------------- + +TinyEMU supports the VirtIO 9P filesystem to access local or remote +filesystems. For remote filesystems, it does HTTP requests to download +the files. The protocol is compatible with the vfsync utility. In the +"mount" command, "/dev/rootN" must be used as device name where N is +the index of the filesystem. When N=0 it is omitted. + +The build_filelist tool builds the file list from a root directory. A +simple web server is enough to serve the files. + +The '.preload' file gives a list of files to preload when opening a +given file. + +3.5 Network block device +------------------------ + +TinyEMU supports an HTTP block device. The disk image is split into +small files. Use the 'splitimg' utility to generate images. The URL of +the JSON blk.txt file must be provided as disk image filename. + +4) Technical notes +------------------ + +4.1) 128 bit support + +The RISC-V specification does not define all the instruction encodings +for the 128 bit integer and floating point operations. The missing +ones were interpolated from the 32 and 64 ones. + +Unfortunately there is no RISC-V 128 bit toolchain nor OS now +(volunteers for the Linux port ?), so rv128test.bin may be the first +128 bit code for RISC-V ! + +4.2) Floating point emulation + +The floating point emulation is bit exact and supports all the +specified instructions for 32, 64 and 128 bit floating point +numbers. It uses the new SoftFP library. + +4.3) HTIF console + +The standard HTIF console uses registers at variable addresses which +are deduced by loading specific ELF symbols. TinyEMU does not rely on +an ELF loader, so it is much simpler to use registers at fixed +addresses (0x40008000). A small modification was made in the +"riscv-pk" boot loader to support it. The HTIF console is only used to +display boot messages and to power off the virtual system. The OS +should use the VirtIO console. + +4.4) Javascript version + +The Javascript version (JSLinux) can be compiled with Makefile.js and +emscripten. A complete precompiled and preconfigured demo is available +in the jslinux-yyyy-mm-dd.tar.gz archive (read the readme.txt file +inside the archive). + +4.5) x86 emulator + +A small x86 emulator is included. It is not really an emulator because +it uses the Linux KVM API to run the x86 code at near native +performance. The x86 emulator uses the same set of VirtIO devices as +the RISCV emulator and is able to run many operating systems. + +The x86 emulator accepts a Linux kernel image (bzImage). No BIOS image +is necessary. + +The x86 emulator comes from my JS/Linux project (2011) which was one +of the first emulator running Linux fully implemented in +Javascript. It is provided to allow easy access to the x86 images +hosted at https://bellard.org/jslinux . + + +5) License / Credits +-------------------- + +TinyEMU is released under the MIT license. If there is no explicit +license in a file, the license from MIT-LICENSE.txt applies. + +The SLIRP library has its own license (two clause BSD license). diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c new file mode 100644 index 0000000..ba4fa4c --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.c @@ -0,0 +1,1377 @@ +/* + * RISCV CPU emulator + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> + +#include "cutils.h" +#include "iomem.h" +#include "riscv_cpu.h" + +#ifndef MAX_XLEN +#error MAX_XLEN must be defined +#endif +#ifndef CONFIG_RISCV_MAX_XLEN +#error CONFIG_RISCV_MAX_XLEN must be defined +#endif + +//#define DUMP_INVALID_MEM_ACCESS +//#define DUMP_MMU_EXCEPTIONS +//#define DUMP_INTERRUPTS +//#define DUMP_INVALID_CSR +//#define DUMP_EXCEPTIONS +//#define DUMP_CSR +//#define CONFIG_LOGFILE + +#include "riscv_cpu_priv.h" + +#if FLEN > 0 +#include "softfp.h" +#endif + +#ifdef USE_GLOBAL_STATE +static RISCVCPUState riscv_cpu_global_state; +#endif +#ifdef USE_GLOBAL_VARIABLES +#define code_ptr s->__code_ptr +#define code_end s->__code_end +#define code_to_pc_addend s->__code_to_pc_addend +#endif + +#ifdef CONFIG_LOGFILE +static FILE *log_file; + +static void log_vprintf(const char *fmt, va_list ap) +{ + if (!log_file) + log_file = fopen("/tmp/riscemu.log", "wb"); + vfprintf(log_file, fmt, ap); +} +#else +static void log_vprintf(const char *fmt, va_list ap) +{ + vprintf(fmt, ap); +} +#endif + +static void __attribute__((format(printf, 1, 2), unused)) log_printf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + log_vprintf(fmt, ap); + va_end(ap); +} + +#if MAX_XLEN == 128 +static void fprint_target_ulong(FILE *f, target_ulong a) +{ + fprintf(f, "%016" PRIx64 "%016" PRIx64, (uint64_t)(a >> 64), (uint64_t)a); +} +#else +static void fprint_target_ulong(FILE *f, target_ulong a) +{ + fprintf(f, "%" PR_target_ulong, a); +} +#endif + +static void print_target_ulong(target_ulong a) +{ + fprint_target_ulong(stdout, a); +} + +static char *reg_name[32] = { +"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", +"s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", +"a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", +"s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6" +}; + +static void dump_regs(RISCVCPUState *s) +{ + int i, cols; + const char priv_str[4] = "USHM"; + cols = 256 / MAX_XLEN; + printf("pc ="); + print_target_ulong(s->pc); + printf(" "); + for(i = 1; i < 32; i++) { + printf("%-3s=", reg_name[i]); + print_target_ulong(s->reg[i]); + if ((i & (cols - 1)) == (cols - 1)) + printf("\n"); + else + printf(" "); + } + printf("priv=%c", priv_str[s->priv]); + printf(" mstatus="); + print_target_ulong(s->mstatus); + printf(" cycles=%" PRId64, s->insn_counter); + printf("\n"); +#if 1 + printf(" mideleg="); + print_target_ulong(s->mideleg); + printf(" mie="); + print_target_ulong(s->mie); + printf(" mip="); + print_target_ulong(s->mip); + printf("\n"); +#endif +} + +static __attribute__((unused)) void cpu_abort(RISCVCPUState *s) +{ + dump_regs(s); + abort(); +} + +/* addr must be aligned. Only RAM accesses are supported */ +#define PHYS_MEM_READ_WRITE(size, uint_type) \ +static __maybe_unused inline void phys_write_u ## size(RISCVCPUState *s, target_ulong addr,\ + uint_type val) \ +{\ + PhysMemoryRange *pr = get_phys_mem_range(s->mem_map, addr);\ + if (!pr || !pr->is_ram)\ + return;\ + *(uint_type *)(pr->phys_mem + \ + (uintptr_t)(addr - pr->addr)) = val;\ +}\ +\ +static __maybe_unused inline uint_type phys_read_u ## size(RISCVCPUState *s, target_ulong addr) \ +{\ + PhysMemoryRange *pr = get_phys_mem_range(s->mem_map, addr);\ + if (!pr || !pr->is_ram)\ + return 0;\ + return *(uint_type *)(pr->phys_mem + \ + (uintptr_t)(addr - pr->addr)); \ +} + +PHYS_MEM_READ_WRITE(8, uint8_t) +PHYS_MEM_READ_WRITE(32, uint32_t) +PHYS_MEM_READ_WRITE(64, uint64_t) + +#define PTE_V_MASK (1 << 0) +#define PTE_U_MASK (1 << 4) +#define PTE_A_MASK (1 << 6) +#define PTE_D_MASK (1 << 7) + +#define ACCESS_READ 0 +#define ACCESS_WRITE 1 +#define ACCESS_CODE 2 + +/* access = 0: read, 1 = write, 2 = code. Set the exception_pending + field if necessary. return 0 if OK, -1 if translation error */ +static int get_phys_addr(RISCVCPUState *s, + target_ulong *ppaddr, target_ulong vaddr, + int access) +{ + int mode, levels, pte_bits, pte_idx, pte_mask, pte_size_log2, xwr, priv; + int need_write, vaddr_shift, i, pte_addr_bits; + target_ulong pte_addr, pte, vaddr_mask, paddr; + + if ((s->mstatus & MSTATUS_MPRV) && access != ACCESS_CODE) { + /* use previous priviledge */ + priv = (s->mstatus >> MSTATUS_MPP_SHIFT) & 3; + } else { + priv = s->priv; + } + + if (priv == PRV_M) { + if (s->cur_xlen < MAX_XLEN) { + /* truncate virtual address */ + *ppaddr = vaddr & (((target_ulong)1 << s->cur_xlen) - 1); + } else { + *ppaddr = vaddr; + } + return 0; + } +#if MAX_XLEN == 32 + /* 32 bits */ + mode = s->satp >> 31; + if (mode == 0) { + /* bare: no translation */ + *ppaddr = vaddr; + return 0; + } else { + /* sv32 */ + levels = 2; + pte_size_log2 = 2; + pte_addr_bits = 22; + } +#else + mode = (s->satp >> 60) & 0xf; + if (mode == 0) { + /* bare: no translation */ + *ppaddr = vaddr; + return 0; + } else { + /* sv39/sv48 */ + levels = mode - 8 + 3; + pte_size_log2 = 3; + vaddr_shift = MAX_XLEN - (PG_SHIFT + levels * 9); + if ((((target_long)vaddr << vaddr_shift) >> vaddr_shift) != vaddr) + return -1; + pte_addr_bits = 44; + } +#endif + pte_addr = (s->satp & (((target_ulong)1 << pte_addr_bits) - 1)) << PG_SHIFT; + pte_bits = 12 - pte_size_log2; + pte_mask = (1 << pte_bits) - 1; + for(i = 0; i < levels; i++) { + vaddr_shift = PG_SHIFT + pte_bits * (levels - 1 - i); + pte_idx = (vaddr >> vaddr_shift) & pte_mask; + pte_addr += pte_idx << pte_size_log2; + if (pte_size_log2 == 2) + pte = phys_read_u32(s, pte_addr); + else + pte = phys_read_u64(s, pte_addr); + //printf("pte=0x%08" PRIx64 "\n", pte); + if (!(pte & PTE_V_MASK)) + return -1; /* invalid PTE */ + paddr = (pte >> 10) << PG_SHIFT; + xwr = (pte >> 1) & 7; + if (xwr != 0) { + if (xwr == 2 || xwr == 6) + return -1; + /* priviledge check */ + if (priv == PRV_S) { + if ((pte & PTE_U_MASK) && !(s->mstatus & MSTATUS_SUM)) + return -1; + } else { + if (!(pte & PTE_U_MASK)) + return -1; + } + /* protection check */ + /* MXR allows read access to execute-only pages */ + if (s->mstatus & MSTATUS_MXR) + xwr |= (xwr >> 2); + + if (((xwr >> access) & 1) == 0) + return -1; + need_write = !(pte & PTE_A_MASK) || + (!(pte & PTE_D_MASK) && access == ACCESS_WRITE); + pte |= PTE_A_MASK; + if (access == ACCESS_WRITE) + pte |= PTE_D_MASK; + if (need_write) { + if (pte_size_log2 == 2) + phys_write_u32(s, pte_addr, pte); + else + phys_write_u64(s, pte_addr, pte); + } + vaddr_mask = ((target_ulong)1 << vaddr_shift) - 1; + *ppaddr = (vaddr & vaddr_mask) | (paddr & ~vaddr_mask); + return 0; + } else { + pte_addr = paddr; + } + } + return -1; +} + +/* return 0 if OK, != 0 if exception */ +int target_read_slow(RISCVCPUState *s, mem_uint_t *pval, + target_ulong addr, int size_log2) +{ + int size, tlb_idx, err, al; + target_ulong paddr, offset; + uint8_t *ptr; + PhysMemoryRange *pr; + mem_uint_t ret; + + /* first handle unaligned accesses */ + size = 1 << size_log2; + al = addr & (size - 1); + if (al != 0) { + switch(size_log2) { + case 1: + { + uint8_t v0, v1; + err = target_read_u8(s, &v0, addr); + if (err) + return err; + err = target_read_u8(s, &v1, addr + 1); + if (err) + return err; + ret = v0 | (v1 << 8); + } + break; + case 2: + { + uint32_t v0, v1; + addr -= al; + err = target_read_u32(s, &v0, addr); + if (err) + return err; + err = target_read_u32(s, &v1, addr + 4); + if (err) + return err; + ret = (v0 >> (al * 8)) | (v1 << (32 - al * 8)); + } + break; +#if MLEN >= 64 + case 3: + { + uint64_t v0, v1; + addr -= al; + err = target_read_u64(s, &v0, addr); + if (err) + return err; + err = target_read_u64(s, &v1, addr + 8); + if (err) + return err; + ret = (v0 >> (al * 8)) | (v1 << (64 - al * 8)); + } + break; +#endif +#if MLEN >= 128 + case 4: + { + uint128_t v0, v1; + addr -= al; + err = target_read_u128(s, &v0, addr); + if (err) + return err; + err = target_read_u128(s, &v1, addr + 16); + if (err) + return err; + ret = (v0 >> (al * 8)) | (v1 << (128 - al * 8)); + } + break; +#endif + default: + abort(); + } + } else { + if (get_phys_addr(s, &paddr, addr, ACCESS_READ)) { + s->pending_tval = addr; + s->pending_exception = CAUSE_LOAD_PAGE_FAULT; + return -1; + } + pr = get_phys_mem_range(s->mem_map, paddr); + if (!pr) { +#ifdef DUMP_INVALID_MEM_ACCESS + printf("target_read_slow: invalid physical address 0x"); + print_target_ulong(paddr); + printf("\n"); +#endif + return 0; + } else if (pr->is_ram) { + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1); + ptr = pr->phys_mem + (uintptr_t)(paddr - pr->addr); + s->tlb_read[tlb_idx].vaddr = addr & ~PG_MASK; + s->tlb_read[tlb_idx].mem_addend = (uintptr_t)ptr - addr; + switch(size_log2) { + case 0: + ret = *(uint8_t *)ptr; + break; + case 1: + ret = *(uint16_t *)ptr; + break; + case 2: + ret = *(uint32_t *)ptr; + break; +#if MLEN >= 64 + case 3: + ret = *(uint64_t *)ptr; + break; +#endif +#if MLEN >= 128 + case 4: + ret = *(uint128_t *)ptr; + break; +#endif + default: + abort(); + } + } else { + offset = paddr - pr->addr; + if (((pr->devio_flags >> size_log2) & 1) != 0) { + ret = pr->read_func(pr->opaque, offset, size_log2); + } +#if MLEN >= 64 + else if ((pr->devio_flags & DEVIO_SIZE32) && size_log2 == 3) { + /* emulate 64 bit access */ + ret = pr->read_func(pr->opaque, offset, 2); + ret |= (uint64_t)pr->read_func(pr->opaque, offset + 4, 2) << 32; + + } +#endif + else { +#ifdef DUMP_INVALID_MEM_ACCESS + printf("unsupported device read access: addr=0x"); + print_target_ulong(paddr); + printf(" width=%d bits\n", 1 << (3 + size_log2)); +#endif + ret = 0; + } + } + } + *pval = ret; + return 0; +} + +/* return 0 if OK, != 0 if exception */ +int target_write_slow(RISCVCPUState *s, target_ulong addr, + mem_uint_t val, int size_log2) +{ + int size, i, tlb_idx, err; + target_ulong paddr, offset; + uint8_t *ptr; + PhysMemoryRange *pr; + + /* first handle unaligned accesses */ + size = 1 << size_log2; + if ((addr & (size - 1)) != 0) { + /* XXX: should avoid modifying the memory in case of exception */ + for(i = 0; i < size; i++) { + err = target_write_u8(s, addr + i, (val >> (8 * i)) & 0xff); + if (err) + return err; + } + } else { + if (get_phys_addr(s, &paddr, addr, ACCESS_WRITE)) { + s->pending_tval = addr; + s->pending_exception = CAUSE_STORE_PAGE_FAULT; + return -1; + } + pr = get_phys_mem_range(s->mem_map, paddr); + if (!pr) { +#ifdef DUMP_INVALID_MEM_ACCESS + printf("target_write_slow: invalid physical address 0x"); + print_target_ulong(paddr); + printf("\n"); +#endif + } else if (pr->is_ram) { + phys_mem_set_dirty_bit(pr, paddr - pr->addr); + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1); + ptr = pr->phys_mem + (uintptr_t)(paddr - pr->addr); + s->tlb_write[tlb_idx].vaddr = addr & ~PG_MASK; + s->tlb_write[tlb_idx].mem_addend = (uintptr_t)ptr - addr; + switch(size_log2) { + case 0: + *(uint8_t *)ptr = val; + break; + case 1: + *(uint16_t *)ptr = val; + break; + case 2: + *(uint32_t *)ptr = val; + break; +#if MLEN >= 64 + case 3: + *(uint64_t *)ptr = val; + break; +#endif +#if MLEN >= 128 + case 4: + *(uint128_t *)ptr = val; + break; +#endif + default: + abort(); + } + } else { + offset = paddr - pr->addr; + if (((pr->devio_flags >> size_log2) & 1) != 0) { + pr->write_func(pr->opaque, offset, val, size_log2); + } +#if MLEN >= 64 + else if ((pr->devio_flags & DEVIO_SIZE32) && size_log2 == 3) { + /* emulate 64 bit access */ + pr->write_func(pr->opaque, offset, + val & 0xffffffff, 2); + pr->write_func(pr->opaque, offset + 4, + (val >> 32) & 0xffffffff, 2); + } +#endif + else { +#ifdef DUMP_INVALID_MEM_ACCESS + printf("unsupported device write access: addr=0x"); + print_target_ulong(paddr); + printf(" width=%d bits\n", 1 << (3 + size_log2)); +#endif + } + } + } + return 0; +} + +struct __attribute__((packed)) unaligned_u32 { + uint32_t u32; +}; + +/* unaligned access at an address known to be a multiple of 2 */ +static uint32_t get_insn32(uint8_t *ptr) +{ +#if defined(EMSCRIPTEN) + return ((uint16_t *)ptr)[0] | (((uint16_t *)ptr)[1] << 16); +#else + return ((struct unaligned_u32 *)ptr)->u32; +#endif +} + +/* return 0 if OK, != 0 if exception */ +static no_inline __exception int target_read_insn_slow(RISCVCPUState *s, + uint8_t **pptr, + target_ulong addr) +{ + int tlb_idx; + target_ulong paddr; + uint8_t *ptr; + PhysMemoryRange *pr; + + if (get_phys_addr(s, &paddr, addr, ACCESS_CODE)) { + s->pending_tval = addr; + s->pending_exception = CAUSE_FETCH_PAGE_FAULT; + return -1; + } + pr = get_phys_mem_range(s->mem_map, paddr); + if (!pr || !pr->is_ram) { + /* XXX: we only access to execute code from RAM */ + s->pending_tval = addr; + s->pending_exception = CAUSE_FAULT_FETCH; + return -1; + } + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1); + ptr = pr->phys_mem + (uintptr_t)(paddr - pr->addr); + s->tlb_code[tlb_idx].vaddr = addr & ~PG_MASK; + s->tlb_code[tlb_idx].mem_addend = (uintptr_t)ptr - addr; + *pptr = ptr; + return 0; +} + +/* addr must be aligned */ +static inline __exception int target_read_insn_u16(RISCVCPUState *s, uint16_t *pinsn, + target_ulong addr) +{ + uint32_t tlb_idx; + uint8_t *ptr; + + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1); + if (likely(s->tlb_code[tlb_idx].vaddr == (addr & ~PG_MASK))) { + ptr = (uint8_t *)(s->tlb_code[tlb_idx].mem_addend + + (uintptr_t)addr); + } else { + if (target_read_insn_slow(s, &ptr, addr)) + return -1; + } + *pinsn = *(uint16_t *)ptr; + return 0; +} + +static void tlb_init(RISCVCPUState *s) +{ + int i; + + for(i = 0; i < TLB_SIZE; i++) { + s->tlb_read[i].vaddr = -1; + s->tlb_write[i].vaddr = -1; + s->tlb_code[i].vaddr = -1; + } +} + +static void tlb_flush_all(RISCVCPUState *s) +{ + tlb_init(s); +} + +static void tlb_flush_vaddr(RISCVCPUState *s, target_ulong vaddr) +{ + tlb_flush_all(s); +} + +/* XXX: inefficient but not critical as long as it is seldom used */ +static void glue(riscv_cpu_flush_tlb_write_range_ram, + MAX_XLEN)(RISCVCPUState *s, + uint8_t *ram_ptr, size_t ram_size) +{ + uint8_t *ptr, *ram_end; + int i; + + ram_end = ram_ptr + ram_size; + for(i = 0; i < TLB_SIZE; i++) { + if (s->tlb_write[i].vaddr != -1) { + ptr = (uint8_t *)(s->tlb_write[i].mem_addend + + (uintptr_t)s->tlb_write[i].vaddr); + if (ptr >= ram_ptr && ptr < ram_end) { + s->tlb_write[i].vaddr = -1; + } + } + } +} + + +#define SSTATUS_MASK0 (MSTATUS_UIE | MSTATUS_SIE | \ + MSTATUS_UPIE | MSTATUS_SPIE | \ + MSTATUS_SPP | \ + MSTATUS_FS | MSTATUS_XS | \ + MSTATUS_SUM | MSTATUS_MXR) +#if MAX_XLEN >= 64 +#define SSTATUS_MASK (SSTATUS_MASK0 | MSTATUS_UXL_MASK) +#else +#define SSTATUS_MASK SSTATUS_MASK0 +#endif + + +#define MSTATUS_MASK (MSTATUS_UIE | MSTATUS_SIE | MSTATUS_MIE | \ + MSTATUS_UPIE | MSTATUS_SPIE | MSTATUS_MPIE | \ + MSTATUS_SPP | MSTATUS_MPP | \ + MSTATUS_FS | \ + MSTATUS_MPRV | MSTATUS_SUM | MSTATUS_MXR) + +/* cycle and insn counters */ +#define COUNTEREN_MASK ((1 << 0) | (1 << 2)) + +/* return the complete mstatus with the SD bit */ +static target_ulong get_mstatus(RISCVCPUState *s, target_ulong mask) +{ + target_ulong val; + BOOL sd; + val = s->mstatus | (s->fs << MSTATUS_FS_SHIFT); + val &= mask; + sd = ((val & MSTATUS_FS) == MSTATUS_FS) | + ((val & MSTATUS_XS) == MSTATUS_XS); + if (sd) + val |= (target_ulong)1 << (s->cur_xlen - 1); + return val; +} + +static int get_base_from_xlen(int xlen) +{ + if (xlen == 32) + return 1; + else if (xlen == 64) + return 2; + else + return 3; +} + +static void set_mstatus(RISCVCPUState *s, target_ulong val) +{ + target_ulong mod, mask; + + /* flush the TLBs if change of MMU config */ + mod = s->mstatus ^ val; + if ((mod & (MSTATUS_MPRV | MSTATUS_SUM | MSTATUS_MXR)) != 0 || + ((s->mstatus & MSTATUS_MPRV) && (mod & MSTATUS_MPP) != 0)) { + tlb_flush_all(s); + } + s->fs = (val >> MSTATUS_FS_SHIFT) & 3; + + mask = MSTATUS_MASK & ~MSTATUS_FS; +#if MAX_XLEN >= 64 + { + int uxl, sxl; + uxl = (val >> MSTATUS_UXL_SHIFT) & 3; + if (uxl >= 1 && uxl <= get_base_from_xlen(MAX_XLEN)) + mask |= MSTATUS_UXL_MASK; + sxl = (val >> MSTATUS_UXL_SHIFT) & 3; + if (sxl >= 1 && sxl <= get_base_from_xlen(MAX_XLEN)) + mask |= MSTATUS_SXL_MASK; + } +#endif + s->mstatus = (s->mstatus & ~mask) | (val & mask); +} + +/* return -1 if invalid CSR. 0 if OK. 'will_write' indicate that the + csr will be written after (used for CSR access check) */ +static int csr_read(RISCVCPUState *s, target_ulong *pval, uint32_t csr, + BOOL will_write) +{ + target_ulong val; + + if (((csr & 0xc00) == 0xc00) && will_write) + return -1; /* read-only CSR */ + if (s->priv < ((csr >> 8) & 3)) + return -1; /* not enough priviledge */ + + switch(csr) { +#if FLEN > 0 + case 0x001: /* fflags */ + if (s->fs == 0) + return -1; + val = s->fflags; + break; + case 0x002: /* frm */ + if (s->fs == 0) + return -1; + val = s->frm; + break; + case 0x003: + if (s->fs == 0) + return -1; + val = s->fflags | (s->frm << 5); + break; +#endif + case 0xc00: /* ucycle */ + case 0xc02: /* uinstret */ + { + uint32_t counteren; + if (s->priv < PRV_M) { + if (s->priv < PRV_S) + counteren = s->scounteren; + else + counteren = s->mcounteren; + if (((counteren >> (csr & 0x1f)) & 1) == 0) + goto invalid_csr; + } + } + val = (int64_t)s->insn_counter; + break; + case 0xc80: /* mcycleh */ + case 0xc82: /* minstreth */ + if (s->cur_xlen != 32) + goto invalid_csr; + { + uint32_t counteren; + if (s->priv < PRV_M) { + if (s->priv < PRV_S) + counteren = s->scounteren; + else + counteren = s->mcounteren; + if (((counteren >> (csr & 0x1f)) & 1) == 0) + goto invalid_csr; + } + } + val = s->insn_counter >> 32; + break; + + case 0x100: + val = get_mstatus(s, SSTATUS_MASK); + break; + case 0x104: /* sie */ + val = s->mie & s->mideleg; + break; + case 0x105: + val = s->stvec; + break; + case 0x106: + val = s->scounteren; + break; + case 0x140: + val = s->sscratch; + break; + case 0x141: + val = s->sepc; + break; + case 0x142: + val = s->scause; + break; + case 0x143: + val = s->stval; + break; + case 0x144: /* sip */ + val = s->mip & s->mideleg; + break; + case 0x180: + val = s->satp; + break; + case 0x300: + val = get_mstatus(s, (target_ulong)-1); + break; + case 0x301: + val = s->misa; + val |= (target_ulong)s->mxl << (s->cur_xlen - 2); + break; + case 0x302: + val = s->medeleg; + break; + case 0x303: + val = s->mideleg; + break; + case 0x304: + val = s->mie; + break; + case 0x305: + val = s->mtvec; + break; + case 0x306: + val = s->mcounteren; + break; + case 0x340: + val = s->mscratch; + break; + case 0x341: + val = s->mepc; + break; + case 0x342: + val = s->mcause; + break; + case 0x343: + val = s->mtval; + break; + case 0x344: + val = s->mip; + break; + case 0xb00: /* mcycle */ + case 0xb02: /* minstret */ + val = (int64_t)s->insn_counter; + break; + case 0xb80: /* mcycleh */ + case 0xb82: /* minstreth */ + if (s->cur_xlen != 32) + goto invalid_csr; + val = s->insn_counter >> 32; + break; + case 0xf14: + val = s->mhartid; + break; + default: + invalid_csr: +#ifdef DUMP_INVALID_CSR + /* the 'time' counter is usually emulated */ + if (csr != 0xc01 && csr != 0xc81) { + printf("csr_read: invalid CSR=0x%x\n", csr); + } +#endif + *pval = 0; + return -1; + } + *pval = val; + return 0; +} + +#if FLEN > 0 +static void set_frm(RISCVCPUState *s, unsigned int val) +{ + if (val >= 5) + val = 0; + s->frm = val; +} + +/* return -1 if invalid roundind mode */ +static int get_insn_rm(RISCVCPUState *s, unsigned int rm) +{ + if (rm == 7) + return s->frm; + if (rm >= 5) + return -1; + else + return rm; +} +#endif + +/* return -1 if invalid CSR, 0 if OK, 1 if the interpreter loop must be + exited (e.g. XLEN was modified), 2 if TLBs have been flushed. */ +static int csr_write(RISCVCPUState *s, uint32_t csr, target_ulong val) +{ + target_ulong mask; + +#if defined(DUMP_CSR) + printf("csr_write: csr=0x%03x val=0x", csr); + print_target_ulong(val); + printf("\n"); +#endif + switch(csr) { +#if FLEN > 0 + case 0x001: /* fflags */ + s->fflags = val & 0x1f; + s->fs = 3; + break; + case 0x002: /* frm */ + set_frm(s, val & 7); + s->fs = 3; + break; + case 0x003: /* fcsr */ + set_frm(s, (val >> 5) & 7); + s->fflags = val & 0x1f; + s->fs = 3; + break; +#endif + case 0x100: /* sstatus */ + set_mstatus(s, (s->mstatus & ~SSTATUS_MASK) | (val & SSTATUS_MASK)); + break; + case 0x104: /* sie */ + mask = s->mideleg; + s->mie = (s->mie & ~mask) | (val & mask); + break; + case 0x105: + s->stvec = val & ~3; + break; + case 0x106: + s->scounteren = val & COUNTEREN_MASK; + break; + case 0x140: + s->sscratch = val; + break; + case 0x141: + s->sepc = val & ~1; + break; + case 0x142: + s->scause = val; + break; + case 0x143: + s->stval = val; + break; + case 0x144: /* sip */ + mask = s->mideleg; + s->mip = (s->mip & ~mask) | (val & mask); + break; + case 0x180: + /* no ASID implemented */ +#if MAX_XLEN == 32 + { + int new_mode; + new_mode = (val >> 31) & 1; + s->satp = (val & (((target_ulong)1 << 22) - 1)) | + (new_mode << 31); + } +#else + { + int mode, new_mode; + mode = s->satp >> 60; + new_mode = (val >> 60) & 0xf; + if (new_mode == 0 || (new_mode >= 8 && new_mode <= 9)) + mode = new_mode; + s->satp = (val & (((uint64_t)1 << 44) - 1)) | + ((uint64_t)mode << 60); + } +#endif + tlb_flush_all(s); + return 2; + + case 0x300: + set_mstatus(s, val); + break; + case 0x301: /* misa */ +#if MAX_XLEN >= 64 + { + int new_mxl; + new_mxl = (val >> (s->cur_xlen - 2)) & 3; + if (new_mxl >= 1 && new_mxl <= get_base_from_xlen(MAX_XLEN)) { + /* Note: misa is only modified in M level, so cur_xlen + = 2^(mxl + 4) */ + if (s->mxl != new_mxl) { + s->mxl = new_mxl; + s->cur_xlen = 1 << (new_mxl + 4); + return 1; + } + } + } +#endif + break; + case 0x302: + mask = (1 << (CAUSE_STORE_PAGE_FAULT + 1)) - 1; + s->medeleg = (s->medeleg & ~mask) | (val & mask); + break; + case 0x303: + mask = MIP_SSIP | MIP_STIP | MIP_SEIP; + s->mideleg = (s->mideleg & ~mask) | (val & mask); + break; + case 0x304: + mask = MIP_MSIP | MIP_MTIP | MIP_SSIP | MIP_STIP | MIP_SEIP; + s->mie = (s->mie & ~mask) | (val & mask); + break; + case 0x305: + s->mtvec = val & ~3; + break; + case 0x306: + s->mcounteren = val & COUNTEREN_MASK; + break; + case 0x340: + s->mscratch = val; + break; + case 0x341: + s->mepc = val & ~1; + break; + case 0x342: + s->mcause = val; + break; + case 0x343: + s->mtval = val; + break; + case 0x344: + mask = MIP_SSIP | MIP_STIP; + s->mip = (s->mip & ~mask) | (val & mask); + break; + default: +#ifdef DUMP_INVALID_CSR + printf("csr_write: invalid CSR=0x%x\n", csr); +#endif + return -1; + } + return 0; +} + +static void set_priv(RISCVCPUState *s, int priv) +{ + if (s->priv != priv) { + tlb_flush_all(s); +#if MAX_XLEN >= 64 + /* change the current xlen */ + { + int mxl; + if (priv == PRV_S) + mxl = (s->mstatus >> MSTATUS_SXL_SHIFT) & 3; + else if (priv == PRV_U) + mxl = (s->mstatus >> MSTATUS_UXL_SHIFT) & 3; + else + mxl = s->mxl; + s->cur_xlen = 1 << (4 + mxl); + } +#endif + s->priv = priv; + } +} + +static void raise_exception2(RISCVCPUState *s, uint32_t cause, + target_ulong tval) +{ + BOOL deleg; + target_ulong causel; + +#if defined(DUMP_EXCEPTIONS) || defined(DUMP_MMU_EXCEPTIONS) || defined(DUMP_INTERRUPTS) + { + int flag; + flag = 0; +#ifdef DUMP_MMU_EXCEPTIONS + if (cause == CAUSE_FAULT_FETCH || + cause == CAUSE_FAULT_LOAD || + cause == CAUSE_FAULT_STORE || + cause == CAUSE_FETCH_PAGE_FAULT || + cause == CAUSE_LOAD_PAGE_FAULT || + cause == CAUSE_STORE_PAGE_FAULT) + flag = 1; +#endif +#ifdef DUMP_INTERRUPTS + flag |= (cause & CAUSE_INTERRUPT) != 0; +#endif +#ifdef DUMP_EXCEPTIONS + flag = 1; + flag = (cause & CAUSE_INTERRUPT) == 0; + if (cause == CAUSE_SUPERVISOR_ECALL || cause == CAUSE_ILLEGAL_INSTRUCTION) + flag = 0; +#endif + if (flag) { + log_printf("raise_exception: cause=0x%08x tval=0x", cause); +#ifdef CONFIG_LOGFILE + fprint_target_ulong(log_file, tval); +#else + print_target_ulong(tval); +#endif + log_printf("\n"); + dump_regs(s); + } + } +#endif + + if (s->priv <= PRV_S) { + /* delegate the exception to the supervisor priviledge */ + if (cause & CAUSE_INTERRUPT) + deleg = (s->mideleg >> (cause & (MAX_XLEN - 1))) & 1; + else + deleg = (s->medeleg >> cause) & 1; + } else { + deleg = 0; + } + + causel = cause & 0x7fffffff; + if (cause & CAUSE_INTERRUPT) + causel |= (target_ulong)1 << (s->cur_xlen - 1); + + if (deleg) { + s->scause = causel; + s->sepc = s->pc; + s->stval = tval; + s->mstatus = (s->mstatus & ~MSTATUS_SPIE) | + (((s->mstatus >> s->priv) & 1) << MSTATUS_SPIE_SHIFT); + s->mstatus = (s->mstatus & ~MSTATUS_SPP) | + (s->priv << MSTATUS_SPP_SHIFT); + s->mstatus &= ~MSTATUS_SIE; + set_priv(s, PRV_S); + s->pc = s->stvec; + } else { + s->mcause = causel; + s->mepc = s->pc; + s->mtval = tval; + s->mstatus = (s->mstatus & ~MSTATUS_MPIE) | + (((s->mstatus >> s->priv) & 1) << MSTATUS_MPIE_SHIFT); + s->mstatus = (s->mstatus & ~MSTATUS_MPP) | + (s->priv << MSTATUS_MPP_SHIFT); + s->mstatus &= ~MSTATUS_MIE; + set_priv(s, PRV_M); + s->pc = s->mtvec; + } +} + +static void raise_exception(RISCVCPUState *s, uint32_t cause) +{ + raise_exception2(s, cause, 0); +} + +static void handle_sret(RISCVCPUState *s) +{ + int spp, spie; + spp = (s->mstatus >> MSTATUS_SPP_SHIFT) & 1; + /* set the IE state to previous IE state */ + spie = (s->mstatus >> MSTATUS_SPIE_SHIFT) & 1; + s->mstatus = (s->mstatus & ~(1 << spp)) | + (spie << spp); + /* set SPIE to 1 */ + s->mstatus |= MSTATUS_SPIE; + /* set SPP to U */ + s->mstatus &= ~MSTATUS_SPP; + set_priv(s, spp); + s->pc = s->sepc; +} + +static void handle_mret(RISCVCPUState *s) +{ + int mpp, mpie; + mpp = (s->mstatus >> MSTATUS_MPP_SHIFT) & 3; + /* set the IE state to previous IE state */ + mpie = (s->mstatus >> MSTATUS_MPIE_SHIFT) & 1; + s->mstatus = (s->mstatus & ~(1 << mpp)) | + (mpie << mpp); + /* set MPIE to 1 */ + s->mstatus |= MSTATUS_MPIE; + /* set MPP to U */ + s->mstatus &= ~MSTATUS_MPP; + set_priv(s, mpp); + s->pc = s->mepc; +} + +static inline uint32_t get_pending_irq_mask(RISCVCPUState *s) +{ + uint32_t pending_ints, enabled_ints; + + pending_ints = s->mip & s->mie; + if (pending_ints == 0) + return 0; + + enabled_ints = 0; + switch(s->priv) { + case PRV_M: + if (s->mstatus & MSTATUS_MIE) + enabled_ints = ~s->mideleg; + break; + case PRV_S: + enabled_ints = ~s->mideleg; + if (s->mstatus & MSTATUS_SIE) + enabled_ints |= s->mideleg; + break; + default: + case PRV_U: + enabled_ints = -1; + break; + } + return pending_ints & enabled_ints; +} + +static __exception int raise_interrupt(RISCVCPUState *s) +{ + uint32_t mask; + int irq_num; + + mask = get_pending_irq_mask(s); + if (mask == 0) + return 0; + irq_num = ctz32(mask); + raise_exception(s, irq_num | CAUSE_INTERRUPT); + return -1; +} + +static inline int32_t sext(int32_t val, int n) +{ + return (val << (32 - n)) >> (32 - n); +} + +static inline uint32_t get_field1(uint32_t val, int src_pos, + int dst_pos, int dst_pos_max) +{ + int mask; + assert(dst_pos_max >= dst_pos); + mask = ((1 << (dst_pos_max - dst_pos + 1)) - 1) << dst_pos; + if (dst_pos >= src_pos) + return (val << (dst_pos - src_pos)) & mask; + else + return (val >> (src_pos - dst_pos)) & mask; +} + +#define XLEN 32 +#include "riscv_cpu_template.h" + +#if MAX_XLEN >= 64 +#define XLEN 64 +#include "riscv_cpu_template.h" +#endif + +#if MAX_XLEN >= 128 +#define XLEN 128 +#include "riscv_cpu_template.h" +#endif + +static void glue(riscv_cpu_interp, MAX_XLEN)(RISCVCPUState *s, int n_cycles) +{ +#ifdef USE_GLOBAL_STATE + s = &riscv_cpu_global_state; +#endif + uint64_t timeout; + + timeout = s->insn_counter + n_cycles; + while (!s->power_down_flag && + (int)(timeout - s->insn_counter) > 0) { + n_cycles = timeout - s->insn_counter; + switch(s->cur_xlen) { + case 32: + riscv_cpu_interp_x32(s, n_cycles); + break; +#if MAX_XLEN >= 64 + case 64: + riscv_cpu_interp_x64(s, n_cycles); + break; +#endif +#if MAX_XLEN >= 128 + case 128: + riscv_cpu_interp_x128(s, n_cycles); + break; +#endif + default: + abort(); + } + } +} + +/* Note: the value is not accurate when called in riscv_cpu_interp() */ +static uint64_t glue(riscv_cpu_get_cycles, MAX_XLEN)(RISCVCPUState *s) +{ + return s->insn_counter; +} + +static void glue(riscv_cpu_set_mip, MAX_XLEN)(RISCVCPUState *s, uint32_t mask) +{ + s->mip |= mask; + /* exit from power down if an interrupt is pending */ + if (s->power_down_flag && (s->mip & s->mie) != 0) + s->power_down_flag = FALSE; +} + +static void glue(riscv_cpu_reset_mip, MAX_XLEN)(RISCVCPUState *s, uint32_t mask) +{ + s->mip &= ~mask; +} + +static uint32_t glue(riscv_cpu_get_mip, MAX_XLEN)(RISCVCPUState *s) +{ + return s->mip; +} + +static BOOL glue(riscv_cpu_get_power_down, MAX_XLEN)(RISCVCPUState *s) +{ + return s->power_down_flag; +} + +static RISCVCPUState *glue(riscv_cpu_init, MAX_XLEN)(PhysMemoryMap *mem_map) +{ + RISCVCPUState *s; + +#ifdef USE_GLOBAL_STATE + s = &riscv_cpu_global_state; +#else + s = mallocz(sizeof(*s)); +#endif + s->common.class_ptr = &glue(riscv_cpu_class, MAX_XLEN); + s->mem_map = mem_map; + s->pc = 0x1000; + s->priv = PRV_M; + s->cur_xlen = MAX_XLEN; + s->mxl = get_base_from_xlen(MAX_XLEN); + s->mstatus = ((uint64_t)s->mxl << MSTATUS_UXL_SHIFT) | + ((uint64_t)s->mxl << MSTATUS_SXL_SHIFT); + s->misa |= MCPUID_SUPER | MCPUID_USER | MCPUID_I | MCPUID_M | MCPUID_A; +#if FLEN >= 32 + s->misa |= MCPUID_F; +#endif +#if FLEN >= 64 + s->misa |= MCPUID_D; +#endif +#if FLEN >= 128 + s->misa |= MCPUID_Q; +#endif +#ifdef CONFIG_EXT_C + s->misa |= MCPUID_C; +#endif + tlb_init(s); + return s; +} + +static void glue(riscv_cpu_end, MAX_XLEN)(RISCVCPUState *s) +{ +#ifdef USE_GLOBAL_STATE + free(s); +#endif +} + +static uint32_t glue(riscv_cpu_get_misa, MAX_XLEN)(RISCVCPUState *s) +{ + return s->misa; +} + +const RISCVCPUClass glue(riscv_cpu_class, MAX_XLEN) = { + glue(riscv_cpu_init, MAX_XLEN), + glue(riscv_cpu_end, MAX_XLEN), + glue(riscv_cpu_interp, MAX_XLEN), + glue(riscv_cpu_get_cycles, MAX_XLEN), + glue(riscv_cpu_set_mip, MAX_XLEN), + glue(riscv_cpu_reset_mip, MAX_XLEN), + glue(riscv_cpu_get_mip, MAX_XLEN), + glue(riscv_cpu_get_power_down, MAX_XLEN), + glue(riscv_cpu_get_misa, MAX_XLEN), + glue(riscv_cpu_flush_tlb_write_range_ram, MAX_XLEN), +}; + +#if CONFIG_RISCV_MAX_XLEN == MAX_XLEN +RISCVCPUState *riscv_cpu_init(PhysMemoryMap *mem_map, int max_xlen) +{ + const RISCVCPUClass *c; + switch(max_xlen) { + /* with emscripten we compile a single CPU */ +#if defined(EMSCRIPTEN) + case MAX_XLEN: + c = &glue(riscv_cpu_class, MAX_XLEN); + break; +#else + case 32: + c = &riscv_cpu_class32; + break; + case 64: + c = &riscv_cpu_class64; + break; +#if CONFIG_RISCV_MAX_XLEN == 128 + case 128: + c = &riscv_cpu_class128; + break; +#endif +#endif /* !EMSCRIPTEN */ + default: + return NULL; + } + return c->riscv_cpu_init(mem_map); +} +#endif /* CONFIG_RISCV_MAX_XLEN == MAX_XLEN */ + diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h new file mode 100644 index 0000000..6fb8b37 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu.h @@ -0,0 +1,118 @@ +/* + * RISCV CPU emulator + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef RISCV_CPU_H +#define RISCV_CPU_H + +#include <stdlib.h> +#include "cutils.h" +#include "iomem.h" + +#define MIP_USIP (1 << 0) +#define MIP_SSIP (1 << 1) +#define MIP_HSIP (1 << 2) +#define MIP_MSIP (1 << 3) +#define MIP_UTIP (1 << 4) +#define MIP_STIP (1 << 5) +#define MIP_HTIP (1 << 6) +#define MIP_MTIP (1 << 7) +#define MIP_UEIP (1 << 8) +#define MIP_SEIP (1 << 9) +#define MIP_HEIP (1 << 10) +#define MIP_MEIP (1 << 11) + +typedef struct RISCVCPUState RISCVCPUState; + +typedef struct { + RISCVCPUState *(*riscv_cpu_init)(PhysMemoryMap *mem_map); + void (*riscv_cpu_end)(RISCVCPUState *s); + void (*riscv_cpu_interp)(RISCVCPUState *s, int n_cycles); + uint64_t (*riscv_cpu_get_cycles)(RISCVCPUState *s); + void (*riscv_cpu_set_mip)(RISCVCPUState *s, uint32_t mask); + void (*riscv_cpu_reset_mip)(RISCVCPUState *s, uint32_t mask); + uint32_t (*riscv_cpu_get_mip)(RISCVCPUState *s); + BOOL (*riscv_cpu_get_power_down)(RISCVCPUState *s); + uint32_t (*riscv_cpu_get_misa)(RISCVCPUState *s); + void (*riscv_cpu_flush_tlb_write_range_ram)(RISCVCPUState *s, + uint8_t *ram_ptr, size_t ram_size); +} RISCVCPUClass; + +typedef struct { + const RISCVCPUClass *class_ptr; +} RISCVCPUCommonState; + +int riscv_cpu_get_max_xlen(void); + +extern const RISCVCPUClass riscv_cpu_class32; +extern const RISCVCPUClass riscv_cpu_class64; +extern const RISCVCPUClass riscv_cpu_class128; + +RISCVCPUState *riscv_cpu_init(PhysMemoryMap *mem_map, int max_xlen); +static inline void riscv_cpu_end(RISCVCPUState *s) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + c->riscv_cpu_end(s); +} +static inline void riscv_cpu_interp(RISCVCPUState *s, int n_cycles) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + c->riscv_cpu_interp(s, n_cycles); +} +static inline uint64_t riscv_cpu_get_cycles(RISCVCPUState *s) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + return c->riscv_cpu_get_cycles(s); +} +static inline void riscv_cpu_set_mip(RISCVCPUState *s, uint32_t mask) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + c->riscv_cpu_set_mip(s, mask); +} +static inline void riscv_cpu_reset_mip(RISCVCPUState *s, uint32_t mask) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + c->riscv_cpu_reset_mip(s, mask); +} +static inline uint32_t riscv_cpu_get_mip(RISCVCPUState *s) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + return c->riscv_cpu_get_mip(s); +} +static inline BOOL riscv_cpu_get_power_down(RISCVCPUState *s) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + return c->riscv_cpu_get_power_down(s); +} +static inline uint32_t riscv_cpu_get_misa(RISCVCPUState *s) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + return c->riscv_cpu_get_misa(s); +} +static inline void riscv_cpu_flush_tlb_write_range_ram(RISCVCPUState *s, + uint8_t *ram_ptr, size_t ram_size) +{ + const RISCVCPUClass *c = ((RISCVCPUCommonState *)s)->class_ptr; + c->riscv_cpu_flush_tlb_write_range_ram(s, ram_ptr, ram_size); +} + +#endif /* RISCV_CPU_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h new file mode 100644 index 0000000..88d4037 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_fp_template.h @@ -0,0 +1,304 @@ +/* + * RISCV emulator + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#if F_SIZE == 32 +#define OPID 0 +#define F_HIGH F32_HIGH +#elif F_SIZE == 64 +#define OPID 1 +#define F_HIGH F64_HIGH +#elif F_SIZE == 128 +#define OPID 3 +#define F_HIGH 0 +#else +#error unsupported F_SIZE +#endif + +#define FSIGN_MASK glue(FSIGN_MASK, F_SIZE) + + case (0x00 << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + s->fp_reg[rd] = glue(add_sf, F_SIZE)(s->fp_reg[rs1], + s->fp_reg[rs2], + rm, &s->fflags) | F_HIGH; + s->fs = 3; + break; + case (0x01 << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + s->fp_reg[rd] = glue(sub_sf, F_SIZE)(s->fp_reg[rs1], + s->fp_reg[rs2], + rm, &s->fflags) | F_HIGH; + s->fs = 3; + break; + case (0x02 << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + s->fp_reg[rd] = glue(mul_sf, F_SIZE)(s->fp_reg[rs1], + s->fp_reg[rs2], + rm, &s->fflags) | F_HIGH; + s->fs = 3; + break; + case (0x03 << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + s->fp_reg[rd] = glue(div_sf, F_SIZE)(s->fp_reg[rs1], + s->fp_reg[rs2], + rm, &s->fflags) | F_HIGH; + s->fs = 3; + break; + case (0x0b << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0 || rs2 != 0) + goto illegal_insn; + s->fp_reg[rd] = glue(sqrt_sf, F_SIZE)(s->fp_reg[rs1], + rm, &s->fflags) | F_HIGH; + s->fs = 3; + break; + case (0x04 << 2) | OPID: + switch(rm) { + case 0: /* fsgnj */ + s->fp_reg[rd] = (s->fp_reg[rs1] & ~FSIGN_MASK) | + (s->fp_reg[rs2] & FSIGN_MASK); + break; + case 1: /* fsgnjn */ + s->fp_reg[rd] = (s->fp_reg[rs1] & ~FSIGN_MASK) | + ((s->fp_reg[rs2] & FSIGN_MASK) ^ FSIGN_MASK); + break; + case 2: /* fsgnjx */ + s->fp_reg[rd] = s->fp_reg[rs1] ^ + (s->fp_reg[rs2] & FSIGN_MASK); + break; + default: + goto illegal_insn; + } + s->fs = 3; + break; + case (0x05 << 2) | OPID: + switch(rm) { + case 0: /* fmin */ + s->fp_reg[rd] = glue(min_sf, F_SIZE)(s->fp_reg[rs1], + s->fp_reg[rs2], + &s->fflags, + FMINMAX_IEEE754_201X) | F_HIGH; + break; + case 1: /* fmax */ + s->fp_reg[rd] = glue(max_sf, F_SIZE)(s->fp_reg[rs1], + s->fp_reg[rs2], + &s->fflags, + FMINMAX_IEEE754_201X) | F_HIGH; + break; + default: + goto illegal_insn; + } + s->fs = 3; + break; + case (0x18 << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + switch(rs2) { + case 0: /* fcvt.w.[sdq] */ + val = (int32_t)glue(glue(cvt_sf, F_SIZE), _i32)(s->fp_reg[rs1], rm, + &s->fflags); + break; + case 1: /* fcvt.wu.[sdq] */ + val = (int32_t)glue(glue(cvt_sf, F_SIZE), _u32)(s->fp_reg[rs1], rm, + &s->fflags); + break; +#if XLEN >= 64 + case 2: /* fcvt.l.[sdq] */ + val = (int64_t)glue(glue(cvt_sf, F_SIZE), _i64)(s->fp_reg[rs1], rm, + &s->fflags); + break; + case 3: /* fcvt.lu.[sdq] */ + val = (int64_t)glue(glue(cvt_sf, F_SIZE), _u64)(s->fp_reg[rs1], rm, + &s->fflags); + break; +#endif +#if XLEN >= 128 + /* XXX: the index is not defined in the spec */ + case 4: /* fcvt.t.[sdq] */ + val = glue(glue(cvt_sf, F_SIZE), _i128)(s->fp_reg[rs1], rm, + &s->fflags); + break; + case 5: /* fcvt.tu.[sdq] */ + val = glue(glue(cvt_sf, F_SIZE), _u128)(s->fp_reg[rs1], rm, + &s->fflags); + break; +#endif + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + break; + case (0x14 << 2) | OPID: + switch(rm) { + case 0: /* fle */ + val = glue(le_sf, F_SIZE)(s->fp_reg[rs1], s->fp_reg[rs2], + &s->fflags); + break; + case 1: /* flt */ + val = glue(lt_sf, F_SIZE)(s->fp_reg[rs1], s->fp_reg[rs2], + &s->fflags); + break; + case 2: /* feq */ + val = glue(eq_quiet_sf, F_SIZE)(s->fp_reg[rs1], s->fp_reg[rs2], + &s->fflags); + break; + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + break; + case (0x1a << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + switch(rs2) { + case 0: /* fcvt.[sdq].w */ + s->fp_reg[rd] = glue(cvt_i32_sf, F_SIZE)(s->reg[rs1], rm, + &s->fflags) | F_HIGH; + break; + case 1: /* fcvt.[sdq].wu */ + s->fp_reg[rd] = glue(cvt_u32_sf, F_SIZE)(s->reg[rs1], rm, + &s->fflags) | F_HIGH; + break; +#if XLEN >= 64 + case 2: /* fcvt.[sdq].l */ + s->fp_reg[rd] = glue(cvt_i64_sf, F_SIZE)(s->reg[rs1], rm, + &s->fflags) | F_HIGH; + break; + case 3: /* fcvt.[sdq].lu */ + s->fp_reg[rd] = glue(cvt_u64_sf, F_SIZE)(s->reg[rs1], rm, + &s->fflags) | F_HIGH; + break; +#endif +#if XLEN >= 128 + /* XXX: the index is not defined in the spec */ + case 4: /* fcvt.[sdq].t */ + s->fp_reg[rd] = glue(cvt_i128_sf, F_SIZE)(s->reg[rs1], rm, + &s->fflags) | F_HIGH; + break; + case 5: /* fcvt.[sdq].tu */ + s->fp_reg[rd] = glue(cvt_u128_sf, F_SIZE)(s->reg[rs1], rm, + &s->fflags) | F_HIGH; + break; +#endif + default: + goto illegal_insn; + } + s->fs = 3; + break; + + case (0x08 << 2) | OPID: + rm = get_insn_rm(s, rm); + if (rm < 0) + goto illegal_insn; + switch(rs2) { +#if F_SIZE == 32 && FLEN >= 64 + case 1: /* cvt.s.d */ + s->fp_reg[rd] = cvt_sf64_sf32(s->fp_reg[rs1], rm, &s->fflags) | F32_HIGH; + break; +#if FLEN >= 128 + case 3: /* cvt.s.q */ + s->fp_reg[rd] = cvt_sf128_sf32(s->fp_reg[rs1], rm, &s->fflags) | F32_HIGH; + break; +#endif +#endif /* F_SIZE == 32 */ +#if F_SIZE == 64 + case 0: /* cvt.d.s */ + s->fp_reg[rd] = cvt_sf32_sf64(s->fp_reg[rs1], &s->fflags) | F64_HIGH; + break; +#if FLEN >= 128 + case 1: /* cvt.d.q */ + s->fp_reg[rd] = cvt_sf128_sf64(s->fp_reg[rs1], rm, &s->fflags) | F64_HIGH; + break; +#endif +#endif /* F_SIZE == 64 */ +#if F_SIZE == 128 + case 0: /* cvt.q.s */ + s->fp_reg[rd] = cvt_sf32_sf128(s->fp_reg[rs1], &s->fflags); + break; + case 1: /* cvt.q.d */ + s->fp_reg[rd] = cvt_sf64_sf128(s->fp_reg[rs1], &s->fflags); + break; +#endif /* F_SIZE == 128 */ + + default: + goto illegal_insn; + } + s->fs = 3; + break; + + case (0x1c << 2) | OPID: + if (rs2 != 0) + goto illegal_insn; + switch(rm) { +#if F_SIZE <= XLEN + case 0: /* fmv.x.s */ +#if F_SIZE == 32 + val = (int32_t)s->fp_reg[rs1]; +#elif F_SIZE == 64 + val = (int64_t)s->fp_reg[rs1]; +#else + val = (int128_t)s->fp_reg[rs1]; +#endif + break; +#endif /* F_SIZE <= XLEN */ + case 1: /* fclass */ + val = glue(fclass_sf, F_SIZE)(s->fp_reg[rs1]); + break; + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + break; + +#if F_SIZE <= XLEN + case (0x1e << 2) | OPID: /* fmv.s.x */ + if (rs2 != 0 || rm != 0) + goto illegal_insn; +#if F_SIZE == 32 + s->fp_reg[rd] = (int32_t)s->reg[rs1]; +#elif F_SIZE == 64 + s->fp_reg[rd] = (int64_t)s->reg[rs1]; +#else + s->fp_reg[rd] = (int128_t)s->reg[rs1]; +#endif + s->fs = 3; + break; +#endif /* F_SIZE <= XLEN */ + +#undef F_SIZE +#undef F_HIGH +#undef OPID +#undef FSIGN_MASK diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h new file mode 100644 index 0000000..983d8b8 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_priv.h @@ -0,0 +1,293 @@ +/* + * RISCV CPU emulator private definitions + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef RISCV_CPU_PRIV_H +#define RISCV_CPU_PRIV_H + +#include "riscv_cpu.h" +#include "cutils.h" + +#define __exception __attribute__((warn_unused_result)) + +#ifndef FLEN +#if MAX_XLEN == 128 +#define FLEN 128 +#else +#define FLEN 64 +#endif +#endif /* !FLEN */ + +#define CONFIG_EXT_C /* compressed instructions */ + +#if defined(EMSCRIPTEN) +#define USE_GLOBAL_STATE +/* use local variables slows down the generated JS code */ +#define USE_GLOBAL_VARIABLES +#endif + +#if MAX_XLEN == 32 +typedef uint32_t target_ulong; +typedef int32_t target_long; +#define PR_target_ulong "08x" +#elif MAX_XLEN == 64 +typedef uint64_t target_ulong; +typedef int64_t target_long; +#define PR_target_ulong "016" PRIx64 +#elif MAX_XLEN == 128 +typedef uint128_t target_ulong; +typedef int128_t target_long; +#define PR_target_ulong "016" PRIx64 /* XXX */ +#else +#error unsupported MAX_XLEN +#endif + +/* FLEN is the floating point register width */ +#if FLEN > 0 +#if FLEN == 32 +typedef uint32_t fp_uint; +#define F32_HIGH 0 +#elif FLEN == 64 +typedef uint64_t fp_uint; +#define F32_HIGH ((fp_uint)-1 << 32) +#define F64_HIGH 0 +#elif FLEN == 128 +typedef uint128_t fp_uint; +#define F32_HIGH ((fp_uint)-1 << 32) +#define F64_HIGH ((fp_uint)-1 << 64) +#else +#error unsupported FLEN +#endif +#endif + +/* MLEN is the maximum memory access width */ +#if MAX_XLEN <= 32 && FLEN <= 32 +#define MLEN 32 +#elif MAX_XLEN <= 64 && FLEN <= 64 +#define MLEN 64 +#else +#define MLEN 128 +#endif + +#if MLEN == 32 +typedef uint32_t mem_uint_t; +#elif MLEN == 64 +typedef uint64_t mem_uint_t; +#elif MLEN == 128 +typedef uint128_t mem_uint_t; +#else +#unsupported MLEN +#endif + +#define TLB_SIZE 256 + +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FAULT_FETCH 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_FAULT_LOAD 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_FAULT_STORE 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb +#define CAUSE_FETCH_PAGE_FAULT 0xc +#define CAUSE_LOAD_PAGE_FAULT 0xd +#define CAUSE_STORE_PAGE_FAULT 0xf + +/* Note: converted to correct bit position at runtime */ +#define CAUSE_INTERRUPT ((uint32_t)1 << 31) + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +/* misa CSR */ +#define MCPUID_SUPER (1 << ('S' - 'A')) +#define MCPUID_USER (1 << ('U' - 'A')) +#define MCPUID_I (1 << ('I' - 'A')) +#define MCPUID_M (1 << ('M' - 'A')) +#define MCPUID_A (1 << ('A' - 'A')) +#define MCPUID_F (1 << ('F' - 'A')) +#define MCPUID_D (1 << ('D' - 'A')) +#define MCPUID_Q (1 << ('Q' - 'A')) +#define MCPUID_C (1 << ('C' - 'A')) + +/* mstatus CSR */ + +#define MSTATUS_SPIE_SHIFT 5 +#define MSTATUS_MPIE_SHIFT 7 +#define MSTATUS_SPP_SHIFT 8 +#define MSTATUS_MPP_SHIFT 11 +#define MSTATUS_FS_SHIFT 13 +#define MSTATUS_UXL_SHIFT 32 +#define MSTATUS_SXL_SHIFT 34 + +#define MSTATUS_UIE (1 << 0) +#define MSTATUS_SIE (1 << 1) +#define MSTATUS_HIE (1 << 2) +#define MSTATUS_MIE (1 << 3) +#define MSTATUS_UPIE (1 << 4) +#define MSTATUS_SPIE (1 << MSTATUS_SPIE_SHIFT) +#define MSTATUS_HPIE (1 << 6) +#define MSTATUS_MPIE (1 << MSTATUS_MPIE_SHIFT) +#define MSTATUS_SPP (1 << MSTATUS_SPP_SHIFT) +#define MSTATUS_HPP (3 << 9) +#define MSTATUS_MPP (3 << MSTATUS_MPP_SHIFT) +#define MSTATUS_FS (3 << MSTATUS_FS_SHIFT) +#define MSTATUS_XS (3 << 15) +#define MSTATUS_MPRV (1 << 17) +#define MSTATUS_SUM (1 << 18) +#define MSTATUS_MXR (1 << 19) +//#define MSTATUS_TVM (1 << 20) +//#define MSTATUS_TW (1 << 21) +//#define MSTATUS_TSR (1 << 22) +#define MSTATUS_UXL_MASK ((uint64_t)3 << MSTATUS_UXL_SHIFT) +#define MSTATUS_SXL_MASK ((uint64_t)3 << MSTATUS_SXL_SHIFT) + +#define PG_SHIFT 12 +#define PG_MASK ((1 << PG_SHIFT) - 1) + +typedef struct { + target_ulong vaddr; + uintptr_t mem_addend; +} TLBEntry; + +struct RISCVCPUState { + RISCVCPUCommonState common; /* must be first */ + + target_ulong pc; + target_ulong reg[32]; + +#ifdef USE_GLOBAL_VARIABLES + /* faster to use global variables with emscripten */ + uint8_t *__code_ptr, *__code_end; + target_ulong __code_to_pc_addend; +#endif + +#if FLEN > 0 + fp_uint fp_reg[32]; + uint32_t fflags; + uint8_t frm; +#endif + + uint8_t cur_xlen; /* current XLEN value, <= MAX_XLEN */ + uint8_t priv; /* see PRV_x */ + uint8_t fs; /* MSTATUS_FS value */ + uint8_t mxl; /* MXL field in MISA register */ + + int32_t n_cycles; /* only used inside the CPU loop */ + uint64_t insn_counter; + BOOL power_down_flag; + int pending_exception; /* used during MMU exception handling */ + target_ulong pending_tval; + + /* CSRs */ + target_ulong mstatus; + target_ulong mtvec; + target_ulong mscratch; + target_ulong mepc; + target_ulong mcause; + target_ulong mtval; + target_ulong mhartid; /* ro */ + uint32_t misa; + uint32_t mie; + uint32_t mip; + uint32_t medeleg; + uint32_t mideleg; + uint32_t mcounteren; + + target_ulong stvec; + target_ulong sscratch; + target_ulong sepc; + target_ulong scause; + target_ulong stval; +#if MAX_XLEN == 32 + uint32_t satp; +#else + uint64_t satp; /* currently 64 bit physical addresses max */ +#endif + uint32_t scounteren; + + target_ulong load_res; /* for atomic LR/SC */ + + PhysMemoryMap *mem_map; + + TLBEntry tlb_read[TLB_SIZE]; + TLBEntry tlb_write[TLB_SIZE]; + TLBEntry tlb_code[TLB_SIZE]; +}; + +#define target_read_slow glue(glue(riscv, MAX_XLEN), _read_slow) +#define target_write_slow glue(glue(riscv, MAX_XLEN), _write_slow) + +DLL_PUBLIC int target_read_slow(RISCVCPUState *s, mem_uint_t *pval, + target_ulong addr, int size_log2); +DLL_PUBLIC int target_write_slow(RISCVCPUState *s, target_ulong addr, + mem_uint_t val, int size_log2); + +/* return 0 if OK, != 0 if exception */ +#define TARGET_READ_WRITE(size, uint_type, size_log2) \ +static inline __exception int target_read_u ## size(RISCVCPUState *s, uint_type *pval, target_ulong addr) \ +{\ + uint32_t tlb_idx;\ + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);\ + if (likely(s->tlb_read[tlb_idx].vaddr == (addr & ~(PG_MASK & ~((size / 8) - 1))))) { \ + *pval = *(uint_type *)(s->tlb_read[tlb_idx].mem_addend + (uintptr_t)addr);\ + } else {\ + mem_uint_t val;\ + int ret;\ + ret = target_read_slow(s, &val, addr, size_log2);\ + if (ret)\ + return ret;\ + *pval = val;\ + }\ + return 0;\ +}\ +\ +static inline __exception int target_write_u ## size(RISCVCPUState *s, target_ulong addr,\ + uint_type val) \ +{\ + uint32_t tlb_idx;\ + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1);\ + if (likely(s->tlb_write[tlb_idx].vaddr == (addr & ~(PG_MASK & ~((size / 8) - 1))))) { \ + *(uint_type *)(s->tlb_write[tlb_idx].mem_addend + (uintptr_t)addr) = val;\ + return 0;\ + } else {\ + return target_write_slow(s, addr, val, size_log2);\ + }\ +} + +TARGET_READ_WRITE(8, uint8_t, 0) +TARGET_READ_WRITE(16, uint16_t, 1) +TARGET_READ_WRITE(32, uint32_t, 2) +#if MLEN >= 64 +TARGET_READ_WRITE(64, uint64_t, 3) +#endif +#if MLEN >= 128 +TARGET_READ_WRITE(128, uint128_t, 4) +#endif + +#endif /* RISCV_CPU_PRIV_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h new file mode 100644 index 0000000..5092062 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_cpu_template.h @@ -0,0 +1,1739 @@ +/* + * RISCV emulator + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#if XLEN == 32 +#define uintx_t uint32_t +#define intx_t int32_t +#elif XLEN == 64 +#define uintx_t uint64_t +#define intx_t int64_t +#elif XLEN == 128 +#define uintx_t uint128_t +#define intx_t int128_t +#else +#error unsupported XLEN +#endif + +static inline intx_t glue(div, XLEN)(intx_t a, intx_t b) +{ + if (b == 0) { + return -1; + } else if (a == ((intx_t)1 << (XLEN - 1)) && b == -1) { + return a; + } else { + return a / b; + } +} + +static inline uintx_t glue(divu, XLEN)(uintx_t a, uintx_t b) +{ + if (b == 0) { + return -1; + } else { + return a / b; + } +} + +static inline intx_t glue(rem, XLEN)(intx_t a, intx_t b) +{ + if (b == 0) { + return a; + } else if (a == ((intx_t)1 << (XLEN - 1)) && b == -1) { + return 0; + } else { + return a % b; + } +} + +static inline uintx_t glue(remu, XLEN)(uintx_t a, uintx_t b) +{ + if (b == 0) { + return a; + } else { + return a % b; + } +} + +#if XLEN == 32 + +static inline uint32_t mulh32(int32_t a, int32_t b) +{ + return ((int64_t)a * (int64_t)b) >> 32; +} + +static inline uint32_t mulhsu32(int32_t a, uint32_t b) +{ + return ((int64_t)a * (int64_t)b) >> 32; +} + +static inline uint32_t mulhu32(uint32_t a, uint32_t b) +{ + return ((int64_t)a * (int64_t)b) >> 32; +} + +#elif XLEN == 64 && defined(HAVE_INT128) + +static inline uint64_t mulh64(int64_t a, int64_t b) +{ + return ((int128_t)a * (int128_t)b) >> 64; +} + +static inline uint64_t mulhsu64(int64_t a, uint64_t b) +{ + return ((int128_t)a * (int128_t)b) >> 64; +} + +static inline uint64_t mulhu64(uint64_t a, uint64_t b) +{ + return ((int128_t)a * (int128_t)b) >> 64; +} + +#else + +#if XLEN == 64 +#define UHALF uint32_t +#define UHALF_LEN 32 +#elif XLEN == 128 +#define UHALF uint64_t +#define UHALF_LEN 64 +#else +#error unsupported XLEN +#endif + +static uintx_t glue(mulhu, XLEN)(uintx_t a, uintx_t b) +{ + UHALF a0, a1, b0, b1, r2, r3; + uintx_t r00, r01, r10, r11, c; + a0 = a; + a1 = a >> UHALF_LEN; + b0 = b; + b1 = b >> UHALF_LEN; + + r00 = (uintx_t)a0 * (uintx_t)b0; + r01 = (uintx_t)a0 * (uintx_t)b1; + r10 = (uintx_t)a1 * (uintx_t)b0; + r11 = (uintx_t)a1 * (uintx_t)b1; + + // r0 = r00; + c = (r00 >> UHALF_LEN) + (UHALF)r01 + (UHALF)r10; + // r1 = c; + c = (c >> UHALF_LEN) + (r01 >> UHALF_LEN) + (r10 >> UHALF_LEN) + (UHALF)r11; + r2 = c; + r3 = (c >> UHALF_LEN) + (r11 >> UHALF_LEN); + + // *plow = ((uintx_t)r1 << UHALF_LEN) | r0; + return ((uintx_t)r3 << UHALF_LEN) | r2; +} + +#undef UHALF + +static inline uintx_t glue(mulh, XLEN)(intx_t a, intx_t b) +{ + uintx_t r1; + r1 = glue(mulhu, XLEN)(a, b); + if (a < 0) + r1 -= a; + if (b < 0) + r1 -= b; + return r1; +} + +static inline uintx_t glue(mulhsu, XLEN)(intx_t a, uintx_t b) +{ + uintx_t r1; + r1 = glue(mulhu, XLEN)(a, b); + if (a < 0) + r1 -= a; + return r1; +} + +#endif + +#define DUP2(F, n) F(n) F(n+1) +#define DUP4(F, n) DUP2(F, n) DUP2(F, n + 2) +#define DUP8(F, n) DUP4(F, n) DUP4(F, n + 4) +#define DUP16(F, n) DUP8(F, n) DUP8(F, n + 8) +#define DUP32(F, n) DUP16(F, n) DUP16(F, n + 16) + +#define C_QUADRANT(n) \ + case n+(0 << 2): case n+(1 << 2): case n+(2 << 2): case n+(3 << 2): \ + case n+(4 << 2): case n+(5 << 2): case n+(6 << 2): case n+(7 << 2): \ + case n+(8 << 2): case n+(9 << 2): case n+(10 << 2): case n+(11 << 2): \ + case n+(12 << 2): case n+(13 << 2): case n+(14 << 2): case n+(15 << 2): \ + case n+(16 << 2): case n+(17 << 2): case n+(18 << 2): case n+(19 << 2): \ + case n+(20 << 2): case n+(21 << 2): case n+(22 << 2): case n+(23 << 2): \ + case n+(24 << 2): case n+(25 << 2): case n+(26 << 2): case n+(27 << 2): \ + case n+(28 << 2): case n+(29 << 2): case n+(30 << 2): case n+(31 << 2): + +#define GET_PC() (target_ulong)((uintptr_t)code_ptr + code_to_pc_addend) +#define GET_INSN_COUNTER() (insn_counter_addend - s->n_cycles) + +#define C_NEXT_INSN code_ptr += 2; break +#define NEXT_INSN code_ptr += 4; break +#define JUMP_INSN do { \ + code_ptr = NULL; \ + code_end = NULL; \ + code_to_pc_addend = s->pc; \ + goto jump_insn; \ + } while (0) + +static void no_inline glue(riscv_cpu_interp_x, XLEN)(RISCVCPUState *s, + int n_cycles1) +{ + uint32_t opcode, insn, rd, rs1, rs2, funct3; + int32_t imm, cond, err; + target_ulong addr, val, val2; +#ifndef USE_GLOBAL_VARIABLES + uint8_t *code_ptr, *code_end; + target_ulong code_to_pc_addend; +#endif + uint64_t insn_counter_addend; +#if FLEN > 0 + uint32_t rs3; + int32_t rm; +#endif + + if (n_cycles1 == 0) + return; + insn_counter_addend = s->insn_counter + n_cycles1; + s->n_cycles = n_cycles1; + + /* check pending interrupts */ + if (unlikely((s->mip & s->mie) != 0)) { + if (raise_interrupt(s)) { + s->n_cycles--; + goto done_interp; + } + } + + s->pending_exception = -1; + /* Note: we assume NULL is represented as a zero number */ + code_ptr = NULL; + code_end = NULL; + code_to_pc_addend = s->pc; + + /* we use a single execution loop to keep a simple control flow + for emscripten */ + for(;;) { + if (unlikely(code_ptr >= code_end)) { + uint32_t tlb_idx; + uint16_t insn_high; + target_ulong addr; + uint8_t *ptr; + + s->pc = GET_PC(); + /* we test n_cycles only between blocks so that timer + interrupts only happen between the blocks. It is + important to reduce the translated code size. */ + if (unlikely(s->n_cycles <= 0)) + goto the_end; + + /* check pending interrupts */ + if (unlikely((s->mip & s->mie) != 0)) { + if (raise_interrupt(s)) { + s->n_cycles--; + goto the_end; + } + } + + addr = s->pc; + tlb_idx = (addr >> PG_SHIFT) & (TLB_SIZE - 1); + if (likely(s->tlb_code[tlb_idx].vaddr == (addr & ~PG_MASK))) { + /* TLB match */ + ptr = (uint8_t *)(s->tlb_code[tlb_idx].mem_addend + + (uintptr_t)addr); + } else { + if (unlikely(target_read_insn_slow(s, &ptr, addr))) + goto mmu_exception; + } + code_ptr = ptr; + code_end = ptr + (PG_MASK - 1 - (addr & PG_MASK)); + code_to_pc_addend = addr - (uintptr_t)code_ptr; + if (unlikely(code_ptr >= code_end)) { + /* instruction is potentially half way between two + pages ? */ + insn = *(uint16_t *)code_ptr; + if ((insn & 3) == 3) { + /* instruction is half way between two pages */ + if (unlikely(target_read_insn_u16(s, &insn_high, addr + 2))) + goto mmu_exception; + insn |= insn_high << 16; + } + } else { + insn = get_insn32(code_ptr); + } + } else { + /* fast path */ + insn = get_insn32(code_ptr); + } + s->n_cycles--; +#if 0 + if (1) { +#ifdef CONFIG_LOGFILE + log_printf("pc=0x"); fprint_target_ulong(log_file, GET_PC()); log_printf(" insn=%08x\n", insn); + fflush(log_file); +#else + printf("pc=0x"); print_target_ulong(GET_PC()); printf(" insn=%08x\n", insn); + // dump_regs(s); +#endif + } +#endif + opcode = insn & 0x7f; + rd = (insn >> 7) & 0x1f; + rs1 = (insn >> 15) & 0x1f; + rs2 = (insn >> 20) & 0x1f; + switch(opcode) { +#ifdef CONFIG_EXT_C + C_QUADRANT(0) + funct3 = (insn >> 13) & 7; + rd = ((insn >> 2) & 7) | 8; + switch(funct3) { + case 0: /* c.addi4spn */ + imm = get_field1(insn, 11, 4, 5) | + get_field1(insn, 7, 6, 9) | + get_field1(insn, 6, 2, 2) | + get_field1(insn, 5, 3, 3); + if (imm == 0) + goto illegal_insn; + s->reg[rd] = (intx_t)(s->reg[2] + imm); + break; +#if XLEN >= 128 + case 1: /* c.lq */ + imm = get_field1(insn, 11, 4, 5) | + get_field1(insn, 10, 8, 8) | + get_field1(insn, 5, 6, 7); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_read_u128(s, &val, addr)) + goto mmu_exception; + s->reg[rd] = val; + break; +#elif FLEN >= 64 + case 1: /* c.fld */ + { + uint64_t rval; + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 5, 6, 7); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval | F64_HIGH; + s->fs = 3; + } + break; +#endif + case 2: /* c.lw */ + { + uint32_t rval; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 6, 2, 2) | + get_field1(insn, 5, 6, 6); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + s->reg[rd] = (int32_t)rval; + } + break; +#if XLEN >= 64 + case 3: /* c.ld */ + { + uint64_t rval; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 5, 6, 7); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + s->reg[rd] = (int64_t)rval; + } + break; +#elif FLEN >= 32 + case 3: /* c.flw */ + { + uint32_t rval; + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 6, 2, 2) | + get_field1(insn, 5, 6, 6); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval | F32_HIGH; + s->fs = 3; + } + break; +#endif +#if XLEN >= 128 + case 5: /* c.sq */ + imm = get_field1(insn, 11, 4, 5) | + get_field1(insn, 10, 8, 8) | + get_field1(insn, 5, 6, 7); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + val = s->reg[rd]; + if (target_write_u128(s, addr, val)) + goto mmu_exception; + break; +#elif FLEN >= 64 + case 5: /* c.fsd */ + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 5, 6, 7); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_write_u64(s, addr, s->fp_reg[rd])) + goto mmu_exception; + break; +#endif + case 6: /* c.sw */ + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 6, 2, 2) | + get_field1(insn, 5, 6, 6); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + val = s->reg[rd]; + if (target_write_u32(s, addr, val)) + goto mmu_exception; + break; +#if XLEN >= 64 + case 7: /* c.sd */ + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 5, 6, 7); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + val = s->reg[rd]; + if (target_write_u64(s, addr, val)) + goto mmu_exception; + break; +#elif FLEN >= 32 + case 7: /* c.fsw */ + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 6, 2, 2) | + get_field1(insn, 5, 6, 6); + rs1 = ((insn >> 7) & 7) | 8; + addr = (intx_t)(s->reg[rs1] + imm); + if (target_write_u32(s, addr, s->fp_reg[rd])) + goto mmu_exception; + break; +#endif + default: + goto illegal_insn; + } + C_NEXT_INSN; + C_QUADRANT(1) + funct3 = (insn >> 13) & 7; + switch(funct3) { + case 0: /* c.addi/c.nop */ + if (rd != 0) { + imm = sext(get_field1(insn, 12, 5, 5) | + get_field1(insn, 2, 0, 4), 6); + s->reg[rd] = (intx_t)(s->reg[rd] + imm); + } + break; +#if XLEN == 32 + case 1: /* c.jal */ + imm = sext(get_field1(insn, 12, 11, 11) | + get_field1(insn, 11, 4, 4) | + get_field1(insn, 9, 8, 9) | + get_field1(insn, 8, 10, 10) | + get_field1(insn, 7, 6, 6) | + get_field1(insn, 6, 7, 7) | + get_field1(insn, 3, 1, 3) | + get_field1(insn, 2, 5, 5), 12); + s->reg[1] = GET_PC() + 2; + s->pc = (intx_t)(GET_PC() + imm); + JUMP_INSN; +#else + case 1: /* c.addiw */ + if (rd != 0) { + imm = sext(get_field1(insn, 12, 5, 5) | + get_field1(insn, 2, 0, 4), 6); + s->reg[rd] = (int32_t)(s->reg[rd] + imm); + } + break; +#endif + case 2: /* c.li */ + if (rd != 0) { + imm = sext(get_field1(insn, 12, 5, 5) | + get_field1(insn, 2, 0, 4), 6); + s->reg[rd] = imm; + } + break; + case 3: + if (rd == 2) { + /* c.addi16sp */ + imm = sext(get_field1(insn, 12, 9, 9) | + get_field1(insn, 6, 4, 4) | + get_field1(insn, 5, 6, 6) | + get_field1(insn, 3, 7, 8) | + get_field1(insn, 2, 5, 5), 10); + if (imm == 0) + goto illegal_insn; + s->reg[2] = (intx_t)(s->reg[2] + imm); + } else if (rd != 0) { + /* c.lui */ + imm = sext(get_field1(insn, 12, 17, 17) | + get_field1(insn, 2, 12, 16), 18); + s->reg[rd] = imm; + } + break; + case 4: + funct3 = (insn >> 10) & 3; + rd = ((insn >> 7) & 7) | 8; + switch(funct3) { + case 0: /* c.srli */ + case 1: /* c.srai */ + imm = get_field1(insn, 12, 5, 5) | + get_field1(insn, 2, 0, 4); +#if XLEN == 32 + if (imm & 0x20) + goto illegal_insn; +#elif XLEN == 128 + if (imm == 0) + imm = 64; + else if (imm >= 32) + imm = 128 - imm; +#endif + if (funct3 == 0) + s->reg[rd] = (intx_t)((uintx_t)s->reg[rd] >> imm); + else + s->reg[rd] = (intx_t)s->reg[rd] >> imm; + + break; + case 2: /* c.andi */ + imm = sext(get_field1(insn, 12, 5, 5) | + get_field1(insn, 2, 0, 4), 6); + s->reg[rd] &= imm; + break; + case 3: + rs2 = ((insn >> 2) & 7) | 8; + funct3 = ((insn >> 5) & 3) | ((insn >> (12 - 2)) & 4); + switch(funct3) { + case 0: /* c.sub */ + s->reg[rd] = (intx_t)(s->reg[rd] - s->reg[rs2]); + break; + case 1: /* c.xor */ + s->reg[rd] = s->reg[rd] ^ s->reg[rs2]; + break; + case 2: /* c.or */ + s->reg[rd] = s->reg[rd] | s->reg[rs2]; + break; + case 3: /* c.and */ + s->reg[rd] = s->reg[rd] & s->reg[rs2]; + break; +#if XLEN >= 64 + case 4: /* c.subw */ + s->reg[rd] = (int32_t)(s->reg[rd] - s->reg[rs2]); + break; + case 5: /* c.addw */ + s->reg[rd] = (int32_t)(s->reg[rd] + s->reg[rs2]); + break; +#endif + default: + goto illegal_insn; + } + break; + } + break; + case 5: /* c.j */ + imm = sext(get_field1(insn, 12, 11, 11) | + get_field1(insn, 11, 4, 4) | + get_field1(insn, 9, 8, 9) | + get_field1(insn, 8, 10, 10) | + get_field1(insn, 7, 6, 6) | + get_field1(insn, 6, 7, 7) | + get_field1(insn, 3, 1, 3) | + get_field1(insn, 2, 5, 5), 12); + s->pc = (intx_t)(GET_PC() + imm); + JUMP_INSN; + case 6: /* c.beqz */ + rs1 = ((insn >> 7) & 7) | 8; + imm = sext(get_field1(insn, 12, 8, 8) | + get_field1(insn, 10, 3, 4) | + get_field1(insn, 5, 6, 7) | + get_field1(insn, 3, 1, 2) | + get_field1(insn, 2, 5, 5), 9); + if (s->reg[rs1] == 0) { + s->pc = (intx_t)(GET_PC() + imm); + JUMP_INSN; + } + break; + case 7: /* c.bnez */ + rs1 = ((insn >> 7) & 7) | 8; + imm = sext(get_field1(insn, 12, 8, 8) | + get_field1(insn, 10, 3, 4) | + get_field1(insn, 5, 6, 7) | + get_field1(insn, 3, 1, 2) | + get_field1(insn, 2, 5, 5), 9); + if (s->reg[rs1] != 0) { + s->pc = (intx_t)(GET_PC() + imm); + JUMP_INSN; + } + break; + default: + goto illegal_insn; + } + C_NEXT_INSN; + C_QUADRANT(2) + funct3 = (insn >> 13) & 7; + rs2 = (insn >> 2) & 0x1f; + switch(funct3) { + case 0: /* c.slli */ + imm = get_field1(insn, 12, 5, 5) | rs2; +#if XLEN == 32 + if (imm & 0x20) + goto illegal_insn; +#elif XLEN == 128 + if (imm == 0) + imm = 64; +#endif + if (rd != 0) + s->reg[rd] = (intx_t)(s->reg[rd] << imm); + break; +#if XLEN == 128 + case 1: /* c.lqsp */ + imm = get_field1(insn, 12, 5, 5) | + (rs2 & (1 << 4)) | + get_field1(insn, 2, 6, 9); + addr = (intx_t)(s->reg[2] + imm); + if (target_read_u128(s, &val, addr)) + goto mmu_exception; + if (rd != 0) + s->reg[rd] = val; + break; +#elif FLEN >= 64 + case 1: /* c.fldsp */ + { + uint64_t rval; + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 12, 5, 5) | + (rs2 & (3 << 3)) | + get_field1(insn, 2, 6, 8); + addr = (intx_t)(s->reg[2] + imm); + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval | F64_HIGH; + s->fs = 3; + } + break; +#endif + case 2: /* c.lwsp */ + { + uint32_t rval; + imm = get_field1(insn, 12, 5, 5) | + (rs2 & (7 << 2)) | + get_field1(insn, 2, 6, 7); + addr = (intx_t)(s->reg[2] + imm); + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + if (rd != 0) + s->reg[rd] = (int32_t)rval; + } + break; +#if XLEN >= 64 + case 3: /* c.ldsp */ + { + uint64_t rval; + imm = get_field1(insn, 12, 5, 5) | + (rs2 & (3 << 3)) | + get_field1(insn, 2, 6, 8); + addr = (intx_t)(s->reg[2] + imm); + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + if (rd != 0) + s->reg[rd] = (int64_t)rval; + } + break; +#elif FLEN >= 32 + case 3: /* c.flwsp */ + { + uint32_t rval; + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 12, 5, 5) | + (rs2 & (7 << 2)) | + get_field1(insn, 2, 6, 7); + addr = (intx_t)(s->reg[2] + imm); + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval | F32_HIGH; + s->fs = 3; + } + break; +#endif + case 4: + if (((insn >> 12) & 1) == 0) { + if (rs2 == 0) { + /* c.jr */ + if (rd == 0) + goto illegal_insn; + s->pc = s->reg[rd] & ~1; + JUMP_INSN; + } else { + /* c.mv */ + if (rd != 0) + s->reg[rd] = s->reg[rs2]; + } + } else { + if (rs2 == 0) { + if (rd == 0) { + /* c.ebreak */ + s->pending_exception = CAUSE_BREAKPOINT; + goto exception; + } else { + /* c.jalr */ + val = GET_PC() + 2; + s->pc = s->reg[rd] & ~1; + s->reg[1] = val; + JUMP_INSN; + } + } else { + if (rd != 0) { + s->reg[rd] = (intx_t)(s->reg[rd] + s->reg[rs2]); + } + } + } + break; +#if XLEN == 128 + case 5: /* c.sqsp */ + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 7, 6, 8); + addr = (intx_t)(s->reg[2] + imm); + if (target_write_u128(s, addr, s->reg[rs2])) + goto mmu_exception; + break; +#elif FLEN >= 64 + case 5: /* c.fsdsp */ + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 7, 6, 8); + addr = (intx_t)(s->reg[2] + imm); + if (target_write_u64(s, addr, s->fp_reg[rs2])) + goto mmu_exception; + break; +#endif + case 6: /* c.swsp */ + imm = get_field1(insn, 9, 2, 5) | + get_field1(insn, 7, 6, 7); + addr = (intx_t)(s->reg[2] + imm); + if (target_write_u32(s, addr, s->reg[rs2])) + goto mmu_exception; + break; +#if XLEN >= 64 + case 7: /* c.sdsp */ + imm = get_field1(insn, 10, 3, 5) | + get_field1(insn, 7, 6, 8); + addr = (intx_t)(s->reg[2] + imm); + if (target_write_u64(s, addr, s->reg[rs2])) + goto mmu_exception; + break; +#elif FLEN >= 32 + case 7: /* c.swsp */ + if (s->fs == 0) + goto illegal_insn; + imm = get_field1(insn, 9, 2, 5) | + get_field1(insn, 7, 6, 7); + addr = (intx_t)(s->reg[2] + imm); + if (target_write_u32(s, addr, s->fp_reg[rs2])) + goto mmu_exception; + break; +#endif + default: + goto illegal_insn; + } + C_NEXT_INSN; +#endif /* CONFIG_EXT_C */ + + case 0x37: /* lui */ + if (rd != 0) + s->reg[rd] = (int32_t)(insn & 0xfffff000); + NEXT_INSN; + case 0x17: /* auipc */ + if (rd != 0) + s->reg[rd] = (intx_t)(GET_PC() + (int32_t)(insn & 0xfffff000)); + NEXT_INSN; + case 0x6f: /* jal */ + imm = ((insn >> (31 - 20)) & (1 << 20)) | + ((insn >> (21 - 1)) & 0x7fe) | + ((insn >> (20 - 11)) & (1 << 11)) | + (insn & 0xff000); + imm = (imm << 11) >> 11; + if (rd != 0) + s->reg[rd] = GET_PC() + 4; + s->pc = (intx_t)(GET_PC() + imm); + JUMP_INSN; + case 0x67: /* jalr */ + imm = (int32_t)insn >> 20; + val = GET_PC() + 4; + s->pc = (intx_t)(s->reg[rs1] + imm) & ~1; + if (rd != 0) + s->reg[rd] = val; + JUMP_INSN; + case 0x63: + funct3 = (insn >> 12) & 7; + switch(funct3 >> 1) { + case 0: /* beq/bne */ + cond = (s->reg[rs1] == s->reg[rs2]); + break; + case 2: /* blt/bge */ + cond = ((target_long)s->reg[rs1] < (target_long)s->reg[rs2]); + break; + case 3: /* bltu/bgeu */ + cond = (s->reg[rs1] < s->reg[rs2]); + break; + default: + goto illegal_insn; + } + cond ^= (funct3 & 1); + if (cond) { + imm = ((insn >> (31 - 12)) & (1 << 12)) | + ((insn >> (25 - 5)) & 0x7e0) | + ((insn >> (8 - 1)) & 0x1e) | + ((insn << (11 - 7)) & (1 << 11)); + imm = (imm << 19) >> 19; + s->pc = (intx_t)(GET_PC() + imm); + JUMP_INSN; + } + NEXT_INSN; + case 0x03: /* load */ + funct3 = (insn >> 12) & 7; + imm = (int32_t)insn >> 20; + addr = s->reg[rs1] + imm; + switch(funct3) { + case 0: /* lb */ + { + uint8_t rval; + if (target_read_u8(s, &rval, addr)) + goto mmu_exception; + val = (int8_t)rval; + } + break; + case 1: /* lh */ + { + uint16_t rval; + if (target_read_u16(s, &rval, addr)) + goto mmu_exception; + val = (int16_t)rval; + } + break; + case 2: /* lw */ + { + uint32_t rval; + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + val = (int32_t)rval; + } + break; + case 4: /* lbu */ + { + uint8_t rval; + if (target_read_u8(s, &rval, addr)) + goto mmu_exception; + val = rval; + } + break; + case 5: /* lhu */ + { + uint16_t rval; + if (target_read_u16(s, &rval, addr)) + goto mmu_exception; + val = rval; + } + break; +#if XLEN >= 64 + case 3: /* ld */ + { + uint64_t rval; + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + val = (int64_t)rval; + } + break; + case 6: /* lwu */ + { + uint32_t rval; + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + val = rval; + } + break; +#endif +#if XLEN >= 128 + case 7: /* ldu */ + { + uint64_t rval; + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + val = rval; + } + break; +#endif + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; + case 0x23: /* store */ + funct3 = (insn >> 12) & 7; + imm = rd | ((insn >> (25 - 5)) & 0xfe0); + imm = (imm << 20) >> 20; + addr = s->reg[rs1] + imm; + val = s->reg[rs2]; + switch(funct3) { + case 0: /* sb */ + if (target_write_u8(s, addr, val)) + goto mmu_exception; + break; + case 1: /* sh */ + if (target_write_u16(s, addr, val)) + goto mmu_exception; + break; + case 2: /* sw */ + if (target_write_u32(s, addr, val)) + goto mmu_exception; + break; +#if XLEN >= 64 + case 3: /* sd */ + if (target_write_u64(s, addr, val)) + goto mmu_exception; + break; +#endif +#if XLEN >= 128 + case 4: /* sq */ + if (target_write_u128(s, addr, val)) + goto mmu_exception; + break; +#endif + default: + goto illegal_insn; + } + NEXT_INSN; + case 0x13: + funct3 = (insn >> 12) & 7; + imm = (int32_t)insn >> 20; + switch(funct3) { + case 0: /* addi */ + val = (intx_t)(s->reg[rs1] + imm); + break; + case 1: /* slli */ + if ((imm & ~(XLEN - 1)) != 0) + goto illegal_insn; + val = (intx_t)(s->reg[rs1] << (imm & (XLEN - 1))); + break; + case 2: /* slti */ + val = (target_long)s->reg[rs1] < (target_long)imm; + break; + case 3: /* sltiu */ + val = s->reg[rs1] < (target_ulong)imm; + break; + case 4: /* xori */ + val = s->reg[rs1] ^ imm; + break; + case 5: /* srli/srai */ + if ((imm & ~((XLEN - 1) | 0x400)) != 0) + goto illegal_insn; + if (imm & 0x400) + val = (intx_t)s->reg[rs1] >> (imm & (XLEN - 1)); + else + val = (intx_t)((uintx_t)s->reg[rs1] >> (imm & (XLEN - 1))); + break; + case 6: /* ori */ + val = s->reg[rs1] | imm; + break; + default: + case 7: /* andi */ + val = s->reg[rs1] & imm; + break; + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#if XLEN >= 64 + case 0x1b:/* OP-IMM-32 */ + funct3 = (insn >> 12) & 7; + imm = (int32_t)insn >> 20; + val = s->reg[rs1]; + switch(funct3) { + case 0: /* addiw */ + val = (int32_t)(val + imm); + break; + case 1: /* slliw */ + if ((imm & ~31) != 0) + goto illegal_insn; + val = (int32_t)(val << (imm & 31)); + break; + case 5: /* srliw/sraiw */ + if ((imm & ~(31 | 0x400)) != 0) + goto illegal_insn; + if (imm & 0x400) + val = (int32_t)val >> (imm & 31); + else + val = (int32_t)((uint32_t)val >> (imm & 31)); + break; + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#endif +#if XLEN >= 128 + case 0x5b: /* OP-IMM-64 */ + funct3 = (insn >> 12) & 7; + imm = (int32_t)insn >> 20; + val = s->reg[rs1]; + switch(funct3) { + case 0: /* addid */ + val = (int64_t)(val + imm); + break; + case 1: /* sllid */ + if ((imm & ~63) != 0) + goto illegal_insn; + val = (int64_t)(val << (imm & 63)); + break; + case 5: /* srlid/sraid */ + if ((imm & ~(63 | 0x400)) != 0) + goto illegal_insn; + if (imm & 0x400) + val = (int64_t)val >> (imm & 63); + else + val = (int64_t)((uint64_t)val >> (imm & 63)); + break; + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#endif + case 0x33: + imm = insn >> 25; + val = s->reg[rs1]; + val2 = s->reg[rs2]; + if (imm == 1) { + funct3 = (insn >> 12) & 7; + switch(funct3) { + case 0: /* mul */ + val = (intx_t)((intx_t)val * (intx_t)val2); + break; + case 1: /* mulh */ + val = (intx_t)glue(mulh, XLEN)(val, val2); + break; + case 2:/* mulhsu */ + val = (intx_t)glue(mulhsu, XLEN)(val, val2); + break; + case 3:/* mulhu */ + val = (intx_t)glue(mulhu, XLEN)(val, val2); + break; + case 4:/* div */ + val = glue(div, XLEN)(val, val2); + break; + case 5:/* divu */ + val = (intx_t)glue(divu, XLEN)(val, val2); + break; + case 6:/* rem */ + val = glue(rem, XLEN)(val, val2); + break; + case 7:/* remu */ + val = (intx_t)glue(remu, XLEN)(val, val2); + break; + default: + goto illegal_insn; + } + } else { + if (imm & ~0x20) + goto illegal_insn; + funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3)); + switch(funct3) { + case 0: /* add */ + val = (intx_t)(val + val2); + break; + case 0 | 8: /* sub */ + val = (intx_t)(val - val2); + break; + case 1: /* sll */ + val = (intx_t)(val << (val2 & (XLEN - 1))); + break; + case 2: /* slt */ + val = (target_long)val < (target_long)val2; + break; + case 3: /* sltu */ + val = val < val2; + break; + case 4: /* xor */ + val = val ^ val2; + break; + case 5: /* srl */ + val = (intx_t)((uintx_t)val >> (val2 & (XLEN - 1))); + break; + case 5 | 8: /* sra */ + val = (intx_t)val >> (val2 & (XLEN - 1)); + break; + case 6: /* or */ + val = val | val2; + break; + case 7: /* and */ + val = val & val2; + break; + default: + goto illegal_insn; + } + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#if XLEN >= 64 + case 0x3b: /* OP-32 */ + imm = insn >> 25; + val = s->reg[rs1]; + val2 = s->reg[rs2]; + if (imm == 1) { + funct3 = (insn >> 12) & 7; + switch(funct3) { + case 0: /* mulw */ + val = (int32_t)((int32_t)val * (int32_t)val2); + break; + case 4:/* divw */ + val = div32(val, val2); + break; + case 5:/* divuw */ + val = (int32_t)divu32(val, val2); + break; + case 6:/* remw */ + val = rem32(val, val2); + break; + case 7:/* remuw */ + val = (int32_t)remu32(val, val2); + break; + default: + goto illegal_insn; + } + } else { + if (imm & ~0x20) + goto illegal_insn; + funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3)); + switch(funct3) { + case 0: /* addw */ + val = (int32_t)(val + val2); + break; + case 0 | 8: /* subw */ + val = (int32_t)(val - val2); + break; + case 1: /* sllw */ + val = (int32_t)((uint32_t)val << (val2 & 31)); + break; + case 5: /* srlw */ + val = (int32_t)((uint32_t)val >> (val2 & 31)); + break; + case 5 | 8: /* sraw */ + val = (int32_t)val >> (val2 & 31); + break; + default: + goto illegal_insn; + } + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#endif +#if XLEN >= 128 + case 0x7b: /* OP-64 */ + imm = insn >> 25; + val = s->reg[rs1]; + val2 = s->reg[rs2]; + if (imm == 1) { + funct3 = (insn >> 12) & 7; + switch(funct3) { + case 0: /* muld */ + val = (int64_t)((int64_t)val * (int64_t)val2); + break; + case 4:/* divd */ + val = div64(val, val2); + break; + case 5:/* divud */ + val = (int64_t)divu64(val, val2); + break; + case 6:/* remd */ + val = rem64(val, val2); + break; + case 7:/* remud */ + val = (int64_t)remu64(val, val2); + break; + default: + goto illegal_insn; + } + } else { + if (imm & ~0x20) + goto illegal_insn; + funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3)); + switch(funct3) { + case 0: /* addd */ + val = (int64_t)(val + val2); + break; + case 0 | 8: /* subd */ + val = (int64_t)(val - val2); + break; + case 1: /* slld */ + val = (int64_t)((uint64_t)val << (val2 & 63)); + break; + case 5: /* srld */ + val = (int64_t)((uint64_t)val >> (val2 & 63)); + break; + case 5 | 8: /* srad */ + val = (int64_t)val >> (val2 & 63); + break; + default: + goto illegal_insn; + } + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#endif + case 0x73: + funct3 = (insn >> 12) & 7; + imm = insn >> 20; + if (funct3 & 4) + val = rs1; + else + val = s->reg[rs1]; + funct3 &= 3; + switch(funct3) { + case 1: /* csrrw */ + s->insn_counter = GET_INSN_COUNTER(); + if (csr_read(s, &val2, imm, TRUE)) + goto illegal_insn; + val2 = (intx_t)val2; + err = csr_write(s, imm, val); + if (err < 0) + goto illegal_insn; + if (rd != 0) + s->reg[rd] = val2; + if (err > 0) { + s->pc = GET_PC() + 4; + if (err == 2) + JUMP_INSN; + else + goto done_interp; + } + break; + case 2: /* csrrs */ + case 3: /* csrrc */ + s->insn_counter = GET_INSN_COUNTER(); + if (csr_read(s, &val2, imm, (rs1 != 0))) + goto illegal_insn; + val2 = (intx_t)val2; + if (rs1 != 0) { + if (funct3 == 2) + val = val2 | val; + else + val = val2 & ~val; + err = csr_write(s, imm, val); + if (err < 0) + goto illegal_insn; + } else { + err = 0; + } + if (rd != 0) + s->reg[rd] = val2; + if (err > 0) { + s->pc = GET_PC() + 4; + if (err == 2) + JUMP_INSN; + else + goto done_interp; + } + break; + case 0: + switch(imm) { + case 0x000: /* ecall */ + if (insn & 0x000fff80) + goto illegal_insn; + s->pending_exception = CAUSE_USER_ECALL + s->priv; + goto exception; + case 0x001: /* ebreak */ + if (insn & 0x000fff80) + goto illegal_insn; + s->pending_exception = CAUSE_BREAKPOINT; + goto exception; + case 0x102: /* sret */ + { + if (insn & 0x000fff80) + goto illegal_insn; + if (s->priv < PRV_S) + goto illegal_insn; + s->pc = GET_PC(); + handle_sret(s); + goto done_interp; + } + break; + case 0x302: /* mret */ + { + if (insn & 0x000fff80) + goto illegal_insn; + if (s->priv < PRV_M) + goto illegal_insn; + s->pc = GET_PC(); + handle_mret(s); + goto done_interp; + } + break; + case 0x105: /* wfi */ + if (insn & 0x00007f80) + goto illegal_insn; + if (s->priv == PRV_U) + goto illegal_insn; + /* go to power down if no enabled interrupts are + pending */ + if ((s->mip & s->mie) == 0) { + s->power_down_flag = TRUE; + s->pc = GET_PC() + 4; + goto done_interp; + } + break; + default: + if ((imm >> 5) == 0x09) { + /* sfence.vma */ + if (insn & 0x00007f80) + goto illegal_insn; + if (s->priv == PRV_U) + goto illegal_insn; + if (rs1 == 0) { + tlb_flush_all(s); + } else { + tlb_flush_vaddr(s, s->reg[rs1]); + } + /* the current code TLB may have been flushed */ + s->pc = GET_PC() + 4; + JUMP_INSN; + } else { + goto illegal_insn; + } + break; + } + break; + default: + goto illegal_insn; + } + NEXT_INSN; + case 0x0f: /* misc-mem */ + funct3 = (insn >> 12) & 7; + switch(funct3) { + case 0: /* fence */ + if (insn & 0xf00fff80) + goto illegal_insn; + break; + case 1: /* fence.i */ + if (insn != 0x0000100f) + goto illegal_insn; + break; +#if XLEN >= 128 + case 2: /* lq */ + imm = (int32_t)insn >> 20; + addr = s->reg[rs1] + imm; + if (target_read_u128(s, &val, addr)) + goto mmu_exception; + if (rd != 0) + s->reg[rd] = val; + break; +#endif + default: + goto illegal_insn; + } + NEXT_INSN; + case 0x2f: + funct3 = (insn >> 12) & 7; +#define OP_A(size) \ + { \ + uint ## size ##_t rval; \ + \ + addr = s->reg[rs1]; \ + funct3 = insn >> 27; \ + switch(funct3) { \ + case 2: /* lr.w */ \ + if (rs2 != 0) \ + goto illegal_insn; \ + if (target_read_u ## size(s, &rval, addr)) \ + goto mmu_exception; \ + val = (int## size ## _t)rval; \ + s->load_res = addr; \ + break; \ + case 3: /* sc.w */ \ + if (s->load_res == addr) { \ + if (target_write_u ## size(s, addr, s->reg[rs2])) \ + goto mmu_exception; \ + val = 0; \ + } else { \ + val = 1; \ + } \ + break; \ + case 1: /* amiswap.w */ \ + case 0: /* amoadd.w */ \ + case 4: /* amoxor.w */ \ + case 0xc: /* amoand.w */ \ + case 0x8: /* amoor.w */ \ + case 0x10: /* amomin.w */ \ + case 0x14: /* amomax.w */ \ + case 0x18: /* amominu.w */ \ + case 0x1c: /* amomaxu.w */ \ + if (target_read_u ## size(s, &rval, addr)) \ + goto mmu_exception; \ + val = (int## size ## _t)rval; \ + val2 = s->reg[rs2]; \ + switch(funct3) { \ + case 1: /* amiswap.w */ \ + break; \ + case 0: /* amoadd.w */ \ + val2 = (int## size ## _t)(val + val2); \ + break; \ + case 4: /* amoxor.w */ \ + val2 = (int## size ## _t)(val ^ val2); \ + break; \ + case 0xc: /* amoand.w */ \ + val2 = (int## size ## _t)(val & val2); \ + break; \ + case 0x8: /* amoor.w */ \ + val2 = (int## size ## _t)(val | val2); \ + break; \ + case 0x10: /* amomin.w */ \ + if ((int## size ## _t)val < (int## size ## _t)val2) \ + val2 = (int## size ## _t)val; \ + break; \ + case 0x14: /* amomax.w */ \ + if ((int## size ## _t)val > (int## size ## _t)val2) \ + val2 = (int## size ## _t)val; \ + break; \ + case 0x18: /* amominu.w */ \ + if ((uint## size ## _t)val < (uint## size ## _t)val2) \ + val2 = (int## size ## _t)val; \ + break; \ + case 0x1c: /* amomaxu.w */ \ + if ((uint## size ## _t)val > (uint## size ## _t)val2) \ + val2 = (int## size ## _t)val; \ + break; \ + default: \ + goto illegal_insn; \ + } \ + if (target_write_u ## size(s, addr, val2)) \ + goto mmu_exception; \ + break; \ + default: \ + goto illegal_insn; \ + } \ + } + + switch(funct3) { + case 2: + OP_A(32); + break; +#if XLEN >= 64 + case 3: + OP_A(64); + break; +#endif +#if XLEN >= 128 + case 4: + OP_A(128); + break; +#endif + default: + goto illegal_insn; + } + if (rd != 0) + s->reg[rd] = val; + NEXT_INSN; +#if FLEN > 0 + /* FPU */ + case 0x07: /* fp load */ + if (s->fs == 0) + goto illegal_insn; + funct3 = (insn >> 12) & 7; + imm = (int32_t)insn >> 20; + addr = s->reg[rs1] + imm; + switch(funct3) { + case 2: /* flw */ + { + uint32_t rval; + if (target_read_u32(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval | F32_HIGH; + } + break; +#if FLEN >= 64 + case 3: /* fld */ + { + uint64_t rval; + if (target_read_u64(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval | F64_HIGH; + } + break; +#endif +#if FLEN >= 128 + case 4: /* flq */ + { + uint128_t rval; + if (target_read_u128(s, &rval, addr)) + goto mmu_exception; + s->fp_reg[rd] = rval; + } + break; +#endif + default: + goto illegal_insn; + } + s->fs = 3; + NEXT_INSN; + case 0x27: /* fp store */ + if (s->fs == 0) + goto illegal_insn; + funct3 = (insn >> 12) & 7; + imm = rd | ((insn >> (25 - 5)) & 0xfe0); + imm = (imm << 20) >> 20; + addr = s->reg[rs1] + imm; + switch(funct3) { + case 2: /* fsw */ + if (target_write_u32(s, addr, s->fp_reg[rs2])) + goto mmu_exception; + break; +#if FLEN >= 64 + case 3: /* fsd */ + if (target_write_u64(s, addr, s->fp_reg[rs2])) + goto mmu_exception; + break; +#endif +#if FLEN >= 128 + case 4: /* fsq */ + if (target_write_u128(s, addr, s->fp_reg[rs2])) + goto mmu_exception; + break; +#endif + default: + goto illegal_insn; + } + NEXT_INSN; + case 0x43: /* fmadd */ + if (s->fs == 0) + goto illegal_insn; + funct3 = (insn >> 25) & 3; + rs3 = insn >> 27; + rm = get_insn_rm(s, (insn >> 12) & 7); + if (rm < 0) + goto illegal_insn; + switch(funct3) { + case 0: + s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1], s->fp_reg[rs2], + s->fp_reg[rs3], rm, &s->fflags) | F32_HIGH; + break; +#if FLEN >= 64 + case 1: + s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1], s->fp_reg[rs2], + s->fp_reg[rs3], rm, &s->fflags) | F64_HIGH; + break; +#endif +#if FLEN >= 128 + case 3: + s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1], s->fp_reg[rs2], + s->fp_reg[rs3], rm, &s->fflags); + break; +#endif + default: + goto illegal_insn; + } + s->fs = 3; + NEXT_INSN; + case 0x47: /* fmsub */ + if (s->fs == 0) + goto illegal_insn; + funct3 = (insn >> 25) & 3; + rs3 = insn >> 27; + rm = get_insn_rm(s, (insn >> 12) & 7); + if (rm < 0) + goto illegal_insn; + switch(funct3) { + case 0: + s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1], + s->fp_reg[rs2], + s->fp_reg[rs3] ^ FSIGN_MASK32, + rm, &s->fflags) | F32_HIGH; + break; +#if FLEN >= 64 + case 1: + s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1], + s->fp_reg[rs2], + s->fp_reg[rs3] ^ FSIGN_MASK64, + rm, &s->fflags) | F64_HIGH; + break; +#endif +#if FLEN >= 128 + case 3: + s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1], + s->fp_reg[rs2], + s->fp_reg[rs3] ^ FSIGN_MASK128, + rm, &s->fflags); + break; +#endif + default: + goto illegal_insn; + } + s->fs = 3; + NEXT_INSN; + case 0x4b: /* fnmsub */ + if (s->fs == 0) + goto illegal_insn; + funct3 = (insn >> 25) & 3; + rs3 = insn >> 27; + rm = get_insn_rm(s, (insn >> 12) & 7); + if (rm < 0) + goto illegal_insn; + switch(funct3) { + case 0: + s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1] ^ FSIGN_MASK32, + s->fp_reg[rs2], + s->fp_reg[rs3], + rm, &s->fflags) | F32_HIGH; + break; +#if FLEN >= 64 + case 1: + s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1] ^ FSIGN_MASK64, + s->fp_reg[rs2], + s->fp_reg[rs3], + rm, &s->fflags) | F64_HIGH; + break; +#endif +#if FLEN >= 128 + case 3: + s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1] ^ FSIGN_MASK128, + s->fp_reg[rs2], + s->fp_reg[rs3], + rm, &s->fflags); + break; +#endif + default: + goto illegal_insn; + } + s->fs = 3; + NEXT_INSN; + case 0x4f: /* fnmadd */ + if (s->fs == 0) + goto illegal_insn; + funct3 = (insn >> 25) & 3; + rs3 = insn >> 27; + rm = get_insn_rm(s, (insn >> 12) & 7); + if (rm < 0) + goto illegal_insn; + switch(funct3) { + case 0: + s->fp_reg[rd] = fma_sf32(s->fp_reg[rs1] ^ FSIGN_MASK32, + s->fp_reg[rs2], + s->fp_reg[rs3] ^ FSIGN_MASK32, + rm, &s->fflags) | F32_HIGH; + break; +#if FLEN >= 64 + case 1: + s->fp_reg[rd] = fma_sf64(s->fp_reg[rs1] ^ FSIGN_MASK64, + s->fp_reg[rs2], + s->fp_reg[rs3] ^ FSIGN_MASK64, + rm, &s->fflags) | F64_HIGH; + break; +#endif +#if FLEN >= 128 + case 3: + s->fp_reg[rd] = fma_sf128(s->fp_reg[rs1] ^ FSIGN_MASK128, + s->fp_reg[rs2], + s->fp_reg[rs3] ^ FSIGN_MASK128, + rm, &s->fflags); + break; +#endif + default: + goto illegal_insn; + } + s->fs = 3; + NEXT_INSN; + case 0x53: + if (s->fs == 0) + goto illegal_insn; + imm = insn >> 25; + rm = (insn >> 12) & 7; + switch(imm) { + +#define F_SIZE 32 +#include "riscv_cpu_fp_template.h" +#if FLEN >= 64 +#define F_SIZE 64 +#include "riscv_cpu_fp_template.h" +#endif +#if FLEN >= 128 +#define F_SIZE 128 +#include "riscv_cpu_fp_template.h" +#endif + + default: + goto illegal_insn; + } + NEXT_INSN; +#endif + default: + goto illegal_insn; + } + /* update PC for next instruction */ + jump_insn: ; + } /* end of main loop */ + illegal_insn: + s->pending_exception = CAUSE_ILLEGAL_INSTRUCTION; + s->pending_tval = insn; + mmu_exception: + exception: + s->pc = GET_PC(); + if (s->pending_exception >= 0) { + /* Note: the idea is that one exception counts for one cycle. */ + s->n_cycles--; + raise_exception2(s, s->pending_exception, s->pending_tval); + } + /* we exit because XLEN may have changed */ + done_interp: +the_end: + s->insn_counter = GET_INSN_COUNTER(); +#if 0 + printf("done interp %lx int=%x mstatus=%lx prv=%d\n", + (uint64_t)s->insn_counter, s->mip & s->mie, (uint64_t)s->mstatus, + s->priv); +#endif +} + +#undef uintx_t +#undef intx_t +#undef XLEN +#undef OP_A diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c new file mode 100644 index 0000000..a7149fd --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/riscv_machine.c @@ -0,0 +1,1053 @@ +/* + * RISCV machine + * + * Copyright (c) 2016-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> + +#include "cutils.h" +#include "iomem.h" +#include "riscv_cpu.h" +#include "virtio.h" +#include "machine.h" + +/* RISCV machine */ + +typedef struct RISCVMachine { + VirtMachine common; + PhysMemoryMap *mem_map; + int max_xlen; + RISCVCPUState *cpu_state; + uint64_t ram_size; + /* RTC */ + BOOL rtc_real_time; + uint64_t rtc_start_time; + uint64_t timecmp; + /* PLIC */ + uint32_t plic_pending_irq, plic_served_irq; + IRQSignal plic_irq[32]; /* IRQ 0 is not used */ + /* HTIF */ + uint64_t htif_tohost, htif_fromhost; + + VIRTIODevice *keyboard_dev; + VIRTIODevice *mouse_dev; + + int virtio_count; +} RISCVMachine; + +#define LOW_RAM_SIZE 0x00010000 /* 64KB */ +#define RAM_BASE_ADDR 0x80000000 +#define CLINT_BASE_ADDR 0x02000000 +#define CLINT_SIZE 0x000c0000 +#define HTIF_BASE_ADDR 0x40008000 +#define IDE_BASE_ADDR 0x40009000 +#define VIRTIO_BASE_ADDR 0x40010000 +#define VIRTIO_SIZE 0x1000 +#define VIRTIO_IRQ 1 +#define PLIC_BASE_ADDR 0x40100000 +#define PLIC_SIZE 0x00400000 +#define FRAMEBUFFER_BASE_ADDR 0x41000000 + +#define RTC_FREQ 10000000 +#define RTC_FREQ_DIV 16 /* arbitrary, relative to CPU freq to have a + 10 MHz frequency */ + +static uint64_t rtc_get_real_time(RISCVMachine *s) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * RTC_FREQ + + (ts.tv_nsec / (1000000000 / RTC_FREQ)); +} + +static uint64_t rtc_get_time(RISCVMachine *m) +{ + uint64_t val; + if (m->rtc_real_time) { + val = rtc_get_real_time(m) - m->rtc_start_time; + } else { + val = riscv_cpu_get_cycles(m->cpu_state) / RTC_FREQ_DIV; + } + // printf("rtc_time=%" PRId64 "\n", val); + return val; +} + +static uint32_t htif_read(void *opaque, uint32_t offset, + int size_log2) +{ + RISCVMachine *s = opaque; + uint32_t val; + + assert(size_log2 == 2); + switch(offset) { + case 0: + val = s->htif_tohost; + break; + case 4: + val = s->htif_tohost >> 32; + break; + case 8: + val = s->htif_fromhost; + break; + case 12: + val = s->htif_fromhost >> 32; + break; + default: + val = 0; + break; + } + return val; +} + +static void htif_handle_cmd(RISCVMachine *s) +{ + uint32_t device, cmd; + + device = s->htif_tohost >> 56; + cmd = (s->htif_tohost >> 48) & 0xff; + if (s->htif_tohost == 1) { + /* shuthost */ + printf("\nPower off.\n"); + exit(0); + } else if (device == 1 && cmd == 1) { + uint8_t buf[1]; + buf[0] = s->htif_tohost & 0xff; + s->common.console->write_data(s->common.console->opaque, buf, 1); + s->htif_tohost = 0; + s->htif_fromhost = ((uint64_t)device << 56) | ((uint64_t)cmd << 48); + } else if (device == 1 && cmd == 0) { + /* request keyboard interrupt */ + s->htif_tohost = 0; + } else { + printf("HTIF: unsupported tohost=0x%016" PRIx64 "\n", s->htif_tohost); + } +} + +static void htif_write(void *opaque, uint32_t offset, uint32_t val, + int size_log2) +{ + RISCVMachine *s = opaque; + + assert(size_log2 == 2); + switch(offset) { + case 0: + s->htif_tohost = (s->htif_tohost & ~0xffffffff) | val; + break; + case 4: + s->htif_tohost = (s->htif_tohost & 0xffffffff) | ((uint64_t)val << 32); + htif_handle_cmd(s); + break; + case 8: + s->htif_fromhost = (s->htif_fromhost & ~0xffffffff) | val; + break; + case 12: + s->htif_fromhost = (s->htif_fromhost & 0xffffffff) | + (uint64_t)val << 32; + break; + default: + break; + } +} + +#if 0 +static void htif_poll(RISCVMachine *s) +{ + uint8_t buf[1]; + int ret; + + if (s->htif_fromhost == 0) { + ret = s->console->read_data(s->console->opaque, buf, 1); + if (ret == 1) { + s->htif_fromhost = ((uint64_t)1 << 56) | ((uint64_t)0 << 48) | + buf[0]; + } + } +} +#endif + +static uint32_t clint_read(void *opaque, uint32_t offset, int size_log2) +{ + RISCVMachine *m = opaque; + uint32_t val; + + assert(size_log2 == 2); + switch(offset) { + case 0xbff8: + val = rtc_get_time(m); + break; + case 0xbffc: + val = rtc_get_time(m) >> 32; + break; + case 0x4000: + val = m->timecmp; + break; + case 0x4004: + val = m->timecmp >> 32; + break; + default: + val = 0; + break; + } + return val; +} + +static void clint_write(void *opaque, uint32_t offset, uint32_t val, + int size_log2) +{ + RISCVMachine *m = opaque; + + assert(size_log2 == 2); + switch(offset) { + case 0x4000: + m->timecmp = (m->timecmp & ~0xffffffff) | val; + riscv_cpu_reset_mip(m->cpu_state, MIP_MTIP); + break; + case 0x4004: + m->timecmp = (m->timecmp & 0xffffffff) | ((uint64_t)val << 32); + riscv_cpu_reset_mip(m->cpu_state, MIP_MTIP); + break; + default: + break; + } +} + +static void plic_update_mip(RISCVMachine *s) +{ + RISCVCPUState *cpu = s->cpu_state; + uint32_t mask; + mask = s->plic_pending_irq & ~s->plic_served_irq; + if (mask) { + riscv_cpu_set_mip(cpu, MIP_MEIP | MIP_SEIP); + } else { + riscv_cpu_reset_mip(cpu, MIP_MEIP | MIP_SEIP); + } +} + +#define PLIC_HART_BASE 0x200000 +#define PLIC_HART_SIZE 0x1000 + +static uint32_t plic_read(void *opaque, uint32_t offset, int size_log2) +{ + RISCVMachine *s = opaque; + uint32_t val, mask; + int i; + assert(size_log2 == 2); + switch(offset) { + case PLIC_HART_BASE: + val = 0; + break; + case PLIC_HART_BASE + 4: + mask = s->plic_pending_irq & ~s->plic_served_irq; + if (mask != 0) { + i = ctz32(mask); + s->plic_served_irq |= 1 << i; + plic_update_mip(s); + val = i + 1; + } else { + val = 0; + } + break; + default: + val = 0; + break; + } + return val; +} + +static void plic_write(void *opaque, uint32_t offset, uint32_t val, + int size_log2) +{ + RISCVMachine *s = opaque; + + assert(size_log2 == 2); + switch(offset) { + case PLIC_HART_BASE + 4: + val--; + if (val < 32) { + s->plic_served_irq &= ~(1 << val); + plic_update_mip(s); + } + break; + default: + break; + } +} + +static void plic_set_irq(void *opaque, int irq_num, int state) +{ + RISCVMachine *s = opaque; + uint32_t mask; + + mask = 1 << (irq_num - 1); + if (state) + s->plic_pending_irq |= mask; + else + s->plic_pending_irq &= ~mask; + plic_update_mip(s); +} + +static uint8_t *get_ram_ptr(RISCVMachine *s, uint64_t paddr, BOOL is_rw) +{ + return phys_mem_get_ram_ptr(s->mem_map, paddr, is_rw); +} + +/* FDT machine description */ + +#define FDT_MAGIC 0xd00dfeed +#define FDT_VERSION 17 + +struct fdt_header { + uint32_t magic; + uint32_t totalsize; + uint32_t off_dt_struct; + uint32_t off_dt_strings; + uint32_t off_mem_rsvmap; + uint32_t version; + uint32_t last_comp_version; /* <= 17 */ + uint32_t boot_cpuid_phys; + uint32_t size_dt_strings; + uint32_t size_dt_struct; +}; + +struct fdt_reserve_entry { + uint64_t address; + uint64_t size; +}; + +#define FDT_BEGIN_NODE 1 +#define FDT_END_NODE 2 +#define FDT_PROP 3 +#define FDT_NOP 4 +#define FDT_END 9 + +typedef struct { + uint32_t *tab; + int tab_len; + int tab_size; + int open_node_count; + + char *string_table; + int string_table_len; + int string_table_size; +} FDTState; + +static FDTState *fdt_init(void) +{ + FDTState *s; + s = mallocz(sizeof(*s)); + return s; +} + +static void fdt_alloc_len(FDTState *s, int len) +{ + int new_size; + if (unlikely(len > s->tab_size)) { + new_size = max_int(len, s->tab_size * 3 / 2); + s->tab = realloc(s->tab, new_size * sizeof(uint32_t)); + s->tab_size = new_size; + } +} + +static void fdt_put32(FDTState *s, int v) +{ + fdt_alloc_len(s, s->tab_len + 1); + s->tab[s->tab_len++] = cpu_to_be32(v); +} + +/* the data is zero padded */ +static void fdt_put_data(FDTState *s, const uint8_t *data, int len) +{ + int len1; + + len1 = (len + 3) / 4; + fdt_alloc_len(s, s->tab_len + len1); + memcpy(s->tab + s->tab_len, data, len); + memset((uint8_t *)(s->tab + s->tab_len) + len, 0, -len & 3); + s->tab_len += len1; +} + +static void fdt_begin_node(FDTState *s, const char *name) +{ + fdt_put32(s, FDT_BEGIN_NODE); + fdt_put_data(s, (uint8_t *)name, strlen(name) + 1); + s->open_node_count++; +} + +static void fdt_begin_node_num(FDTState *s, const char *name, uint64_t n) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "%s@%" PRIx64, name, n); + fdt_begin_node(s, buf); +} + +static void fdt_end_node(FDTState *s) +{ + fdt_put32(s, FDT_END_NODE); + s->open_node_count--; +} + +static int fdt_get_string_offset(FDTState *s, const char *name) +{ + int pos, new_size, name_size, new_len; + + pos = 0; + while (pos < s->string_table_len) { + if (!strcmp(s->string_table + pos, name)) + return pos; + pos += strlen(s->string_table + pos) + 1; + } + /* add a new string */ + name_size = strlen(name) + 1; + new_len = s->string_table_len + name_size; + if (new_len > s->string_table_size) { + new_size = max_int(new_len, s->string_table_size * 3 / 2); + s->string_table = realloc(s->string_table, new_size); + s->string_table_size = new_size; + } + pos = s->string_table_len; + memcpy(s->string_table + pos, name, name_size); + s->string_table_len = new_len; + return pos; +} + +static void fdt_prop(FDTState *s, const char *prop_name, + const void *data, int data_len) +{ + fdt_put32(s, FDT_PROP); + fdt_put32(s, data_len); + fdt_put32(s, fdt_get_string_offset(s, prop_name)); + fdt_put_data(s, data, data_len); +} + +static void fdt_prop_tab_u32(FDTState *s, const char *prop_name, + uint32_t *tab, int tab_len) +{ + int i; + fdt_put32(s, FDT_PROP); + fdt_put32(s, tab_len * sizeof(uint32_t)); + fdt_put32(s, fdt_get_string_offset(s, prop_name)); + for(i = 0; i < tab_len; i++) + fdt_put32(s, tab[i]); +} + +static void fdt_prop_u32(FDTState *s, const char *prop_name, uint32_t val) +{ + fdt_prop_tab_u32(s, prop_name, &val, 1); +} + +static void fdt_prop_tab_u64(FDTState *s, const char *prop_name, + uint64_t v0) +{ + uint32_t tab[2]; + tab[0] = v0 >> 32; + tab[1] = v0; + fdt_prop_tab_u32(s, prop_name, tab, 2); +} + +static void fdt_prop_tab_u64_2(FDTState *s, const char *prop_name, + uint64_t v0, uint64_t v1) +{ + uint32_t tab[4]; + tab[0] = v0 >> 32; + tab[1] = v0; + tab[2] = v1 >> 32; + tab[3] = v1; + fdt_prop_tab_u32(s, prop_name, tab, 4); +} + +static void fdt_prop_str(FDTState *s, const char *prop_name, + const char *str) +{ + fdt_prop(s, prop_name, str, strlen(str) + 1); +} + +/* NULL terminated string list */ +static void fdt_prop_tab_str(FDTState *s, const char *prop_name, + ...) +{ + va_list ap; + int size, str_size; + char *ptr, *tab; + + va_start(ap, prop_name); + size = 0; + for(;;) { + ptr = va_arg(ap, char *); + if (!ptr) + break; + str_size = strlen(ptr) + 1; + size += str_size; + } + va_end(ap); + + tab = malloc(size); + va_start(ap, prop_name); + size = 0; + for(;;) { + ptr = va_arg(ap, char *); + if (!ptr) + break; + str_size = strlen(ptr) + 1; + memcpy(tab + size, ptr, str_size); + size += str_size; + } + va_end(ap); + + fdt_prop(s, prop_name, tab, size); + free(tab); +} + +/* write the FDT to 'dst1'. return the FDT size in bytes */ +int fdt_output(FDTState *s, uint8_t *dst) +{ + struct fdt_header *h; + struct fdt_reserve_entry *re; + int dt_struct_size; + int dt_strings_size; + int pos; + + assert(s->open_node_count == 0); + + fdt_put32(s, FDT_END); + + dt_struct_size = s->tab_len * sizeof(uint32_t); + dt_strings_size = s->string_table_len; + + h = (struct fdt_header *)dst; + h->magic = cpu_to_be32(FDT_MAGIC); + h->version = cpu_to_be32(FDT_VERSION); + h->last_comp_version = cpu_to_be32(16); + h->boot_cpuid_phys = cpu_to_be32(0); + h->size_dt_strings = cpu_to_be32(dt_strings_size); + h->size_dt_struct = cpu_to_be32(dt_struct_size); + + pos = sizeof(struct fdt_header); + + h->off_dt_struct = cpu_to_be32(pos); + memcpy(dst + pos, s->tab, dt_struct_size); + pos += dt_struct_size; + + /* align to 8 */ + while ((pos & 7) != 0) { + dst[pos++] = 0; + } + h->off_mem_rsvmap = cpu_to_be32(pos); + re = (struct fdt_reserve_entry *)(dst + pos); + re->address = 0; /* no reserved entry */ + re->size = 0; + pos += sizeof(struct fdt_reserve_entry); + + h->off_dt_strings = cpu_to_be32(pos); + memcpy(dst + pos, s->string_table, dt_strings_size); + pos += dt_strings_size; + + /* align to 8, just in case */ + while ((pos & 7) != 0) { + dst[pos++] = 0; + } + + h->totalsize = cpu_to_be32(pos); + return pos; +} + +void fdt_end(FDTState *s) +{ + free(s->tab); + free(s->string_table); + free(s); +} + +static int riscv_build_fdt(RISCVMachine *m, uint8_t *dst, + uint64_t kernel_start, uint64_t kernel_size, + uint64_t initrd_start, uint64_t initrd_size, + const char *cmd_line) +{ + FDTState *s; + int size, max_xlen, i, cur_phandle, intc_phandle, plic_phandle; + char isa_string[128], *q; + uint32_t misa; + uint32_t tab[4]; + FBDevice *fb_dev; + + s = fdt_init(); + + cur_phandle = 1; + + fdt_begin_node(s, ""); + fdt_prop_u32(s, "#address-cells", 2); + fdt_prop_u32(s, "#size-cells", 2); + fdt_prop_str(s, "compatible", "ucbbar,riscvemu-bar_dev"); + fdt_prop_str(s, "model", "ucbbar,riscvemu-bare"); + + /* CPU list */ + fdt_begin_node(s, "cpus"); + fdt_prop_u32(s, "#address-cells", 1); + fdt_prop_u32(s, "#size-cells", 0); + fdt_prop_u32(s, "timebase-frequency", RTC_FREQ); + + /* cpu */ + fdt_begin_node_num(s, "cpu", 0); + fdt_prop_str(s, "device_type", "cpu"); + fdt_prop_u32(s, "reg", 0); + fdt_prop_str(s, "status", "okay"); + fdt_prop_str(s, "compatible", "riscv"); + + max_xlen = m->max_xlen; + misa = riscv_cpu_get_misa(m->cpu_state); + q = isa_string; + q += snprintf(isa_string, sizeof(isa_string), "rv%d", max_xlen); + for(i = 0; i < 26; i++) { + if (misa & (1 << i)) + *q++ = 'a' + i; + } + *q = '\0'; + fdt_prop_str(s, "riscv,isa", isa_string); + + fdt_prop_str(s, "mmu-type", max_xlen <= 32 ? "riscv,sv32" : "riscv,sv48"); + fdt_prop_u32(s, "clock-frequency", 2000000000); + + fdt_begin_node(s, "interrupt-controller"); + fdt_prop_u32(s, "#interrupt-cells", 1); + fdt_prop(s, "interrupt-controller", NULL, 0); + fdt_prop_str(s, "compatible", "riscv,cpu-intc"); + intc_phandle = cur_phandle++; + fdt_prop_u32(s, "phandle", intc_phandle); + fdt_end_node(s); /* interrupt-controller */ + + fdt_end_node(s); /* cpu */ + + fdt_end_node(s); /* cpus */ + + fdt_begin_node_num(s, "memory", RAM_BASE_ADDR); + fdt_prop_str(s, "device_type", "memory"); + tab[0] = (uint64_t)RAM_BASE_ADDR >> 32; + tab[1] = RAM_BASE_ADDR; + tab[2] = m->ram_size >> 32; + tab[3] = m->ram_size; + fdt_prop_tab_u32(s, "reg", tab, 4); + + fdt_end_node(s); /* memory */ + + fdt_begin_node(s, "htif"); + fdt_prop_str(s, "compatible", "ucb,htif0"); + fdt_end_node(s); /* htif */ + + fdt_begin_node(s, "soc"); + fdt_prop_u32(s, "#address-cells", 2); + fdt_prop_u32(s, "#size-cells", 2); + fdt_prop_tab_str(s, "compatible", + "ucbbar,riscvemu-bar-soc", "simple-bus", NULL); + fdt_prop(s, "ranges", NULL, 0); + + fdt_begin_node_num(s, "clint", CLINT_BASE_ADDR); + fdt_prop_str(s, "compatible", "riscv,clint0"); + + tab[0] = intc_phandle; + tab[1] = 3; /* M IPI irq */ + tab[2] = intc_phandle; + tab[3] = 7; /* M timer irq */ + fdt_prop_tab_u32(s, "interrupts-extended", tab, 4); + + fdt_prop_tab_u64_2(s, "reg", CLINT_BASE_ADDR, CLINT_SIZE); + + fdt_end_node(s); /* clint */ + + fdt_begin_node_num(s, "plic", PLIC_BASE_ADDR); + fdt_prop_u32(s, "#interrupt-cells", 1); + fdt_prop(s, "interrupt-controller", NULL, 0); + fdt_prop_str(s, "compatible", "riscv,plic0"); + fdt_prop_u32(s, "riscv,ndev", 31); + fdt_prop_tab_u64_2(s, "reg", PLIC_BASE_ADDR, PLIC_SIZE); + + tab[0] = intc_phandle; + tab[1] = 9; /* S ext irq */ + tab[2] = intc_phandle; + tab[3] = 11; /* M ext irq */ + fdt_prop_tab_u32(s, "interrupts-extended", tab, 4); + + plic_phandle = cur_phandle++; + fdt_prop_u32(s, "phandle", plic_phandle); + + fdt_end_node(s); /* plic */ + + for(i = 0; i < m->virtio_count; i++) { + fdt_begin_node_num(s, "virtio", VIRTIO_BASE_ADDR + i * VIRTIO_SIZE); + fdt_prop_str(s, "compatible", "virtio,mmio"); + fdt_prop_tab_u64_2(s, "reg", VIRTIO_BASE_ADDR + i * VIRTIO_SIZE, + VIRTIO_SIZE); + tab[0] = plic_phandle; + tab[1] = VIRTIO_IRQ + i; + fdt_prop_tab_u32(s, "interrupts-extended", tab, 2); + fdt_end_node(s); /* virtio */ + } + + fb_dev = m->common.fb_dev; + if (fb_dev) { + fdt_begin_node_num(s, "framebuffer", FRAMEBUFFER_BASE_ADDR); + fdt_prop_str(s, "compatible", "simple-framebuffer"); + fdt_prop_tab_u64_2(s, "reg", FRAMEBUFFER_BASE_ADDR, fb_dev->fb_size); + fdt_prop_u32(s, "width", fb_dev->width); + fdt_prop_u32(s, "height", fb_dev->height); + fdt_prop_u32(s, "stride", fb_dev->stride); + fdt_prop_str(s, "format", "a8r8g8b8"); + fdt_end_node(s); /* framebuffer */ + } + + fdt_end_node(s); /* soc */ + + fdt_begin_node(s, "chosen"); + fdt_prop_str(s, "bootargs", cmd_line ? cmd_line : ""); + if (kernel_size > 0) { + fdt_prop_tab_u64(s, "riscv,kernel-start", kernel_start); + fdt_prop_tab_u64(s, "riscv,kernel-end", kernel_start + kernel_size); + } + if (initrd_size > 0) { + fdt_prop_tab_u64(s, "linux,initrd-start", initrd_start); + fdt_prop_tab_u64(s, "linux,initrd-end", initrd_start + initrd_size); + } + + + fdt_end_node(s); /* chosen */ + + fdt_end_node(s); /* / */ + + size = fdt_output(s, dst); +#if 0 + { + FILE *f; + f = fopen("/tmp/riscvemu.dtb", "wb"); + fwrite(dst, 1, size, f); + fclose(f); + } +#endif + fdt_end(s); + return size; +} + +static void copy_bios(RISCVMachine *s, const uint8_t *buf, int buf_len, + const uint8_t *kernel_buf, int kernel_buf_len, + const uint8_t *initrd_buf, int initrd_buf_len, + const char *cmd_line) +{ + uint32_t fdt_addr, align, kernel_base, initrd_base; + uint8_t *ram_ptr; + uint32_t *q; + + if (buf_len > s->ram_size) { + vm_error("BIOS too big\n"); + exit(1); + } + + ram_ptr = get_ram_ptr(s, RAM_BASE_ADDR, TRUE); + memcpy(ram_ptr, buf, buf_len); + + kernel_base = 0; + if (kernel_buf_len > 0) { + /* copy the kernel if present */ + if (s->max_xlen == 32) + align = 4 << 20; /* 4 MB page align */ + else + align = 2 << 20; /* 2 MB page align */ + kernel_base = (buf_len + align - 1) & ~(align - 1); + memcpy(ram_ptr + kernel_base, kernel_buf, kernel_buf_len); + if (kernel_buf_len + kernel_base > s->ram_size) { + vm_error("kernel too big"); + exit(1); + } + } + + initrd_base = 0; + if (initrd_buf_len > 0) { + /* same allocation as QEMU */ + initrd_base = s->ram_size / 2; + if (initrd_base > (128 << 20)) + initrd_base = 128 << 20; + memcpy(ram_ptr + initrd_base, initrd_buf, initrd_buf_len); + if (initrd_buf_len + initrd_base > s->ram_size) { + vm_error("initrd too big"); + exit(1); + } + } + + ram_ptr = get_ram_ptr(s, 0, TRUE); + + fdt_addr = 0x1000 + 8 * 8; + + riscv_build_fdt(s, ram_ptr + fdt_addr, + RAM_BASE_ADDR + kernel_base, kernel_buf_len, + RAM_BASE_ADDR + initrd_base, initrd_buf_len, + cmd_line); + + /* jump_addr = 0x80000000 */ + + q = (uint32_t *)(ram_ptr + 0x1000); + q[0] = 0x297 + 0x80000000 - 0x1000; /* auipc t0, jump_addr */ + q[1] = 0x597; /* auipc a1, dtb */ + q[2] = 0x58593 + ((fdt_addr - 4) << 20); /* addi a1, a1, dtb */ + q[3] = 0xf1402573; /* csrr a0, mhartid */ + q[4] = 0x00028067; /* jalr zero, t0, jump_addr */ +} + +static void riscv_flush_tlb_write_range(void *opaque, uint8_t *ram_addr, + size_t ram_size) +{ + RISCVMachine *s = opaque; + riscv_cpu_flush_tlb_write_range_ram(s->cpu_state, ram_addr, ram_size); +} + +static void riscv_machine_set_defaults(VirtMachineParams *p) +{ +} + +static VirtMachine *riscv_machine_init(const VirtMachineParams *p) +{ + RISCVMachine *s; + VIRTIODevice *blk_dev; + int irq_num, i, max_xlen, ram_flags; + VIRTIOBusDef vbus_s, *vbus = &vbus_s; + + + if (!strcmp(p->machine_name, "riscv32")) { + max_xlen = 32; + } else if (!strcmp(p->machine_name, "riscv64")) { + max_xlen = 64; + } else if (!strcmp(p->machine_name, "riscv128")) { + max_xlen = 128; + } else { + vm_error("unsupported machine: %s\n", p->machine_name); + return NULL; + } + + s = mallocz(sizeof(*s)); + s->common.vmc = p->vmc; + s->ram_size = p->ram_size; + s->max_xlen = max_xlen; + s->mem_map = phys_mem_map_init(); + /* needed to handle the RAM dirty bits */ + s->mem_map->opaque = s; + s->mem_map->flush_tlb_write_range = riscv_flush_tlb_write_range; + + s->cpu_state = riscv_cpu_init(s->mem_map, max_xlen); + if (!s->cpu_state) { + vm_error("unsupported max_xlen=%d\n", max_xlen); + /* XXX: should free resources */ + return NULL; + } + /* RAM */ + ram_flags = 0; + cpu_register_ram(s->mem_map, RAM_BASE_ADDR, p->ram_size, ram_flags); + cpu_register_ram(s->mem_map, 0x00000000, LOW_RAM_SIZE, 0); + s->rtc_real_time = p->rtc_real_time; + if (p->rtc_real_time) { + s->rtc_start_time = rtc_get_real_time(s); + } + + cpu_register_device(s->mem_map, CLINT_BASE_ADDR, CLINT_SIZE, s, + clint_read, clint_write, DEVIO_SIZE32); + cpu_register_device(s->mem_map, PLIC_BASE_ADDR, PLIC_SIZE, s, + plic_read, plic_write, DEVIO_SIZE32); + for(i = 1; i < 32; i++) { + irq_init(&s->plic_irq[i], plic_set_irq, s, i); + } + + cpu_register_device(s->mem_map, HTIF_BASE_ADDR, 16, + s, htif_read, htif_write, DEVIO_SIZE32); + s->common.console = p->console; + + memset(vbus, 0, sizeof(*vbus)); + vbus->mem_map = s->mem_map; + vbus->addr = VIRTIO_BASE_ADDR; + irq_num = VIRTIO_IRQ; + + /* virtio console */ + if (p->console) { + vbus->irq = &s->plic_irq[irq_num]; + s->common.console_dev = virtio_console_init(vbus, p->console); + vbus->addr += VIRTIO_SIZE; + irq_num++; + s->virtio_count++; + } + + /* virtio net device */ + for(i = 0; i < p->eth_count; i++) { + vbus->irq = &s->plic_irq[irq_num]; + virtio_net_init(vbus, p->tab_eth[i].net); + s->common.net = p->tab_eth[i].net; + vbus->addr += VIRTIO_SIZE; + irq_num++; + s->virtio_count++; + } + + /* virtio block device */ + for(i = 0; i < p->drive_count; i++) { + vbus->irq = &s->plic_irq[irq_num]; + blk_dev = virtio_block_init(vbus, p->tab_drive[i].block_dev); + (void)blk_dev; + vbus->addr += VIRTIO_SIZE; + irq_num++; + s->virtio_count++; + } + + /* virtio filesystem */ + for(i = 0; i < p->fs_count; i++) { + VIRTIODevice *fs_dev; + vbus->irq = &s->plic_irq[irq_num]; + fs_dev = virtio_9p_init(vbus, p->tab_fs[i].fs_dev, + p->tab_fs[i].tag); + (void)fs_dev; + // virtio_set_debug(fs_dev, VIRTIO_DEBUG_9P); + vbus->addr += VIRTIO_SIZE; + irq_num++; + s->virtio_count++; + } + + if (p->display_device) { + FBDevice *fb_dev; + fb_dev = mallocz(sizeof(*fb_dev)); + s->common.fb_dev = fb_dev; + if (!strcmp(p->display_device, "simplefb")) { + simplefb_init(s->mem_map, + FRAMEBUFFER_BASE_ADDR, + fb_dev, + p->width, p->height); + + } else { + vm_error("unsupported display device: %s\n", p->display_device); + exit(1); + } + } + + if (p->input_device) { + if (!strcmp(p->input_device, "virtio")) { + vbus->irq = &s->plic_irq[irq_num]; + s->keyboard_dev = virtio_input_init(vbus, + VIRTIO_INPUT_TYPE_KEYBOARD); + vbus->addr += VIRTIO_SIZE; + irq_num++; + s->virtio_count++; + + vbus->irq = &s->plic_irq[irq_num]; + s->mouse_dev = virtio_input_init(vbus, + VIRTIO_INPUT_TYPE_TABLET); + vbus->addr += VIRTIO_SIZE; + irq_num++; + s->virtio_count++; + } else { + vm_error("unsupported input device: %s\n", p->input_device); + exit(1); + } + } + + if (!p->files[VM_FILE_BIOS].buf) { + vm_error("No bios found"); + } + + copy_bios(s, p->files[VM_FILE_BIOS].buf, p->files[VM_FILE_BIOS].len, + p->files[VM_FILE_KERNEL].buf, p->files[VM_FILE_KERNEL].len, + p->files[VM_FILE_INITRD].buf, p->files[VM_FILE_INITRD].len, + p->cmdline); + + return (VirtMachine *)s; +} + +static void riscv_machine_end(VirtMachine *s1) +{ + RISCVMachine *s = (RISCVMachine *)s1; + /* XXX: stop all */ + riscv_cpu_end(s->cpu_state); + phys_mem_map_end(s->mem_map); + free(s); +} + +/* in ms */ +static int riscv_machine_get_sleep_duration(VirtMachine *s1, int delay) +{ + RISCVMachine *m = (RISCVMachine *)s1; + RISCVCPUState *s = m->cpu_state; + int64_t delay1; + + /* wait for an event: the only asynchronous event is the RTC timer */ + if (!(riscv_cpu_get_mip(s) & MIP_MTIP)) { + delay1 = m->timecmp - rtc_get_time(m); + if (delay1 <= 0) { + riscv_cpu_set_mip(s, MIP_MTIP); + delay = 0; + } else { + /* convert delay to ms */ + delay1 = delay1 / (RTC_FREQ / 1000); + if (delay1 < delay) + delay = delay1; + } + } + if (!riscv_cpu_get_power_down(s)) + delay = 0; + return delay; +} + +static void riscv_machine_interp(VirtMachine *s1, int max_exec_cycle) +{ + RISCVMachine *s = (RISCVMachine *)s1; + riscv_cpu_interp(s->cpu_state, max_exec_cycle); +} + +static void riscv_vm_send_key_event(VirtMachine *s1, BOOL is_down, + uint16_t key_code) +{ + RISCVMachine *s = (RISCVMachine *)s1; + if (s->keyboard_dev) { + virtio_input_send_key_event(s->keyboard_dev, is_down, key_code); + } +} + +static BOOL riscv_vm_mouse_is_absolute(VirtMachine *s) +{ + return TRUE; +} + +static void riscv_vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz, + unsigned int buttons) +{ + RISCVMachine *s = (RISCVMachine *)s1; + if (s->mouse_dev) { + virtio_input_send_mouse_event(s->mouse_dev, dx, dy, dz, buttons); + } +} + +const VirtMachineClass riscv_machine_class = { + "riscv32,riscv64,riscv128", + riscv_machine_set_defaults, + riscv_machine_init, + riscv_machine_end, + riscv_machine_get_sleep_duration, + riscv_machine_interp, + riscv_vm_mouse_is_absolute, + riscv_vm_send_mouse_event, + riscv_vm_send_key_event, +}; diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c b/jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c new file mode 100644 index 0000000..c2afeba --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/sdl.c @@ -0,0 +1,275 @@ +/* + * SDL display driver + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> + +#include <SDL/SDL.h> + +#include "cutils.h" +#include "virtio.h" +#include "machine.h" + +#define KEYCODE_MAX 127 + +static SDL_Surface *screen; +static SDL_Surface *fb_surface; +static int screen_width, screen_height, fb_width, fb_height, fb_stride; +static SDL_Cursor *sdl_cursor_hidden; +static uint8_t key_pressed[KEYCODE_MAX + 1]; + +static void sdl_update_fb_surface(FBDevice *fb_dev) +{ + if (!fb_surface) + goto force_alloc; + if (fb_width != fb_dev->width || + fb_height != fb_dev->height || + fb_stride != fb_dev->stride) { + force_alloc: + if (fb_surface != NULL) + SDL_FreeSurface(fb_surface); + fb_width = fb_dev->width; + fb_height = fb_dev->height; + fb_stride = fb_dev->stride; + fb_surface = SDL_CreateRGBSurfaceFrom(fb_dev->fb_data, + fb_dev->width, fb_dev->height, + 32, fb_dev->stride, + 0x00ff0000, + 0x0000ff00, + 0x000000ff, + 0x00000000); + if (!fb_surface) { + fprintf(stderr, "Could not create SDL framebuffer surface\n"); + exit(1); + } + } +} + +static void sdl_update(FBDevice *fb_dev, void *opaque, + int x, int y, int w, int h) +{ + SDL_Rect r; + // printf("sdl_update: %d %d %d %d\n", x, y, w, h); + r.x = x; + r.y = y; + r.w = w; + r.h = h; + SDL_BlitSurface(fb_surface, &r, screen, &r); + SDL_UpdateRect(screen, r.x, r.y, r.w, r.h); +} + +#if defined(_WIN32) + +static int sdl_get_keycode(const SDL_KeyboardEvent *ev) +{ + return ev->keysym.scancode; +} + +#else + +/* we assume Xorg is used with a PC keyboard. Return 0 if no keycode found. */ +static int sdl_get_keycode(const SDL_KeyboardEvent *ev) +{ + int keycode; + keycode = ev->keysym.scancode; + if (keycode < 9) { + keycode = 0; + } else if (keycode < 127 + 8) { + keycode -= 8; + } else { + keycode = 0; + } + return keycode; +} + +#endif + +/* release all pressed keys */ +static void sdl_reset_keys(VirtMachine *m) +{ + int i; + + for(i = 1; i <= KEYCODE_MAX; i++) { + if (key_pressed[i]) { + vm_send_key_event(m, FALSE, i); + key_pressed[i] = FALSE; + } + } +} + +static void sdl_handle_key_event(const SDL_KeyboardEvent *ev, VirtMachine *m) +{ + int keycode, keypress; + + keycode = sdl_get_keycode(ev); + if (keycode) { + if (keycode == 0x3a || keycode ==0x45) { + /* SDL does not generate key up for numlock & caps lock */ + vm_send_key_event(m, TRUE, keycode); + vm_send_key_event(m, FALSE, keycode); + } else { + keypress = (ev->type == SDL_KEYDOWN); + if (keycode <= KEYCODE_MAX) + key_pressed[keycode] = keypress; + vm_send_key_event(m, keypress, keycode); + } + } else if (ev->type == SDL_KEYUP) { + /* workaround to reset the keyboard state (used when changing + desktop with ctrl-alt-x on Linux) */ + sdl_reset_keys(m); + } +} + +static void sdl_send_mouse_event(VirtMachine *m, int x1, int y1, + int dz, int state, BOOL is_absolute) +{ + int buttons, x, y; + + buttons = 0; + if (state & SDL_BUTTON(SDL_BUTTON_LEFT)) + buttons |= (1 << 0); + if (state & SDL_BUTTON(SDL_BUTTON_RIGHT)) + buttons |= (1 << 1); + if (state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) + buttons |= (1 << 2); + if (is_absolute) { + x = (x1 * 32768) / screen_width; + y = (y1 * 32768) / screen_height; + } else { + x = x1; + y = y1; + } + vm_send_mouse_event(m, x, y, dz, buttons); +} + +static void sdl_handle_mouse_motion_event(const SDL_Event *ev, VirtMachine *m) +{ + BOOL is_absolute = vm_mouse_is_absolute(m); + int x, y; + if (is_absolute) { + x = ev->motion.x; + y = ev->motion.y; + } else { + x = ev->motion.xrel; + y = ev->motion.yrel; + } + sdl_send_mouse_event(m, x, y, 0, ev->motion.state, is_absolute); +} + +static void sdl_handle_mouse_button_event(const SDL_Event *ev, VirtMachine *m) +{ + BOOL is_absolute = vm_mouse_is_absolute(m); + int state, dz; + + dz = 0; + if (ev->type == SDL_MOUSEBUTTONDOWN) { + if (ev->button.button == SDL_BUTTON_WHEELUP) { + dz = 1; + } else if (ev->button.button == SDL_BUTTON_WHEELDOWN) { + dz = -1; + } + } + + state = SDL_GetMouseState(NULL, NULL); + /* just in case */ + if (ev->type == SDL_MOUSEBUTTONDOWN) + state |= SDL_BUTTON(ev->button.button); + else + state &= ~SDL_BUTTON(ev->button.button); + + if (is_absolute) { + sdl_send_mouse_event(m, ev->button.x, ev->button.y, + dz, state, is_absolute); + } else { + sdl_send_mouse_event(m, 0, 0, dz, state, is_absolute); + } +} + +void sdl_refresh(VirtMachine *m) +{ + SDL_Event ev_s, *ev = &ev_s; + + if (!m->fb_dev) + return; + + sdl_update_fb_surface(m->fb_dev); + + m->fb_dev->refresh(m->fb_dev, sdl_update, NULL); + + while (SDL_PollEvent(ev)) { + switch (ev->type) { + case SDL_KEYDOWN: + case SDL_KEYUP: + sdl_handle_key_event(&ev->key, m); + break; + case SDL_MOUSEMOTION: + sdl_handle_mouse_motion_event(ev, m); + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + sdl_handle_mouse_button_event(ev, m); + break; + case SDL_QUIT: + exit(0); + } + } +} + +static void sdl_hide_cursor(void) +{ + uint8_t data = 0; + sdl_cursor_hidden = SDL_CreateCursor(&data, &data, 8, 1, 0, 0); + SDL_ShowCursor(1); + SDL_SetCursor(sdl_cursor_hidden); +} + +void sdl_init(int width, int height) +{ + int flags; + + screen_width = width; + screen_height = height; + + if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE)) { + fprintf(stderr, "Could not initialize SDL - exiting\n"); + exit(1); + } + + flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL; + screen = SDL_SetVideoMode(width, height, 0, flags); + if (!screen || !screen->pixels) { + fprintf(stderr, "Could not open SDL display\n"); + exit(1); + } + + SDL_WM_SetCaption("TinyEMU", "TinyEMU"); + + sdl_hide_cursor(); +} + diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c new file mode 100644 index 0000000..97bfbda --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.c @@ -0,0 +1,341 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ +#include <stdlib.h> +#include <string.h> +#include "cutils.h" +#include "sha256.h" + +#define LOAD32H(a, b) a = get_be32(b) +#define STORE32H(a, b) put_be32(b, a) +#define STORE64H(a, b) put_be64(b, a) +#define RORc(x, y) ( ((((uint32_t)(x)&0xFFFFFFFFUL)>>(uint32_t)((y)&31)) | ((uint32_t)(x)<<(uint32_t)(32-((y)&31)))) & 0xFFFFFFFFUL) + +#if defined(CONFIG_EMBUE) +#define LTC_SMALL_CODE +#endif + +/** + @file sha256.c + LTC_SHA256 by Tom St Denis +*/ + +#ifdef LTC_SMALL_CODE +/* the K array */ +static const uint32_t K[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, + 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL, + 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, + 0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL, + 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, + 0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, + 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, + 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL, + 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, + 0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; +#endif + +/* Various logical functions */ +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) RORc((x),(n)) +#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n)) +#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22)) +#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25)) +#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3)) +#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10)) + +/* compress 512-bits */ +static void sha256_compress(SHA256_CTX *s, unsigned char *buf) +{ + uint32_t S[8], W[64], t0, t1; +#ifdef LTC_SMALL_CODE + uint32_t t; +#endif + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = s->state[i]; + } + + /* copy the state into 512-bits into W[0..15] */ + for (i = 0; i < 16; i++) { + LOAD32H(W[i], buf + (4*i)); + } + + /* fill W[16..63] */ + for (i = 16; i < 64; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + } + + /* Compress */ +#ifdef LTC_SMALL_CODE +#define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 64; ++i) { + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i); + t = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; + S[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t; + } +#else +#define RND(a,b,c,d,e,f,g,h,i,ki) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c); \ + d += t0; \ + h = t0 + t1; + + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3); + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2); + +#undef RND + +#endif + + /* feedback */ + for (i = 0; i < 8; i++) { + s->state[i] = s->state[i] + S[i]; + } +} + +#ifdef LTC_CLEAN_STACK +static int sha256_compress(hash_state * md, unsigned char *buf) +{ + int err; + err = _sha256_compress(md, buf); + burn_stack(sizeof(uint32_t) * 74); + return err; +} +#endif + +/** + Initialize the hash state + @param md The hash state you wish to initialize + @return CRYPT_OK if successful +*/ +void SHA256_Init(SHA256_CTX *s) +{ + s->curlen = 0; + s->length = 0; + s->state[0] = 0x6A09E667UL; + s->state[1] = 0xBB67AE85UL; + s->state[2] = 0x3C6EF372UL; + s->state[3] = 0xA54FF53AUL; + s->state[4] = 0x510E527FUL; + s->state[5] = 0x9B05688CUL; + s->state[6] = 0x1F83D9ABUL; + s->state[7] = 0x5BE0CD19UL; +} + +void SHA256_Update(SHA256_CTX *s, const uint8_t *in, unsigned long inlen) +{ + unsigned long n; + + if (s->curlen > sizeof(s->buf)) { + abort(); + } + if ((s->length + inlen) < s->length) { + abort(); + } + while (inlen > 0) { + if (s->curlen == 0 && inlen >= 64) { + sha256_compress(s, (unsigned char *)in); + s->length += 64 * 8; + in += 64; + inlen -= 64; + } else { + n = min_int(inlen, 64 - s->curlen); + memcpy(s->buf + s->curlen, in, (size_t)n); + s->curlen += n; + in += n; + inlen -= n; + if (s->curlen == 64) { + sha256_compress(s, s->buf); + s->length += 8*64; + s->curlen = 0; + } + } + } } + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (32 bytes) + @return CRYPT_OK if successful +*/ +void SHA256_Final(uint8_t *out, SHA256_CTX *s) +{ + int i; + + if (s->curlen >= sizeof(s->buf)) { + abort(); + } + + + /* increase the length of the message */ + s->length += s->curlen * 8; + + /* append the '1' bit */ + s->buf[s->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 56 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (s->curlen > 56) { + while (s->curlen < 64) { + s->buf[s->curlen++] = (unsigned char)0; + } + sha256_compress(s, s->buf); + s->curlen = 0; + } + + /* pad upto 56 bytes of zeroes */ + while (s->curlen < 56) { + s->buf[s->curlen++] = (unsigned char)0; + } + + /* store length */ + STORE64H(s->length, s->buf+56); + sha256_compress(s, s->buf); + + /* copy output */ + for (i = 0; i < 8; i++) { + STORE32H(s->state[i], out+(4*i)); + } +#ifdef LTC_CLEAN_STACK + zeromem(md, sizeof(hash_state)); +#endif +} + +void SHA256(const uint8_t *buf, int buf_len, uint8_t *out) +{ + SHA256_CTX ctx; + + SHA256_Init(&ctx); + SHA256_Update(&ctx, buf, buf_len); + SHA256_Final(out, &ctx); +} + +#if 0 +/** + Self-test the hash + @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled +*/ +int sha256_test(void) +{ + #ifndef LTC_TEST + return CRYPT_NOP; + #else + static const struct { + char *msg; + unsigned char hash[32]; + } tests[] = { + { "abc", + { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, + 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, + 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, + 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad } + }, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, + 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, + 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, + 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 } + }, + }; + + int i; + unsigned char tmp[32]; + hash_state md; + + for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) { + sha256_init(&md); + sha256_process(&md, (unsigned char*)tests[i].msg, (unsigned long)strlen(tests[i].msg)); + sha256_done(&md, tmp); + if (XMEMCMP(tmp, tests[i].hash, 32) != 0) { + return CRYPT_FAIL_TESTVECTOR; + } + } + return CRYPT_OK; + #endif +} + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h new file mode 100644 index 0000000..b43115f --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/sha256.h @@ -0,0 +1,40 @@ +/* + * OpenSSL compatible SHA256 header + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef SHA256_H +#define SHA256_H + +#define SHA256_DIGEST_LENGTH 32 + +typedef struct { + uint64_t length; + uint32_t state[8], curlen; + uint8_t buf[64]; +} SHA256_CTX; + +void SHA256_Init(SHA256_CTX *s); +void SHA256_Update(SHA256_CTX *s, const uint8_t *in, unsigned long inlen); +void SHA256_Final(uint8_t *out, SHA256_CTX *s); +void SHA256(const uint8_t *buf, int buf_len, uint8_t *out); + +#endif /* SHA256_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c b/jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c new file mode 100644 index 0000000..5664cea --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/simplefb.c @@ -0,0 +1,127 @@ +/* + * Simple frame buffer + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "iomem.h" +#include "virtio.h" +#include "machine.h" + +//#define DEBUG_VBE + +#define FB_ALLOC_ALIGN 65536 + +struct SimpleFBState { + FBDevice *fb_dev; + int fb_page_count; + PhysMemoryRange *mem_range; +}; + +#define MAX_MERGE_DISTANCE 3 + +void simplefb_refresh(FBDevice *fb_dev, + SimpleFBDrawFunc *redraw_func, void *opaque, + PhysMemoryRange *mem_range, + int fb_page_count) +{ + const uint32_t *dirty_bits; + uint32_t dirty_val; + int y0, y1, page_y0, page_y1, byte_pos, page_index, bit_pos; + + dirty_bits = phys_mem_get_dirty_bits(mem_range); + + page_index = 0; + y0 = y1 = 0; + while (page_index < fb_page_count) { + dirty_val = dirty_bits[page_index >> 5]; + if (dirty_val != 0) { + bit_pos = 0; + while (dirty_val != 0) { + while (((dirty_val >> bit_pos) & 1) == 0) + bit_pos++; + dirty_val &= ~(1 << bit_pos); + + byte_pos = (page_index + bit_pos) * DEVRAM_PAGE_SIZE; + page_y0 = byte_pos / fb_dev->stride; + page_y1 = ((byte_pos + DEVRAM_PAGE_SIZE - 1) / fb_dev->stride) + 1; + page_y1 = min_int(page_y1, fb_dev->height); + if (y0 == y1) { + y0 = page_y0; + y1 = page_y1; + } else if (page_y0 <= (y1 + MAX_MERGE_DISTANCE)) { + /* union with current region */ + y1 = page_y1; + } else { + /* flush */ + redraw_func(fb_dev, opaque, + 0, y0, fb_dev->width, y1 - y0); + y0 = page_y0; + y1 = page_y1; + } + } + } + page_index += 32; + } + + if (y0 != y1) { + redraw_func(fb_dev, opaque, + 0, y0, fb_dev->width, y1 - y0); + } +} + +static void simplefb_refresh1(FBDevice *fb_dev, + SimpleFBDrawFunc *redraw_func, void *opaque) +{ + SimpleFBState *s = fb_dev->device_opaque; + simplefb_refresh(fb_dev, redraw_func, opaque, s->mem_range, + s->fb_page_count); +} + +SimpleFBState *simplefb_init(PhysMemoryMap *map, uint64_t phys_addr, + FBDevice *fb_dev, int width, int height) +{ + SimpleFBState *s; + + s = mallocz(sizeof(*s)); + s->fb_dev = fb_dev; + + fb_dev->width = width; + fb_dev->height = height; + fb_dev->stride = width * 4; + fb_dev->fb_size = (height * fb_dev->stride + FB_ALLOC_ALIGN - 1) & ~(FB_ALLOC_ALIGN - 1); + s->fb_page_count = fb_dev->fb_size >> DEVRAM_PAGE_SIZE_LOG2; + + s->mem_range = cpu_register_ram(map, phys_addr, fb_dev->fb_size, + DEVRAM_FLAG_DIRTY_BITS); + + fb_dev->fb_data = s->mem_range->phys_mem; + fb_dev->device_opaque = s; + fb_dev->refresh = simplefb_refresh1; + return s; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c new file mode 100644 index 0000000..3e5f457 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.c @@ -0,0 +1,314 @@ +/* + * QEMU BOOTP/DHCP server + * + * Copyright (c) 2004 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "slirp.h" + +/* XXX: only DHCP is supported */ + +#define LEASE_TIME (24 * 3600) + +static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE }; + +#ifdef DEBUG +#define DPRINTF(fmt, ...) \ +do if (slirp_debug & DBG_CALL) { fprintf(dfd, fmt, ## __VA_ARGS__); fflush(dfd); } while (0) +#else +#define DPRINTF(fmt, ...) do{}while(0) +#endif + +static BOOTPClient *get_new_addr(Slirp *slirp, struct in_addr *paddr, + const uint8_t *macaddr) +{ + BOOTPClient *bc; + int i; + + for(i = 0; i < NB_BOOTP_CLIENTS; i++) { + bc = &slirp->bootp_clients[i]; + if (!bc->allocated || !memcmp(macaddr, bc->macaddr, 6)) + goto found; + } + return NULL; + found: + bc = &slirp->bootp_clients[i]; + bc->allocated = 1; + paddr->s_addr = slirp->vdhcp_startaddr.s_addr + htonl(i); + return bc; +} + +static BOOTPClient *request_addr(Slirp *slirp, const struct in_addr *paddr, + const uint8_t *macaddr) +{ + uint32_t req_addr = ntohl(paddr->s_addr); + uint32_t dhcp_addr = ntohl(slirp->vdhcp_startaddr.s_addr); + BOOTPClient *bc; + + if (req_addr >= dhcp_addr && + req_addr < (dhcp_addr + NB_BOOTP_CLIENTS)) { + bc = &slirp->bootp_clients[req_addr - dhcp_addr]; + if (!bc->allocated || !memcmp(macaddr, bc->macaddr, 6)) { + bc->allocated = 1; + return bc; + } + } + return NULL; +} + +static BOOTPClient *find_addr(Slirp *slirp, struct in_addr *paddr, + const uint8_t *macaddr) +{ + BOOTPClient *bc; + int i; + + for(i = 0; i < NB_BOOTP_CLIENTS; i++) { + if (!memcmp(macaddr, slirp->bootp_clients[i].macaddr, 6)) + goto found; + } + return NULL; + found: + bc = &slirp->bootp_clients[i]; + bc->allocated = 1; + paddr->s_addr = slirp->vdhcp_startaddr.s_addr + htonl(i); + return bc; +} + +static void dhcp_decode(const struct bootp_t *bp, int *pmsg_type, + struct in_addr *preq_addr) +{ + const uint8_t *p, *p_end; + int len, tag; + + *pmsg_type = 0; + preq_addr->s_addr = htonl(0L); + + p = bp->bp_vend; + p_end = p + DHCP_OPT_LEN; + if (memcmp(p, rfc1533_cookie, 4) != 0) + return; + p += 4; + while (p < p_end) { + tag = p[0]; + if (tag == RFC1533_PAD) { + p++; + } else if (tag == RFC1533_END) { + break; + } else { + p++; + if (p >= p_end) + break; + len = *p++; + DPRINTF("dhcp: tag=%d len=%d\n", tag, len); + + switch(tag) { + case RFC2132_MSG_TYPE: + if (len >= 1) + *pmsg_type = p[0]; + break; + case RFC2132_REQ_ADDR: + if (len >= 4) { + memcpy(&(preq_addr->s_addr), p, 4); + } + break; + default: + break; + } + p += len; + } + } + if (*pmsg_type == DHCPREQUEST && preq_addr->s_addr == htonl(0L) && + bp->bp_ciaddr.s_addr) { + memcpy(&(preq_addr->s_addr), &bp->bp_ciaddr, 4); + } +} + +static void bootp_reply(Slirp *slirp, const struct bootp_t *bp) +{ + BOOTPClient *bc = NULL; + struct mbuf *m; + struct bootp_t *rbp; + struct sockaddr_in saddr, daddr; + struct in_addr preq_addr; + int dhcp_msg_type, val; + uint8_t *q; + + /* extract exact DHCP msg type */ + dhcp_decode(bp, &dhcp_msg_type, &preq_addr); + DPRINTF("bootp packet op=%d msgtype=%d", bp->bp_op, dhcp_msg_type); + if (preq_addr.s_addr != htonl(0L)) + DPRINTF(" req_addr=%08x\n", ntohl(preq_addr.s_addr)); + else + DPRINTF("\n"); + + if (dhcp_msg_type == 0) + dhcp_msg_type = DHCPREQUEST; /* Force reply for old BOOTP clients */ + + if (dhcp_msg_type != DHCPDISCOVER && + dhcp_msg_type != DHCPREQUEST) + return; + /* XXX: this is a hack to get the client mac address */ + memcpy(slirp->client_ethaddr, bp->bp_hwaddr, 6); + + m = m_get(slirp); + if (!m) { + return; + } + m->m_data += IF_MAXLINKHDR; + rbp = (struct bootp_t *)m->m_data; + m->m_data += sizeof(struct udpiphdr); + memset(rbp, 0, sizeof(struct bootp_t)); + + if (dhcp_msg_type == DHCPDISCOVER) { + if (preq_addr.s_addr != htonl(0L)) { + bc = request_addr(slirp, &preq_addr, slirp->client_ethaddr); + if (bc) { + daddr.sin_addr = preq_addr; + } + } + if (!bc) { + new_addr: + bc = get_new_addr(slirp, &daddr.sin_addr, slirp->client_ethaddr); + if (!bc) { + DPRINTF("no address left\n"); + return; + } + } + memcpy(bc->macaddr, slirp->client_ethaddr, 6); + } else if (preq_addr.s_addr != htonl(0L)) { + bc = request_addr(slirp, &preq_addr, slirp->client_ethaddr); + if (bc) { + daddr.sin_addr = preq_addr; + memcpy(bc->macaddr, slirp->client_ethaddr, 6); + } else { + daddr.sin_addr.s_addr = 0; + } + } else { + bc = find_addr(slirp, &daddr.sin_addr, bp->bp_hwaddr); + if (!bc) { + /* if never assigned, behaves as if it was already + assigned (windows fix because it remembers its address) */ + goto new_addr; + } + } + + saddr.sin_addr = slirp->vhost_addr; + saddr.sin_port = htons(BOOTP_SERVER); + + daddr.sin_port = htons(BOOTP_CLIENT); + + rbp->bp_op = BOOTP_REPLY; + rbp->bp_xid = bp->bp_xid; + rbp->bp_htype = 1; + rbp->bp_hlen = 6; + memcpy(rbp->bp_hwaddr, bp->bp_hwaddr, 6); + + rbp->bp_yiaddr = daddr.sin_addr; /* Client IP address */ + rbp->bp_siaddr = saddr.sin_addr; /* Server IP address */ + + q = rbp->bp_vend; + memcpy(q, rfc1533_cookie, 4); + q += 4; + + if (bc) { + DPRINTF("%s addr=%08x\n", + (dhcp_msg_type == DHCPDISCOVER) ? "offered" : "ack'ed", + ntohl(daddr.sin_addr.s_addr)); + + if (dhcp_msg_type == DHCPDISCOVER) { + *q++ = RFC2132_MSG_TYPE; + *q++ = 1; + *q++ = DHCPOFFER; + } else /* DHCPREQUEST */ { + *q++ = RFC2132_MSG_TYPE; + *q++ = 1; + *q++ = DHCPACK; + } + + if (slirp->bootp_filename) + snprintf((char *)rbp->bp_file, sizeof(rbp->bp_file), "%s", + slirp->bootp_filename); + + *q++ = RFC2132_SRV_ID; + *q++ = 4; + memcpy(q, &saddr.sin_addr, 4); + q += 4; + + *q++ = RFC1533_NETMASK; + *q++ = 4; + memcpy(q, &slirp->vnetwork_mask, 4); + q += 4; + + if (!slirp->restricted) { + *q++ = RFC1533_GATEWAY; + *q++ = 4; + memcpy(q, &saddr.sin_addr, 4); + q += 4; + + *q++ = RFC1533_DNS; + *q++ = 4; + memcpy(q, &slirp->vnameserver_addr, 4); + q += 4; + } + + *q++ = RFC2132_LEASE_TIME; + *q++ = 4; + val = htonl(LEASE_TIME); + memcpy(q, &val, 4); + q += 4; + + if (*slirp->client_hostname) { + val = strlen(slirp->client_hostname); + *q++ = RFC1533_HOSTNAME; + *q++ = val; + memcpy(q, slirp->client_hostname, val); + q += val; + } + } else { + static const char nak_msg[] = "requested address not available"; + + DPRINTF("nak'ed addr=%08x\n", ntohl(preq_addr->s_addr)); + + *q++ = RFC2132_MSG_TYPE; + *q++ = 1; + *q++ = DHCPNAK; + + *q++ = RFC2132_MESSAGE; + *q++ = sizeof(nak_msg) - 1; + memcpy(q, nak_msg, sizeof(nak_msg) - 1); + q += sizeof(nak_msg) - 1; + } + *q = RFC1533_END; + + daddr.sin_addr.s_addr = 0xffffffffu; + + m->m_len = sizeof(struct bootp_t) - + sizeof(struct ip) - sizeof(struct udphdr); + udp_output2(NULL, m, &saddr, &daddr, IPTOS_LOWDELAY); +} + +void bootp_input(struct mbuf *m) +{ + struct bootp_t *bp = mtod(m, struct bootp_t *); + + if (bp->bp_op == BOOTP_REQUEST) { + bootp_reply(m->slirp, bp); + } +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h new file mode 100644 index 0000000..30c30ab --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/bootp.h @@ -0,0 +1,122 @@ +/* bootp/dhcp defines */ + +#define BOOTP_SERVER 67 +#define BOOTP_CLIENT 68 + +#define BOOTP_REQUEST 1 +#define BOOTP_REPLY 2 + +#define RFC1533_COOKIE 99, 130, 83, 99 +#define RFC1533_PAD 0 +#define RFC1533_NETMASK 1 +#define RFC1533_TIMEOFFSET 2 +#define RFC1533_GATEWAY 3 +#define RFC1533_TIMESERVER 4 +#define RFC1533_IEN116NS 5 +#define RFC1533_DNS 6 +#define RFC1533_LOGSERVER 7 +#define RFC1533_COOKIESERVER 8 +#define RFC1533_LPRSERVER 9 +#define RFC1533_IMPRESSSERVER 10 +#define RFC1533_RESOURCESERVER 11 +#define RFC1533_HOSTNAME 12 +#define RFC1533_BOOTFILESIZE 13 +#define RFC1533_MERITDUMPFILE 14 +#define RFC1533_DOMAINNAME 15 +#define RFC1533_SWAPSERVER 16 +#define RFC1533_ROOTPATH 17 +#define RFC1533_EXTENSIONPATH 18 +#define RFC1533_IPFORWARDING 19 +#define RFC1533_IPSOURCEROUTING 20 +#define RFC1533_IPPOLICYFILTER 21 +#define RFC1533_IPMAXREASSEMBLY 22 +#define RFC1533_IPTTL 23 +#define RFC1533_IPMTU 24 +#define RFC1533_IPMTUPLATEAU 25 +#define RFC1533_INTMTU 26 +#define RFC1533_INTLOCALSUBNETS 27 +#define RFC1533_INTBROADCAST 28 +#define RFC1533_INTICMPDISCOVER 29 +#define RFC1533_INTICMPRESPOND 30 +#define RFC1533_INTROUTEDISCOVER 31 +#define RFC1533_INTROUTESOLICIT 32 +#define RFC1533_INTSTATICROUTES 33 +#define RFC1533_LLTRAILERENCAP 34 +#define RFC1533_LLARPCACHETMO 35 +#define RFC1533_LLETHERNETENCAP 36 +#define RFC1533_TCPTTL 37 +#define RFC1533_TCPKEEPALIVETMO 38 +#define RFC1533_TCPKEEPALIVEGB 39 +#define RFC1533_NISDOMAIN 40 +#define RFC1533_NISSERVER 41 +#define RFC1533_NTPSERVER 42 +#define RFC1533_VENDOR 43 +#define RFC1533_NBNS 44 +#define RFC1533_NBDD 45 +#define RFC1533_NBNT 46 +#define RFC1533_NBSCOPE 47 +#define RFC1533_XFS 48 +#define RFC1533_XDM 49 + +#define RFC2132_REQ_ADDR 50 +#define RFC2132_LEASE_TIME 51 +#define RFC2132_MSG_TYPE 53 +#define RFC2132_SRV_ID 54 +#define RFC2132_PARAM_LIST 55 +#define RFC2132_MESSAGE 56 +#define RFC2132_MAX_SIZE 57 +#define RFC2132_RENEWAL_TIME 58 +#define RFC2132_REBIND_TIME 59 + +#define DHCPDISCOVER 1 +#define DHCPOFFER 2 +#define DHCPREQUEST 3 +#define DHCPACK 5 +#define DHCPNAK 6 + +#define RFC1533_VENDOR_MAJOR 0 +#define RFC1533_VENDOR_MINOR 0 + +#define RFC1533_VENDOR_MAGIC 128 +#define RFC1533_VENDOR_ADDPARM 129 +#define RFC1533_VENDOR_ETHDEV 130 +#define RFC1533_VENDOR_HOWTO 132 +#define RFC1533_VENDOR_MNUOPTS 160 +#define RFC1533_VENDOR_SELECTION 176 +#define RFC1533_VENDOR_MOTD 184 +#define RFC1533_VENDOR_NUMOFMOTD 8 +#define RFC1533_VENDOR_IMG 192 +#define RFC1533_VENDOR_NUMOFIMG 16 + +#define RFC1533_END 255 +#define BOOTP_VENDOR_LEN 64 +#define DHCP_OPT_LEN 312 + +struct bootp_t { + struct ip ip; + struct udphdr udp; + uint8_t bp_op; + uint8_t bp_htype; + uint8_t bp_hlen; + uint8_t bp_hops; + uint32_t bp_xid; + uint16_t bp_secs; + uint16_t unused; + struct in_addr bp_ciaddr; + struct in_addr bp_yiaddr; + struct in_addr bp_siaddr; + struct in_addr bp_giaddr; + uint8_t bp_hwaddr[16]; + uint8_t bp_sname[64]; + uint8_t bp_file[128]; + uint8_t bp_vend[DHCP_OPT_LEN]; +}; + +typedef struct { + uint16_t allocated; + uint8_t macaddr[6]; +} BOOTPClient; + +#define NB_BOOTP_CLIENTS 16 + +void bootp_input(struct mbuf *m); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c new file mode 100644 index 0000000..5aa9060 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/cksum.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) 1988, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 + * in_cksum.c,v 1.2 1994/08/02 07:48:16 davidg Exp + */ + +#include "slirp.h" + +/* + * Checksum routine for Internet Protocol family headers (Portable Version). + * + * This routine is very heavily used in the network + * code and should be modified for each CPU to be as fast as possible. + * + * XXX Since we will never span more than 1 mbuf, we can optimise this + */ + +#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) +#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; \ + (void)ADDCARRY(sum);} + +int cksum(struct mbuf *m, int len) +{ + register uint16_t *w; + register int sum = 0; + register int mlen = 0; + int byte_swapped = 0; + + union { + uint8_t c[2]; + uint16_t s; + } s_util; + union { + uint16_t s[2]; + uint32_t l; + } l_util; + + if (m->m_len == 0) + goto cont; + w = mtod(m, uint16_t *); + + mlen = m->m_len; + + if (len < mlen) + mlen = len; +#ifdef DEBUG + len -= mlen; +#endif + /* + * Force to even boundary. + */ + if ((1 & (long) w) && (mlen > 0)) { + REDUCE; + sum <<= 8; + s_util.c[0] = *(uint8_t *)w; + w = (uint16_t *)((int8_t *)w + 1); + mlen--; + byte_swapped = 1; + } + /* + * Unroll the loop to make overhead from + * branches &c small. + */ + while ((mlen -= 32) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7]; + sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11]; + sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15]; + w += 16; + } + mlen += 32; + while ((mlen -= 8) >= 0) { + sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; + w += 4; + } + mlen += 8; + if (mlen == 0 && byte_swapped == 0) + goto cont; + REDUCE; + while ((mlen -= 2) >= 0) { + sum += *w++; + } + + if (byte_swapped) { + REDUCE; + sum <<= 8; + if (mlen == -1) { + s_util.c[1] = *(uint8_t *)w; + sum += s_util.s; + mlen = 0; + } else + + mlen = -1; + } else if (mlen == -1) + s_util.c[0] = *(uint8_t *)w; + +cont: +#ifdef DEBUG + if (len) { + DEBUG_ERROR((dfd, "cksum: out of data\n")); + DEBUG_ERROR((dfd, " len = %d\n", len)); + } +#endif + if (mlen == -1) { + /* The last mbuf has odd # of bytes. Follow the + standard (the odd byte may be shifted left by 8 bits + or not as determined by endian-ness of the machine) */ + s_util.c[1] = 0; + sum += s_util.s; + } + REDUCE; + return (~sum & 0xffff); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h new file mode 100644 index 0000000..6cfa61e --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/debug.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +//#define DEBUG 1 + +#ifdef DEBUG + +#define DBG_CALL 0x1 +#define DBG_MISC 0x2 +#define DBG_ERROR 0x4 + +#define dfd stderr + +extern int slirp_debug; + +#define DEBUG_CALL(x) if (slirp_debug & DBG_CALL) { fprintf(dfd, "%s...\n", x); fflush(dfd); } +#define DEBUG_ARG(x, y) if (slirp_debug & DBG_CALL) { fputc(' ', dfd); fprintf(dfd, x, y); fputc('\n', dfd); fflush(dfd); } +#define DEBUG_ARGS(x) if (slirp_debug & DBG_CALL) { fprintf x ; fflush(dfd); } +#define DEBUG_MISC(x) if (slirp_debug & DBG_MISC) { fprintf x ; fflush(dfd); } +#define DEBUG_ERROR(x) if (slirp_debug & DBG_ERROR) {fprintf x ; fflush(dfd); } + +#else + +#define DEBUG_CALL(x) +#define DEBUG_ARG(x, y) +#define DEBUG_ARGS(x) +#define DEBUG_MISC(x) +#define DEBUG_ERROR(x) + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c new file mode 100644 index 0000000..e6d114a --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" + +#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm)) + +static void +ifs_insque(struct mbuf *ifm, struct mbuf *ifmhead) +{ + ifm->ifs_next = ifmhead->ifs_next; + ifmhead->ifs_next = ifm; + ifm->ifs_prev = ifmhead; + ifm->ifs_next->ifs_prev = ifm; +} + +static void +ifs_remque(struct mbuf *ifm) +{ + ifm->ifs_prev->ifs_next = ifm->ifs_next; + ifm->ifs_next->ifs_prev = ifm->ifs_prev; +} + +void +if_init(Slirp *slirp) +{ + slirp->if_fastq.ifq_next = slirp->if_fastq.ifq_prev = &slirp->if_fastq; + slirp->if_batchq.ifq_next = slirp->if_batchq.ifq_prev = &slirp->if_batchq; + slirp->next_m = &slirp->if_batchq; +} + +/* + * if_output: Queue packet into an output queue. + * There are 2 output queue's, if_fastq and if_batchq. + * Each output queue is a doubly linked list of double linked lists + * of mbufs, each list belonging to one "session" (socket). This + * way, we can output packets fairly by sending one packet from each + * session, instead of all the packets from one session, then all packets + * from the next session, etc. Packets on the if_fastq get absolute + * priority, but if one session hogs the link, it gets "downgraded" + * to the batchq until it runs out of packets, then it'll return + * to the fastq (eg. if the user does an ls -alR in a telnet session, + * it'll temporarily get downgraded to the batchq) + */ +void +if_output(struct socket *so, struct mbuf *ifm) +{ + Slirp *slirp = ifm->slirp; + struct mbuf *ifq; + int on_fastq = 1; + + DEBUG_CALL("if_output"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("ifm = %lx", (long)ifm); + + /* + * First remove the mbuf from m_usedlist, + * since we're gonna use m_next and m_prev ourselves + * XXX Shouldn't need this, gotta change dtom() etc. + */ + if (ifm->m_flags & M_USEDLIST) { + remque(ifm); + ifm->m_flags &= ~M_USEDLIST; + } + + /* + * See if there's already a batchq list for this session. + * This can include an interactive session, which should go on fastq, + * but gets too greedy... hence it'll be downgraded from fastq to batchq. + * We mustn't put this packet back on the fastq (or we'll send it out of order) + * XXX add cache here? + */ + for (ifq = slirp->if_batchq.ifq_prev; ifq != &slirp->if_batchq; + ifq = ifq->ifq_prev) { + if (so == ifq->ifq_so) { + /* A match! */ + ifm->ifq_so = so; + ifs_insque(ifm, ifq->ifs_prev); + goto diddit; + } + } + + /* No match, check which queue to put it on */ + if (so && (so->so_iptos & IPTOS_LOWDELAY)) { + ifq = slirp->if_fastq.ifq_prev; + on_fastq = 1; + /* + * Check if this packet is a part of the last + * packet's session + */ + if (ifq->ifq_so == so) { + ifm->ifq_so = so; + ifs_insque(ifm, ifq->ifs_prev); + goto diddit; + } + } else + ifq = slirp->if_batchq.ifq_prev; + + /* Create a new doubly linked list for this session */ + ifm->ifq_so = so; + ifs_init(ifm); + insque(ifm, ifq); + +diddit: + slirp->if_queued++; + + if (so) { + /* Update *_queued */ + so->so_queued++; + so->so_nqueued++; + /* + * Check if the interactive session should be downgraded to + * the batchq. A session is downgraded if it has queued 6 + * packets without pausing, and at least 3 of those packets + * have been sent over the link + * (XXX These are arbitrary numbers, probably not optimal..) + */ + if (on_fastq && ((so->so_nqueued >= 6) && + (so->so_nqueued - so->so_queued) >= 3)) { + + /* Remove from current queue... */ + remque(ifm->ifs_next); + + /* ...And insert in the new. That'll teach ya! */ + insque(ifm->ifs_next, &slirp->if_batchq); + } + } + +#ifndef FULL_BOLT + /* + * This prevents us from malloc()ing too many mbufs + */ + if_start(ifm->slirp); +#endif +} + +/* + * Send a packet + * We choose a packet based on it's position in the output queues; + * If there are packets on the fastq, they are sent FIFO, before + * everything else. Otherwise we choose the first packet from the + * batchq and send it. the next packet chosen will be from the session + * after this one, then the session after that one, and so on.. So, + * for example, if there are 3 ftp session's fighting for bandwidth, + * one packet will be sent from the first session, then one packet + * from the second session, then one packet from the third, then back + * to the first, etc. etc. + */ +void +if_start(Slirp *slirp) +{ + struct mbuf *ifm, *ifqt; + + DEBUG_CALL("if_start"); + + if (slirp->if_queued == 0) + return; /* Nothing to do */ + + again: + /* check if we can really output */ + if (!slirp_can_output(slirp->opaque)) + return; + + /* + * See which queue to get next packet from + * If there's something in the fastq, select it immediately + */ + if (slirp->if_fastq.ifq_next != &slirp->if_fastq) { + ifm = slirp->if_fastq.ifq_next; + } else { + /* Nothing on fastq, see if next_m is valid */ + if (slirp->next_m != &slirp->if_batchq) + ifm = slirp->next_m; + else + ifm = slirp->if_batchq.ifq_next; + + /* Set which packet to send on next iteration */ + slirp->next_m = ifm->ifq_next; + } + /* Remove it from the queue */ + ifqt = ifm->ifq_prev; + remque(ifm); + slirp->if_queued--; + + /* If there are more packets for this session, re-queue them */ + if (ifm->ifs_next != /* ifm->ifs_prev != */ ifm) { + insque(ifm->ifs_next, ifqt); + ifs_remque(ifm); + } + + /* Update so_queued */ + if (ifm->ifq_so) { + if (--ifm->ifq_so->so_queued == 0) + /* If there's no more queued, reset nqueued */ + ifm->ifq_so->so_nqueued = 0; + } + + /* Encapsulate the packet for sending */ + if_encap(slirp, (uint8_t *)ifm->m_data, ifm->m_len); + + m_free(ifm); + + if (slirp->if_queued) + goto again; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h new file mode 100644 index 0000000..2dac1c7 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/if.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#ifndef _IF_H_ +#define _IF_H_ + +#define IF_COMPRESS 0x01 /* We want compression */ +#define IF_NOCOMPRESS 0x02 /* Do not do compression */ +#define IF_AUTOCOMP 0x04 /* Autodetect (default) */ +#define IF_NOCIDCOMP 0x08 /* CID compression */ + +#define IF_MTU 1500 +#define IF_MRU 1500 +#define IF_COMP IF_AUTOCOMP /* Flags for compression */ + +/* 2 for alignment, 14 for ethernet, 40 for TCP/IP */ +#define IF_MAXLINKHDR (2 + 14 + 40) + +#define ifs_init(ifm) ((ifm)->ifs_next = (ifm)->ifs_prev = (ifm)) + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h new file mode 100644 index 0000000..48ea38e --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip.h @@ -0,0 +1,253 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip.h 8.1 (Berkeley) 6/10/93 + * ip.h,v 1.3 1994/08/21 05:27:30 paul Exp + */ + +#ifndef _IP_H_ +#define _IP_H_ + +#ifdef HOST_WORDS_BIGENDIAN +# ifndef NTOHL +# define NTOHL(d) +# endif +# ifndef NTOHS +# define NTOHS(d) +# endif +# ifndef HTONL +# define HTONL(d) +# endif +# ifndef HTONS +# define HTONS(d) +# endif +#else +# ifndef NTOHL +# define NTOHL(d) ((d) = ntohl((d))) +# endif +# ifndef NTOHS +# define NTOHS(d) ((d) = ntohs((uint16_t)(d))) +# endif +# ifndef HTONL +# define HTONL(d) ((d) = htonl((d))) +# endif +# ifndef HTONS +# define HTONS(d) ((d) = htons((uint16_t)(d))) +# endif +#endif + +typedef uint32_t n_long; /* long as received from the net */ + +/* + * Definitions for internet protocol version 4. + * Per RFC 791, September 1981. + */ +#define IPVERSION 4 + +/* + * Structure of an internet header, naked of options. + */ +struct ip { +#ifdef HOST_WORDS_BIGENDIAN + u_int ip_v:4, /* version */ + ip_hl:4; /* header length */ +#else + u_int ip_hl:4, /* header length */ + ip_v:4; /* version */ +#endif + uint8_t ip_tos; /* type of service */ + uint16_t ip_len; /* total length */ + uint16_t ip_id; /* identification */ + uint16_t ip_off; /* fragment offset field */ +#define IP_DF 0x4000 /* don't fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + uint8_t ip_ttl; /* time to live */ + uint8_t ip_p; /* protocol */ + uint16_t ip_sum; /* checksum */ + struct in_addr ip_src,ip_dst; /* source and dest address */ +} __attribute__((packed)); + +#define IP_MAXPACKET 65535 /* maximum packet size */ + +/* + * Definitions for IP type of service (ip_tos) + */ +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 + +/* + * Definitions for options. + */ +#define IPOPT_COPIED(o) ((o)&0x80) +#define IPOPT_CLASS(o) ((o)&0x60) +#define IPOPT_NUMBER(o) ((o)&0x1f) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_DEBMEAS 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_EOL 0 /* end of option list */ +#define IPOPT_NOP 1 /* no operation */ + +#define IPOPT_RR 7 /* record packet route */ +#define IPOPT_TS 68 /* timestamp */ +#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ +#define IPOPT_LSRR 131 /* loose source route */ +#define IPOPT_SATID 136 /* satnet id */ +#define IPOPT_SSRR 137 /* strict source route */ + +/* + * Offsets to fields in options other than EOL and NOP. + */ +#define IPOPT_OPTVAL 0 /* option ID */ +#define IPOPT_OLEN 1 /* option length */ +#define IPOPT_OFFSET 2 /* offset within option */ +#define IPOPT_MINOFF 4 /* min value of above */ + +/* + * Time stamp option structure. + */ +struct ip_timestamp { + uint8_t ipt_code; /* IPOPT_TS */ + uint8_t ipt_len; /* size of structure (variable) */ + uint8_t ipt_ptr; /* index of current entry */ +#ifdef HOST_WORDS_BIGENDIAN + u_int ipt_oflw:4, /* overflow counter */ + ipt_flg:4; /* flags, see below */ +#else + u_int ipt_flg:4, /* flags, see below */ + ipt_oflw:4; /* overflow counter */ +#endif + union ipt_timestamp { + n_long ipt_time[1]; + struct ipt_ta { + struct in_addr ipt_addr; + n_long ipt_time; + } ipt_ta[1]; + } ipt_timestamp; +} __attribute__((packed)); + +/* flag bits for ipt_flg */ +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +/* bits for security (not byte swapped) */ +#define IPOPT_SECUR_UNCLASS 0x0000 +#define IPOPT_SECUR_CONFID 0xf135 +#define IPOPT_SECUR_EFTO 0x789a +#define IPOPT_SECUR_MMMM 0xbc4d +#define IPOPT_SECUR_RESTR 0xaf13 +#define IPOPT_SECUR_SECRET 0xd788 +#define IPOPT_SECUR_TOPSECRET 0x6bc5 + +/* + * Internet implementation parameters. + */ +#define MAXTTL 255 /* maximum time to live (seconds) */ +#define IPDEFTTL 64 /* default ttl, from RFC 1340 */ +#define IPFRAGTTL 60 /* time to live for frags, slowhz */ +#define IPTTLDEC 1 /* subtracted when forwarding */ + +#define IP_MSS 576 /* default maximum segment size */ + +#if SIZEOF_CHAR_P == 4 +struct mbuf_ptr { + struct mbuf *mptr; + uint32_t dummy; +} __attribute__((packed)); +#else +struct mbuf_ptr { + struct mbuf *mptr; +} __attribute__((packed)); +#endif +struct qlink { + void *next, *prev; +}; + +/* + * Overlay for ip header used by other protocols (tcp, udp). + */ +struct ipovly { + struct mbuf_ptr ih_mbuf; /* backpointer to mbuf */ + uint8_t ih_x1; /* (unused) */ + uint8_t ih_pr; /* protocol */ + uint16_t ih_len; /* protocol length */ + struct in_addr ih_src; /* source internet address */ + struct in_addr ih_dst; /* destination internet address */ +} __attribute__((packed)); + +/* + * Ip reassembly queue structure. Each fragment + * being reassembled is attached to one of these structures. + * They are timed out after ipq_ttl drops to 0, and may also + * be reclaimed if memory becomes tight. + * size 28 bytes + */ +struct ipq { + struct qlink frag_link; /* to ip headers of fragments */ + struct qlink ip_link; /* to other reass headers */ + uint8_t ipq_ttl; /* time for reass q to live */ + uint8_t ipq_p; /* protocol of this fragment */ + uint16_t ipq_id; /* sequence id for reassembly */ + struct in_addr ipq_src,ipq_dst; +} __attribute__((packed)); + +/* + * Ip header, when holding a fragment. + * + * Note: ipf_link must be at same offset as frag_link above + */ +struct ipasfrag { + struct qlink ipf_link; + struct ip ipf_ip; +} __attribute__((packed)); + +#define ipf_off ipf_ip.ip_off +#define ipf_tos ipf_ip.ip_tos +#define ipf_len ipf_ip.ip_len +#define ipf_next ipf_link.next +#define ipf_prev ipf_link.prev + +/* + * Structure stored in mbuf in inpcb.ip_options + * and passed to ip_output when ip options are in use. + * The actual length of the options (including ipopt_dst) + * is in m_len. + */ +#define MAX_IPOPTLEN 40 + +struct ipoption { + struct in_addr ipopt_dst; /* first-hop dst if source routed */ + int8_t ipopt_list[MAX_IPOPTLEN]; /* options proper */ +} __attribute__((packed)); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c new file mode 100644 index 0000000..751a8e2 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.c @@ -0,0 +1,351 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_icmp.c 8.2 (Berkeley) 1/4/94 + * ip_icmp.c,v 1.7 1995/05/30 08:09:42 rgrimes Exp + */ + +#include "slirp.h" +#include "ip_icmp.h" + +/* The message sent when emulating PING */ +/* Be nice and tell them it's just a pseudo-ping packet */ +static const char icmp_ping_msg[] = "This is a pseudo-PING packet used by Slirp to emulate ICMP ECHO-REQUEST packets.\n"; + +/* list of actions for icmp_error() on RX of an icmp message */ +static const int icmp_flush[19] = { +/* ECHO REPLY (0) */ 0, + 1, + 1, +/* DEST UNREACH (3) */ 1, +/* SOURCE QUENCH (4)*/ 1, +/* REDIRECT (5) */ 1, + 1, + 1, +/* ECHO (8) */ 0, +/* ROUTERADVERT (9) */ 1, +/* ROUTERSOLICIT (10) */ 1, +/* TIME EXCEEDED (11) */ 1, +/* PARAMETER PROBLEM (12) */ 1, +/* TIMESTAMP (13) */ 0, +/* TIMESTAMP REPLY (14) */ 0, +/* INFO (15) */ 0, +/* INFO REPLY (16) */ 0, +/* ADDR MASK (17) */ 0, +/* ADDR MASK REPLY (18) */ 0 +}; + +/* + * Process a received ICMP message. + */ +void +icmp_input(struct mbuf *m, int hlen) +{ + register struct icmp *icp; + register struct ip *ip=mtod(m, struct ip *); + int icmplen=ip->ip_len; + Slirp *slirp = m->slirp; + + DEBUG_CALL("icmp_input"); + DEBUG_ARG("m = %lx", (long )m); + DEBUG_ARG("m_len = %d", m->m_len); + + /* + * Locate icmp structure in mbuf, and check + * that its not corrupted and of at least minimum length. + */ + if (icmplen < ICMP_MINLEN) { /* min 8 bytes payload */ + freeit: + m_freem(m); + goto end_error; + } + + m->m_len -= hlen; + m->m_data += hlen; + icp = mtod(m, struct icmp *); + if (cksum(m, icmplen)) { + goto freeit; + } + m->m_len += hlen; + m->m_data -= hlen; + + DEBUG_ARG("icmp_type = %d", icp->icmp_type); + switch (icp->icmp_type) { + case ICMP_ECHO: + icp->icmp_type = ICMP_ECHOREPLY; + ip->ip_len += hlen; /* since ip_input subtracts this */ + if (ip->ip_dst.s_addr == slirp->vhost_addr.s_addr) { + icmp_reflect(m); + } else { + struct socket *so; + struct sockaddr_in addr; + if ((so = socreate(slirp)) == NULL) goto freeit; + if(udp_attach(so) == -1) { + DEBUG_MISC((dfd,"icmp_input udp_attach errno = %d-%s\n", + errno,strerror(errno))); + sofree(so); + m_free(m); + goto end_error; + } + so->so_m = m; + so->so_faddr = ip->ip_dst; + so->so_fport = htons(7); + so->so_laddr = ip->ip_src; + so->so_lport = htons(9); + so->so_iptos = ip->ip_tos; + so->so_type = IPPROTO_ICMP; + so->so_state = SS_ISFCONNECTED; + + /* Send the packet */ + addr.sin_family = AF_INET; + if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + /* It's an alias */ + if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) { + if (get_dns_addr(&addr.sin_addr) < 0) + addr.sin_addr = loopback_addr; + } else { + addr.sin_addr = loopback_addr; + } + } else { + addr.sin_addr = so->so_faddr; + } + addr.sin_port = so->so_fport; + if(sendto(so->s, icmp_ping_msg, strlen(icmp_ping_msg), 0, + (struct sockaddr *)&addr, sizeof(addr)) == -1) { + DEBUG_MISC((dfd,"icmp_input udp sendto tx errno = %d-%s\n", + errno,strerror(errno))); + icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); + udp_detach(so); + } + } /* if ip->ip_dst.s_addr == alias_addr.s_addr */ + break; + case ICMP_UNREACH: + /* XXX? report error? close socket? */ + case ICMP_TIMXCEED: + case ICMP_PARAMPROB: + case ICMP_SOURCEQUENCH: + case ICMP_TSTAMP: + case ICMP_MASKREQ: + case ICMP_REDIRECT: + m_freem(m); + break; + + default: + m_freem(m); + } /* swith */ + +end_error: + /* m is m_free()'d xor put in a socket xor or given to ip_send */ + return; +} + + +/* + * Send an ICMP message in response to a situation + * + * RFC 1122: 3.2.2 MUST send at least the IP header and 8 bytes of header. MAY send more (we do). + * MUST NOT change this header information. + * MUST NOT reply to a multicast/broadcast IP address. + * MUST NOT reply to a multicast/broadcast MAC address. + * MUST reply to only the first fragment. + */ +/* + * Send ICMP_UNREACH back to the source regarding msrc. + * mbuf *msrc is used as a template, but is NOT m_free()'d. + * It is reported as the bad ip packet. The header should + * be fully correct and in host byte order. + * ICMP fragmentation is illegal. All machines must accept 576 bytes in one + * packet. The maximum payload is 576-20(ip hdr)-8(icmp hdr)=548 + */ + +#define ICMP_MAXDATALEN (IP_MSS-28) +void +icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, + const char *message) +{ + unsigned hlen, shlen, s_ip_len; + register struct ip *ip; + register struct icmp *icp; + register struct mbuf *m; + + DEBUG_CALL("icmp_error"); + DEBUG_ARG("msrc = %lx", (long )msrc); + DEBUG_ARG("msrc_len = %d", msrc->m_len); + + if(type!=ICMP_UNREACH && type!=ICMP_TIMXCEED) goto end_error; + + /* check msrc */ + if(!msrc) goto end_error; + ip = mtod(msrc, struct ip *); +#ifdef DEBUG + { char bufa[20], bufb[20]; + strcpy(bufa, inet_ntoa(ip->ip_src)); + strcpy(bufb, inet_ntoa(ip->ip_dst)); + DEBUG_MISC((dfd, " %.16s to %.16s\n", bufa, bufb)); + } +#endif + if(ip->ip_off & IP_OFFMASK) goto end_error; /* Only reply to fragment 0 */ + + shlen=ip->ip_hl << 2; + s_ip_len=ip->ip_len; + if(ip->ip_p == IPPROTO_ICMP) { + icp = (struct icmp *)((char *)ip + shlen); + /* + * Assume any unknown ICMP type is an error. This isn't + * specified by the RFC, but think about it.. + */ + if(icp->icmp_type>18 || icmp_flush[icp->icmp_type]) goto end_error; + } + + /* make a copy */ + m = m_get(msrc->slirp); + if (!m) { + goto end_error; + } + + { int new_m_size; + new_m_size=sizeof(struct ip )+ICMP_MINLEN+msrc->m_len+ICMP_MAXDATALEN; + if(new_m_size>m->m_size) m_inc(m, new_m_size); + } + memcpy(m->m_data, msrc->m_data, msrc->m_len); + m->m_len = msrc->m_len; /* copy msrc to m */ + + /* make the header of the reply packet */ + ip = mtod(m, struct ip *); + hlen= sizeof(struct ip ); /* no options in reply */ + + /* fill in icmp */ + m->m_data += hlen; + m->m_len -= hlen; + + icp = mtod(m, struct icmp *); + + if(minsize) s_ip_len=shlen+ICMP_MINLEN; /* return header+8b only */ + else if(s_ip_len>ICMP_MAXDATALEN) /* maximum size */ + s_ip_len=ICMP_MAXDATALEN; + + m->m_len=ICMP_MINLEN+s_ip_len; /* 8 bytes ICMP header */ + + /* min. size = 8+sizeof(struct ip)+8 */ + + icp->icmp_type = type; + icp->icmp_code = code; + icp->icmp_id = 0; + icp->icmp_seq = 0; + + memcpy(&icp->icmp_ip, msrc->m_data, s_ip_len); /* report the ip packet */ + HTONS(icp->icmp_ip.ip_len); + HTONS(icp->icmp_ip.ip_id); + HTONS(icp->icmp_ip.ip_off); + +#ifdef DEBUG + if(message) { /* DEBUG : append message to ICMP packet */ + int message_len; + char *cpnt; + message_len=strlen(message); + if(message_len>ICMP_MAXDATALEN) message_len=ICMP_MAXDATALEN; + cpnt=(char *)m->m_data+m->m_len; + memcpy(cpnt, message, message_len); + m->m_len+=message_len; + } +#endif + + icp->icmp_cksum = 0; + icp->icmp_cksum = cksum(m, m->m_len); + + m->m_data -= hlen; + m->m_len += hlen; + + /* fill in ip */ + ip->ip_hl = hlen >> 2; + ip->ip_len = m->m_len; + + ip->ip_tos=((ip->ip_tos & 0x1E) | 0xC0); /* high priority for errors */ + + ip->ip_ttl = MAXTTL; + ip->ip_p = IPPROTO_ICMP; + ip->ip_dst = ip->ip_src; /* ip adresses */ + ip->ip_src = m->slirp->vhost_addr; + + (void ) ip_output((struct socket *)NULL, m); + +end_error: + return; +} +#undef ICMP_MAXDATALEN + +/* + * Reflect the ip packet back to the source + */ +void +icmp_reflect(struct mbuf *m) +{ + register struct ip *ip = mtod(m, struct ip *); + int hlen = ip->ip_hl << 2; + int optlen = hlen - sizeof(struct ip ); + register struct icmp *icp; + + /* + * Send an icmp packet back to the ip level, + * after supplying a checksum. + */ + m->m_data += hlen; + m->m_len -= hlen; + icp = mtod(m, struct icmp *); + + icp->icmp_cksum = 0; + icp->icmp_cksum = cksum(m, ip->ip_len - hlen); + + m->m_data -= hlen; + m->m_len += hlen; + + /* fill in ip */ + if (optlen > 0) { + /* + * Strip out original options by copying rest of first + * mbuf's data back, and adjust the IP length. + */ + memmove((caddr_t)(ip + 1), (caddr_t)ip + hlen, + (unsigned )(m->m_len - hlen)); + hlen -= optlen; + ip->ip_hl = hlen >> 2; + ip->ip_len -= optlen; + m->m_len -= optlen; + } + + ip->ip_ttl = MAXTTL; + { /* swap */ + struct in_addr icmp_dst; + icmp_dst = ip->ip_dst; + ip->ip_dst = ip->ip_src; + ip->ip_src = icmp_dst; + } + + (void ) ip_output((struct socket *)NULL, m); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h new file mode 100644 index 0000000..2692822 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_icmp.h @@ -0,0 +1,161 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 + * ip_icmp.h,v 1.4 1995/05/30 08:09:43 rgrimes Exp + */ + +#ifndef _NETINET_IP_ICMP_H_ +#define _NETINET_IP_ICMP_H_ + +/* + * Interface Control Message Protocol Definitions. + * Per RFC 792, September 1981. + */ + +typedef uint32_t n_time; + +/* + * Structure of an icmp header. + */ +struct icmp { + u_char icmp_type; /* type of message, see below */ + u_char icmp_code; /* type sub code */ + u_short icmp_cksum; /* ones complement cksum of struct */ + union { + u_char ih_pptr; /* ICMP_PARAMPROB */ + struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ + struct ih_idseq { + u_short icd_id; + u_short icd_seq; + } ih_idseq; + int ih_void; + + /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ + struct ih_pmtu { + u_short ipm_void; + u_short ipm_nextmtu; + } ih_pmtu; + } icmp_hun; +#define icmp_pptr icmp_hun.ih_pptr +#define icmp_gwaddr icmp_hun.ih_gwaddr +#define icmp_id icmp_hun.ih_idseq.icd_id +#define icmp_seq icmp_hun.ih_idseq.icd_seq +#define icmp_void icmp_hun.ih_void +#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void +#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu + union { + struct id_ts { + n_time its_otime; + n_time its_rtime; + n_time its_ttime; + } id_ts; + struct id_ip { + struct ip idi_ip; + /* options and then 64 bits of data */ + } id_ip; + uint32_t id_mask; + char id_data[1]; + } icmp_dun; +#define icmp_otime icmp_dun.id_ts.its_otime +#define icmp_rtime icmp_dun.id_ts.its_rtime +#define icmp_ttime icmp_dun.id_ts.its_ttime +#define icmp_ip icmp_dun.id_ip.idi_ip +#define icmp_mask icmp_dun.id_mask +#define icmp_data icmp_dun.id_data +}; + +/* + * Lower bounds on packet lengths for various types. + * For the error advice packets must first insure that the + * packet is large enought to contain the returned ip header. + * Only then can we do the check to see if 64 bits of packet + * data have been returned, since we need to check the returned + * ip header length. + */ +#define ICMP_MINLEN 8 /* abs minimum */ +#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ +#define ICMP_MASKLEN 12 /* address mask */ +#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ +#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) + /* N.B.: must separately check that ip_hl >= 5 */ + +/* + * Definition of type and code field values. + */ +#define ICMP_ECHOREPLY 0 /* echo reply */ +#define ICMP_UNREACH 3 /* dest unreachable, codes: */ +#define ICMP_UNREACH_NET 0 /* bad net */ +#define ICMP_UNREACH_HOST 1 /* bad host */ +#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ +#define ICMP_UNREACH_PORT 3 /* bad port */ +#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ +#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ +#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ +#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ +#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ +#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ +#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ +#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ +#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ +#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ +#define ICMP_REDIRECT 5 /* shorter route, codes: */ +#define ICMP_REDIRECT_NET 0 /* for network */ +#define ICMP_REDIRECT_HOST 1 /* for host */ +#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ +#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ +#define ICMP_ECHO 8 /* echo service */ +#define ICMP_ROUTERADVERT 9 /* router advertisement */ +#define ICMP_ROUTERSOLICIT 10 /* router solicitation */ +#define ICMP_TIMXCEED 11 /* time exceeded, code: */ +#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ +#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ +#define ICMP_PARAMPROB 12 /* ip header bad */ +#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ +#define ICMP_TSTAMP 13 /* timestamp request */ +#define ICMP_TSTAMPREPLY 14 /* timestamp reply */ +#define ICMP_IREQ 15 /* information request */ +#define ICMP_IREQREPLY 16 /* information reply */ +#define ICMP_MASKREQ 17 /* address mask request */ +#define ICMP_MASKREPLY 18 /* address mask reply */ + +#define ICMP_MAXTYPE 18 + +#define ICMP_INFOTYPE(type) \ + ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ + (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ + (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ + (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ + (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) + +void icmp_input(struct mbuf *, int); +void icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize, + const char *message); +void icmp_reflect(struct mbuf *); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c new file mode 100644 index 0000000..50ab951 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_input.c @@ -0,0 +1,685 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_input.c 8.2 (Berkeley) 1/4/94 + * ip_input.c,v 1.11 1994/11/16 10:17:08 jkh Exp + */ + +/* + * Changes and additions relating to SLiRP are + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" +#include "ip_icmp.h" + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp); +static void ip_freef(Slirp *slirp, struct ipq *fp); +static void ip_enq(register struct ipasfrag *p, + register struct ipasfrag *prev); +static void ip_deq(register struct ipasfrag *p); + +/* + * IP initialization: fill in IP protocol switch table. + * All protocols not implemented in kernel go to raw IP protocol handler. + */ +void +ip_init(Slirp *slirp) +{ + slirp->ipq.ip_link.next = slirp->ipq.ip_link.prev = &slirp->ipq.ip_link; + udp_init(slirp); + tcp_init(slirp); +} + +/* + * Ip input routine. Checksum and byte swap header. If fragmented + * try to reassemble. Process options. Pass to next level. + */ +void +ip_input(struct mbuf *m) +{ + Slirp *slirp = m->slirp; + register struct ip *ip; + int hlen; + + DEBUG_CALL("ip_input"); + DEBUG_ARG("m = %lx", (long)m); + DEBUG_ARG("m_len = %d", m->m_len); + + if (m->m_len < sizeof (struct ip)) { + return; + } + + ip = mtod(m, struct ip *); + + if (ip->ip_v != IPVERSION) { + goto bad; + } + + hlen = ip->ip_hl << 2; + if (hlen<sizeof(struct ip ) || hlen>m->m_len) {/* min header length */ + goto bad; /* or packet too short */ + } + + /* keep ip header intact for ICMP reply + * ip->ip_sum = cksum(m, hlen); + * if (ip->ip_sum) { + */ + if(cksum(m,hlen)) { + goto bad; + } + + /* + * Convert fields to host representation. + */ + NTOHS(ip->ip_len); + if (ip->ip_len < hlen) { + goto bad; + } + NTOHS(ip->ip_id); + NTOHS(ip->ip_off); + + /* + * Check that the amount of data in the buffers + * is as at least much as the IP header would have us expect. + * Trim mbufs if longer than we expect. + * Drop packet if shorter than we expect. + */ + if (m->m_len < ip->ip_len) { + goto bad; + } + + if (slirp->restricted) { + if ((ip->ip_dst.s_addr & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + if (ip->ip_dst.s_addr == 0xffffffff && ip->ip_p != IPPROTO_UDP) + goto bad; + } else { + uint32_t inv_mask = ~slirp->vnetwork_mask.s_addr; + struct ex_list *ex_ptr; + + if ((ip->ip_dst.s_addr & inv_mask) == inv_mask) { + goto bad; + } + for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) + if (ex_ptr->ex_addr.s_addr == ip->ip_dst.s_addr) + break; + + if (!ex_ptr) + goto bad; + } + } + + /* Should drop packet if mbuf too long? hmmm... */ + if (m->m_len > ip->ip_len) + m_adj(m, ip->ip_len - m->m_len); + + /* check ip_ttl for a correct ICMP reply */ + if(ip->ip_ttl==0) { + icmp_error(m, ICMP_TIMXCEED,ICMP_TIMXCEED_INTRANS, 0,"ttl"); + goto bad; + } + + /* + * If offset or IP_MF are set, must reassemble. + * Otherwise, nothing need be done. + * (We could look in the reassembly queue to see + * if the packet was previously fragmented, + * but it's not worth the time; just let them time out.) + * + * XXX This should fail, don't fragment yet + */ + if (ip->ip_off &~ IP_DF) { + register struct ipq *fp; + struct qlink *l; + /* + * Look for queue of fragments + * of this datagram. + */ + for (l = slirp->ipq.ip_link.next; l != &slirp->ipq.ip_link; + l = l->next) { + fp = container_of(l, struct ipq, ip_link); + if (ip->ip_id == fp->ipq_id && + ip->ip_src.s_addr == fp->ipq_src.s_addr && + ip->ip_dst.s_addr == fp->ipq_dst.s_addr && + ip->ip_p == fp->ipq_p) + goto found; + } + fp = NULL; + found: + + /* + * Adjust ip_len to not reflect header, + * set ip_mff if more fragments are expected, + * convert offset of this to bytes. + */ + ip->ip_len -= hlen; + if (ip->ip_off & IP_MF) + ip->ip_tos |= 1; + else + ip->ip_tos &= ~1; + + ip->ip_off <<= 3; + + /* + * If datagram marked as having more fragments + * or if this is not the first fragment, + * attempt reassembly; if it succeeds, proceed. + */ + if (ip->ip_tos & 1 || ip->ip_off) { + ip = ip_reass(slirp, ip, fp); + if (ip == NULL) + return; + m = dtom(slirp, ip); + } else + if (fp) + ip_freef(slirp, fp); + + } else + ip->ip_len -= hlen; + + /* + * Switch out to protocol's input routine. + */ + switch (ip->ip_p) { + case IPPROTO_TCP: + tcp_input(m, hlen, (struct socket *)NULL); + break; + case IPPROTO_UDP: + udp_input(m, hlen); + break; + case IPPROTO_ICMP: + icmp_input(m, hlen); + break; + default: + m_free(m); + } + return; +bad: + m_freem(m); + return; +} + +#define iptofrag(P) ((struct ipasfrag *)(((char*)(P)) - sizeof(struct qlink))) +#define fragtoip(P) ((struct ip*)(((char*)(P)) + sizeof(struct qlink))) +/* + * Take incoming datagram fragment and try to + * reassemble it into whole datagram. If a chain for + * reassembly of this datagram already exists, then it + * is given as fp; otherwise have to make a chain. + */ +static struct ip * +ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp) +{ + register struct mbuf *m = dtom(slirp, ip); + register struct ipasfrag *q; + int hlen = ip->ip_hl << 2; + int i, next; + + DEBUG_CALL("ip_reass"); + DEBUG_ARG("ip = %lx", (long)ip); + DEBUG_ARG("fp = %lx", (long)fp); + DEBUG_ARG("m = %lx", (long)m); + + /* + * Presence of header sizes in mbufs + * would confuse code below. + * Fragment m_data is concatenated. + */ + m->m_data += hlen; + m->m_len -= hlen; + + /* + * If first fragment to arrive, create a reassembly queue. + */ + if (fp == NULL) { + struct mbuf *t = m_get(slirp); + + if (t == NULL) { + goto dropfrag; + } + fp = mtod(t, struct ipq *); + insque(&fp->ip_link, &slirp->ipq.ip_link); + fp->ipq_ttl = IPFRAGTTL; + fp->ipq_p = ip->ip_p; + fp->ipq_id = ip->ip_id; + fp->frag_link.next = fp->frag_link.prev = &fp->frag_link; + fp->ipq_src = ip->ip_src; + fp->ipq_dst = ip->ip_dst; + q = (struct ipasfrag *)fp; + goto insert; + } + + /* + * Find a segment which begins after this one does. + */ + for (q = fp->frag_link.next; q != (struct ipasfrag *)&fp->frag_link; + q = q->ipf_next) + if (q->ipf_off > ip->ip_off) + break; + + /* + * If there is a preceding segment, it may provide some of + * our data already. If so, drop the data from the incoming + * segment. If it provides all of our data, drop us. + */ + if (q->ipf_prev != &fp->frag_link) { + struct ipasfrag *pq = q->ipf_prev; + i = pq->ipf_off + pq->ipf_len - ip->ip_off; + if (i > 0) { + if (i >= ip->ip_len) + goto dropfrag; + m_adj(dtom(slirp, ip), i); + ip->ip_off += i; + ip->ip_len -= i; + } + } + + /* + * While we overlap succeeding segments trim them or, + * if they are completely covered, dequeue them. + */ + while (q != (struct ipasfrag*)&fp->frag_link && + ip->ip_off + ip->ip_len > q->ipf_off) { + i = (ip->ip_off + ip->ip_len) - q->ipf_off; + if (i < q->ipf_len) { + q->ipf_len -= i; + q->ipf_off += i; + m_adj(dtom(slirp, q), i); + break; + } + q = q->ipf_next; + m_freem(dtom(slirp, q->ipf_prev)); + ip_deq(q->ipf_prev); + } + +insert: + /* + * Stick new segment in its place; + * check for complete reassembly. + */ + ip_enq(iptofrag(ip), q->ipf_prev); + next = 0; + for (q = fp->frag_link.next; q != (struct ipasfrag*)&fp->frag_link; + q = q->ipf_next) { + if (q->ipf_off != next) + return NULL; + next += q->ipf_len; + } + if (((struct ipasfrag *)(q->ipf_prev))->ipf_tos & 1) + return NULL; + + /* + * Reassembly is complete; concatenate fragments. + */ + q = fp->frag_link.next; + m = dtom(slirp, q); + + q = (struct ipasfrag *) q->ipf_next; + while (q != (struct ipasfrag*)&fp->frag_link) { + struct mbuf *t = dtom(slirp, q); + q = (struct ipasfrag *) q->ipf_next; + m_cat(m, t); + } + + /* + * Create header for new ip packet by + * modifying header of first packet; + * dequeue and discard fragment reassembly header. + * Make header visible. + */ + q = fp->frag_link.next; + + /* + * If the fragments concatenated to an mbuf that's + * bigger than the total size of the fragment, then and + * m_ext buffer was alloced. But fp->ipq_next points to + * the old buffer (in the mbuf), so we must point ip + * into the new buffer. + */ + if (m->m_flags & M_EXT) { + int delta = (char *)q - m->m_dat; + q = (struct ipasfrag *)(m->m_ext + delta); + } + + ip = fragtoip(q); + ip->ip_len = next; + ip->ip_tos &= ~1; + ip->ip_src = fp->ipq_src; + ip->ip_dst = fp->ipq_dst; + remque(&fp->ip_link); + (void) m_free(dtom(slirp, fp)); + m->m_len += (ip->ip_hl << 2); + m->m_data -= (ip->ip_hl << 2); + + return ip; + +dropfrag: + m_freem(m); + return NULL; +} + +/* + * Free a fragment reassembly header and all + * associated datagrams. + */ +static void +ip_freef(Slirp *slirp, struct ipq *fp) +{ + register struct ipasfrag *q, *p; + + for (q = fp->frag_link.next; q != (struct ipasfrag*)&fp->frag_link; q = p) { + p = q->ipf_next; + ip_deq(q); + m_freem(dtom(slirp, q)); + } + remque(&fp->ip_link); + (void) m_free(dtom(slirp, fp)); +} + +/* + * Put an ip fragment on a reassembly chain. + * Like insque, but pointers in middle of structure. + */ +static void +ip_enq(register struct ipasfrag *p, register struct ipasfrag *prev) +{ + DEBUG_CALL("ip_enq"); + DEBUG_ARG("prev = %lx", (long)prev); + p->ipf_prev = prev; + p->ipf_next = prev->ipf_next; + ((struct ipasfrag *)(prev->ipf_next))->ipf_prev = p; + prev->ipf_next = p; +} + +/* + * To ip_enq as remque is to insque. + */ +static void +ip_deq(register struct ipasfrag *p) +{ + ((struct ipasfrag *)(p->ipf_prev))->ipf_next = p->ipf_next; + ((struct ipasfrag *)(p->ipf_next))->ipf_prev = p->ipf_prev; +} + +/* + * IP timer processing; + * if a timer expires on a reassembly + * queue, discard it. + */ +void +ip_slowtimo(Slirp *slirp) +{ + struct qlink *l; + + DEBUG_CALL("ip_slowtimo"); + + l = slirp->ipq.ip_link.next; + + if (l == NULL) + return; + + while (l != &slirp->ipq.ip_link) { + struct ipq *fp = container_of(l, struct ipq, ip_link); + l = l->next; + if (--fp->ipq_ttl == 0) { + ip_freef(slirp, fp); + } + } +} + +/* + * Do option processing on a datagram, + * possibly discarding it if bad options are encountered, + * or forwarding it if source-routed. + * Returns 1 if packet has been forwarded/freed, + * 0 if the packet should be processed further. + */ + +#ifdef notdef + +int +ip_dooptions(m) + struct mbuf *m; +{ + register struct ip *ip = mtod(m, struct ip *); + register u_char *cp; + register struct ip_timestamp *ipt; + register struct in_ifaddr *ia; + int opt, optlen, cnt, off, code, type, forward = 0; + struct in_addr *sin, dst; +typedef uint32_t n_time; + n_time ntime; + + dst = ip->ip_dst; + cp = (u_char *)(ip + 1); + cnt = (ip->ip_hl << 2) - sizeof (struct ip); + for (; cnt > 0; cnt -= optlen, cp += optlen) { + opt = cp[IPOPT_OPTVAL]; + if (opt == IPOPT_EOL) + break; + if (opt == IPOPT_NOP) + optlen = 1; + else { + optlen = cp[IPOPT_OLEN]; + if (optlen <= 0 || optlen > cnt) { + code = &cp[IPOPT_OLEN] - (u_char *)ip; + goto bad; + } + } + switch (opt) { + + default: + break; + + /* + * Source routing with record. + * Find interface with current destination address. + * If none on this machine then drop if strictly routed, + * or do nothing if loosely routed. + * Record interface address and bring up next address + * component. If strictly routed make sure next + * address is on directly accessible net. + */ + case IPOPT_LSRR: + case IPOPT_SSRR: + if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { + code = &cp[IPOPT_OFFSET] - (u_char *)ip; + goto bad; + } + ipaddr.sin_addr = ip->ip_dst; + ia = (struct in_ifaddr *) + ifa_ifwithaddr((struct sockaddr *)&ipaddr); + if (ia == 0) { + if (opt == IPOPT_SSRR) { + type = ICMP_UNREACH; + code = ICMP_UNREACH_SRCFAIL; + goto bad; + } + /* + * Loose routing, and not at next destination + * yet; nothing to do except forward. + */ + break; + } + off--; / * 0 origin * / + if (off > optlen - sizeof(struct in_addr)) { + /* + * End of source route. Should be for us. + */ + save_rte(cp, ip->ip_src); + break; + } + /* + * locate outgoing interface + */ + bcopy((caddr_t)(cp + off), (caddr_t)&ipaddr.sin_addr, + sizeof(ipaddr.sin_addr)); + if (opt == IPOPT_SSRR) { +#define INA struct in_ifaddr * +#define SA struct sockaddr * + if ((ia = (INA)ifa_ifwithdstaddr((SA)&ipaddr)) == 0) + ia = (INA)ifa_ifwithnet((SA)&ipaddr); + } else + ia = ip_rtaddr(ipaddr.sin_addr); + if (ia == 0) { + type = ICMP_UNREACH; + code = ICMP_UNREACH_SRCFAIL; + goto bad; + } + ip->ip_dst = ipaddr.sin_addr; + bcopy((caddr_t)&(IA_SIN(ia)->sin_addr), + (caddr_t)(cp + off), sizeof(struct in_addr)); + cp[IPOPT_OFFSET] += sizeof(struct in_addr); + /* + * Let ip_intr's mcast routing check handle mcast pkts + */ + forward = !IN_MULTICAST(ntohl(ip->ip_dst.s_addr)); + break; + + case IPOPT_RR: + if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { + code = &cp[IPOPT_OFFSET] - (u_char *)ip; + goto bad; + } + /* + * If no space remains, ignore. + */ + off--; * 0 origin * + if (off > optlen - sizeof(struct in_addr)) + break; + bcopy((caddr_t)(&ip->ip_dst), (caddr_t)&ipaddr.sin_addr, + sizeof(ipaddr.sin_addr)); + /* + * locate outgoing interface; if we're the destination, + * use the incoming interface (should be same). + */ + if ((ia = (INA)ifa_ifwithaddr((SA)&ipaddr)) == 0 && + (ia = ip_rtaddr(ipaddr.sin_addr)) == 0) { + type = ICMP_UNREACH; + code = ICMP_UNREACH_HOST; + goto bad; + } + bcopy((caddr_t)&(IA_SIN(ia)->sin_addr), + (caddr_t)(cp + off), sizeof(struct in_addr)); + cp[IPOPT_OFFSET] += sizeof(struct in_addr); + break; + + case IPOPT_TS: + code = cp - (u_char *)ip; + ipt = (struct ip_timestamp *)cp; + if (ipt->ipt_len < 5) + goto bad; + if (ipt->ipt_ptr > ipt->ipt_len - sizeof (int32_t)) { + if (++ipt->ipt_oflw == 0) + goto bad; + break; + } + sin = (struct in_addr *)(cp + ipt->ipt_ptr - 1); + switch (ipt->ipt_flg) { + + case IPOPT_TS_TSONLY: + break; + + case IPOPT_TS_TSANDADDR: + if (ipt->ipt_ptr + sizeof(n_time) + + sizeof(struct in_addr) > ipt->ipt_len) + goto bad; + ipaddr.sin_addr = dst; + ia = (INA)ifaof_ i f p foraddr((SA)&ipaddr, + m->m_pkthdr.rcvif); + if (ia == 0) + continue; + bcopy((caddr_t)&IA_SIN(ia)->sin_addr, + (caddr_t)sin, sizeof(struct in_addr)); + ipt->ipt_ptr += sizeof(struct in_addr); + break; + + case IPOPT_TS_PRESPEC: + if (ipt->ipt_ptr + sizeof(n_time) + + sizeof(struct in_addr) > ipt->ipt_len) + goto bad; + bcopy((caddr_t)sin, (caddr_t)&ipaddr.sin_addr, + sizeof(struct in_addr)); + if (ifa_ifwithaddr((SA)&ipaddr) == 0) + continue; + ipt->ipt_ptr += sizeof(struct in_addr); + break; + + default: + goto bad; + } + ntime = iptime(); + bcopy((caddr_t)&ntime, (caddr_t)cp + ipt->ipt_ptr - 1, + sizeof(n_time)); + ipt->ipt_ptr += sizeof(n_time); + } + } + if (forward) { + ip_forward(m, 1); + return (1); + } + return (0); +bad: + icmp_error(m, type, code, 0, 0); + + return (1); +} + +#endif /* notdef */ + +/* + * Strip out IP options, at higher + * level protocol in the kernel. + * Second argument is buffer to which options + * will be moved, and return value is their length. + * (XXX) should be deleted; last arg currently ignored. + */ +void +ip_stripoptions(register struct mbuf *m, struct mbuf *mopt) +{ + register int i; + struct ip *ip = mtod(m, struct ip *); + register caddr_t opts; + int olen; + + olen = (ip->ip_hl<<2) - sizeof (struct ip); + opts = (caddr_t)(ip + 1); + i = m->m_len - (sizeof (struct ip) + olen); + memcpy(opts, opts + olen, (unsigned)i); + m->m_len -= olen; + + ip->ip_hl = sizeof(struct ip) >> 2; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c new file mode 100644 index 0000000..657c9af --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/ip_output.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ip_output.c 8.3 (Berkeley) 1/21/94 + * ip_output.c,v 1.9 1994/11/16 10:17:10 jkh Exp + */ + +/* + * Changes and additions relating to SLiRP are + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" + +/* Number of packets queued before we start sending + * (to prevent allocing too many mbufs) */ +#define IF_THRESH 10 + +/* + * IP output. The packet in mbuf chain m contains a skeletal IP + * header (with len, off, ttl, proto, tos, src, dst). + * The mbuf chain containing the packet will be freed. + * The mbuf opt, if present, will not be freed. + */ +int +ip_output(struct socket *so, struct mbuf *m0) +{ + Slirp *slirp = m0->slirp; + register struct ip *ip; + register struct mbuf *m = m0; + register int hlen = sizeof(struct ip ); + int len, off, error = 0; + + DEBUG_CALL("ip_output"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("m0 = %lx", (long)m0); + + ip = mtod(m, struct ip *); + /* + * Fill in IP header. + */ + ip->ip_v = IPVERSION; + ip->ip_off &= IP_DF; + ip->ip_id = htons(slirp->ip_id++); + ip->ip_hl = hlen >> 2; + + /* + * If small enough for interface, can just send directly. + */ + if ((uint16_t)ip->ip_len <= IF_MTU) { + ip->ip_len = htons((uint16_t)ip->ip_len); + ip->ip_off = htons((uint16_t)ip->ip_off); + ip->ip_sum = 0; + ip->ip_sum = cksum(m, hlen); + + if_output(so, m); + goto done; + } + + /* + * Too large for interface; fragment if possible. + * Must be able to put at least 8 bytes per fragment. + */ + if (ip->ip_off & IP_DF) { + error = -1; + goto bad; + } + + len = (IF_MTU - hlen) &~ 7; /* ip databytes per packet */ + if (len < 8) { + error = -1; + goto bad; + } + + { + int mhlen, firstlen = len; + struct mbuf **mnext = &m->m_nextpkt; + + /* + * Loop through length of segment after first fragment, + * make new header and copy data of each part and link onto chain. + */ + m0 = m; + mhlen = sizeof (struct ip); + for (off = hlen + len; off < (uint16_t)ip->ip_len; off += len) { + register struct ip *mhip; + m = m_get(slirp); + if (m == NULL) { + error = -1; + goto sendorfree; + } + m->m_data += IF_MAXLINKHDR; + mhip = mtod(m, struct ip *); + *mhip = *ip; + + m->m_len = mhlen; + mhip->ip_off = ((off - hlen) >> 3) + (ip->ip_off & ~IP_MF); + if (ip->ip_off & IP_MF) + mhip->ip_off |= IP_MF; + if (off + len >= (uint16_t)ip->ip_len) + len = (uint16_t)ip->ip_len - off; + else + mhip->ip_off |= IP_MF; + mhip->ip_len = htons((uint16_t)(len + mhlen)); + + if (m_copy(m, m0, off, len) < 0) { + error = -1; + goto sendorfree; + } + + mhip->ip_off = htons((uint16_t)mhip->ip_off); + mhip->ip_sum = 0; + mhip->ip_sum = cksum(m, mhlen); + *mnext = m; + mnext = &m->m_nextpkt; + } + /* + * Update first fragment by trimming what's been copied out + * and updating header, then send each fragment (in order). + */ + m = m0; + m_adj(m, hlen + firstlen - (uint16_t)ip->ip_len); + ip->ip_len = htons((uint16_t)m->m_len); + ip->ip_off = htons((uint16_t)(ip->ip_off | IP_MF)); + ip->ip_sum = 0; + ip->ip_sum = cksum(m, hlen); +sendorfree: + for (m = m0; m; m = m0) { + m0 = m->m_nextpkt; + m->m_nextpkt = NULL; + if (error == 0) + if_output(so, m); + else + m_freem(m); + } + } + +done: + return (error); + +bad: + m_freem(m0); + goto done; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h new file mode 100644 index 0000000..574852b --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/libslirp.h @@ -0,0 +1,56 @@ +#ifndef _LIBSLIRP_H +#define _LIBSLIRP_H + +#ifdef CONFIG_SLIRP + +#include <netinet/in.h> + +struct Slirp; +typedef struct Slirp Slirp; + +int get_dns_addr(struct in_addr *pdns_addr); + +Slirp *slirp_init(int restricted, struct in_addr vnetwork, + struct in_addr vnetmask, struct in_addr vhost, + const char *vhostname, const char *tftp_path, + const char *bootfile, struct in_addr vdhcp_start, + struct in_addr vnameserver, void *opaque); +void slirp_cleanup(Slirp *slirp); + +void slirp_select_fill(Slirp *slirp, int *pnfds, + fd_set *readfds, fd_set *writefds, fd_set *xfds); + +void slirp_select_poll(Slirp *slirp, + fd_set *readfds, fd_set *writefds, fd_set *xfds, + int select_error); + +void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len); + +/* you must provide the following functions: */ +int slirp_can_output(void *opaque); +void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len); + +int slirp_add_hostfwd(Slirp *slirp, int is_udp, + struct in_addr host_addr, int host_port, + struct in_addr guest_addr, int guest_port); +int slirp_remove_hostfwd(Slirp *slirp, int is_udp, + struct in_addr host_addr, int host_port); +int slirp_add_exec(Slirp *slirp, int do_pty, const void *args, + struct in_addr *guest_addr, int guest_port); + +void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, + int guest_port, const uint8_t *buf, int size); +size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr, + int guest_port); +int slirp_get_time_ms(void); + +#else /* !CONFIG_SLIRP */ + +static inline void slirp_select_fill(int *pnfds, fd_set *readfds, + fd_set *writefds, fd_set *xfds) { } + +static inline void slirp_select_poll(fd_set *readfds, fd_set *writefds, + fd_set *xfds, int select_error) { } +#endif /* !CONFIG_SLIRP */ + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h new file mode 100644 index 0000000..0dd8d81 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/main.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#ifdef HAVE_SYS_SELECT_H +#include <sys/select.h> +#endif + +#define TOWRITEMAX 512 + +extern int slirp_socket; +extern int slirp_socket_unit; +extern int slirp_socket_port; +extern uint32_t slirp_socket_addr; +extern char *slirp_socket_passwd; +extern int ctty_closed; + +/* + * Get the difference in 2 times from updtim() + * Allow for wraparound times, "just in case" + * x is the greater of the 2 (current time) and y is + * what it's being compared against. + */ +#define TIME_DIFF(x,y) (x)-(y) < 0 ? ~0-(y)+(x) : (x)-(y) + +extern char *slirp_tty; +extern char *exec_shell; +extern u_int curtime; +extern fd_set *global_readfds, *global_writefds, *global_xfds; +extern struct in_addr loopback_addr; +extern char *username; +extern char *socket_path; +extern int towrite_max; +extern int ppp_exit; +extern int tcp_keepintvl; + +#define PROTO_SLIP 0x1 +#ifdef USE_PPP +#define PROTO_PPP 0x2 +#endif + +void if_encap(Slirp *slirp, const uint8_t *ip_data, int ip_data_len); +ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c new file mode 100644 index 0000000..6c115ee --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 1995 Danny Gasparovski + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +/* + * mbuf's in SLiRP are much simpler than the real mbufs in + * FreeBSD. They are fixed size, determined by the MTU, + * so that one whole packet can fit. Mbuf's cannot be + * chained together. If there's more data than the mbuf + * could hold, an external malloced buffer is pointed to + * by m_ext (and the data pointers) and M_EXT is set in + * the flags + */ + +#include "slirp.h" + +#define MBUF_THRESH 30 + +/* + * Find a nice value for msize + * XXX if_maxlinkhdr already in mtu + */ +#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + offsetof(struct mbuf, m_dat) + 6) + +void +m_init(Slirp *slirp) +{ + slirp->m_freelist.m_next = slirp->m_freelist.m_prev = &slirp->m_freelist; + slirp->m_usedlist.m_next = slirp->m_usedlist.m_prev = &slirp->m_usedlist; +} + +/* + * Get an mbuf from the free list, if there are none + * malloc one + * + * Because fragmentation can occur if we alloc new mbufs and + * free old mbufs, we mark all mbufs above mbuf_thresh as M_DOFREE, + * which tells m_free to actually free() it + */ +struct mbuf * +m_get(Slirp *slirp) +{ + register struct mbuf *m; + int flags = 0; + + DEBUG_CALL("m_get"); + + if (slirp->m_freelist.m_next == &slirp->m_freelist) { + m = (struct mbuf *)malloc(SLIRP_MSIZE); + if (m == NULL) goto end_error; + slirp->mbuf_alloced++; + if (slirp->mbuf_alloced > MBUF_THRESH) + flags = M_DOFREE; + m->slirp = slirp; + } else { + m = slirp->m_freelist.m_next; + remque(m); + } + + /* Insert it in the used list */ + insque(m,&slirp->m_usedlist); + m->m_flags = (flags | M_USEDLIST); + + /* Initialise it */ + m->m_size = SLIRP_MSIZE - offsetof(struct mbuf, m_dat); + m->m_data = m->m_dat; + m->m_len = 0; + m->m_nextpkt = NULL; + m->m_prevpkt = NULL; +end_error: + DEBUG_ARG("m = %lx", (long )m); + return m; +} + +void +m_free(struct mbuf *m) +{ + + DEBUG_CALL("m_free"); + DEBUG_ARG("m = %lx", (long )m); + + if(m) { + /* Remove from m_usedlist */ + if (m->m_flags & M_USEDLIST) + remque(m); + + /* If it's M_EXT, free() it */ + if (m->m_flags & M_EXT) + free(m->m_ext); + + /* + * Either free() it or put it on the free list + */ + if (m->m_flags & M_DOFREE) { + m->slirp->mbuf_alloced--; + free(m); + } else if ((m->m_flags & M_FREELIST) == 0) { + insque(m,&m->slirp->m_freelist); + m->m_flags = M_FREELIST; /* Clobber other flags */ + } + } /* if(m) */ +} + +/* + * Copy data from one mbuf to the end of + * the other.. if result is too big for one mbuf, malloc() + * an M_EXT data segment + */ +void +m_cat(struct mbuf *m, struct mbuf *n) +{ + /* + * If there's no room, realloc + */ + if (M_FREEROOM(m) < n->m_len) + m_inc(m,m->m_size+MINCSIZE); + + memcpy(m->m_data+m->m_len, n->m_data, n->m_len); + m->m_len += n->m_len; + + m_free(n); +} + + +/* make m size bytes large */ +void +m_inc(struct mbuf *m, int size) +{ + int datasize; + + /* some compiles throw up on gotos. This one we can fake. */ + if(m->m_size>size) return; + + if (m->m_flags & M_EXT) { + datasize = m->m_data - m->m_ext; + m->m_ext = (char *)realloc(m->m_ext,size); + m->m_data = m->m_ext + datasize; + } else { + char *dat; + datasize = m->m_data - m->m_dat; + dat = (char *)malloc(size); + memcpy(dat, m->m_dat, m->m_size); + + m->m_ext = dat; + m->m_data = m->m_ext + datasize; + m->m_flags |= M_EXT; + } + + m->m_size = size; + +} + + + +void +m_adj(struct mbuf *m, int len) +{ + if (m == NULL) + return; + if (len >= 0) { + /* Trim from head */ + m->m_data += len; + m->m_len -= len; + } else { + /* Trim from tail */ + len = -len; + m->m_len -= len; + } +} + + +/* + * Copy len bytes from m, starting off bytes into n + */ +int +m_copy(struct mbuf *n, struct mbuf *m, int off, int len) +{ + if (len > M_FREEROOM(n)) + return -1; + + memcpy((n->m_data + n->m_len), (m->m_data + off), len); + n->m_len += len; + return 0; +} + + +/* + * Given a pointer into an mbuf, return the mbuf + * XXX This is a kludge, I should eliminate the need for it + * Fortunately, it's not used often + */ +struct mbuf * +dtom(Slirp *slirp, void *dat) +{ + struct mbuf *m; + + DEBUG_CALL("dtom"); + DEBUG_ARG("dat = %lx", (long )dat); + + /* bug corrected for M_EXT buffers */ + for (m = slirp->m_usedlist.m_next; m != &slirp->m_usedlist; + m = m->m_next) { + if (m->m_flags & M_EXT) { + if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) ) + return m; + } else { + if( (char *)dat >= m->m_dat && (char *)dat<(m->m_dat + m->m_size) ) + return m; + } + } + + DEBUG_ERROR((dfd, "dtom failed")); + + return (struct mbuf *)0; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h new file mode 100644 index 0000000..97729e2 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/mbuf.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mbuf.h 8.3 (Berkeley) 1/21/94 + * mbuf.h,v 1.9 1994/11/14 13:54:20 bde Exp + */ + +#ifndef _MBUF_H_ +#define _MBUF_H_ + +#define m_freem m_free + + +#define MINCSIZE 4096 /* Amount to increase mbuf if too small */ + +/* + * Macros for type conversion + * mtod(m,t) - convert mbuf pointer to data pointer of correct type + */ +#define mtod(m,t) ((t)(m)->m_data) + +/* XXX About mbufs for slirp: + * Only one mbuf is ever used in a chain, for each "cell" of data. + * m_nextpkt points to the next packet, if fragmented. + * If the data is too large, the M_EXT is used, and a larger block + * is alloced. Therefore, m_free[m] must check for M_EXT and if set + * free the m_ext. This is inefficient memory-wise, but who cares. + */ + +/* XXX should union some of these! */ +/* header at beginning of each mbuf: */ +struct m_hdr { + struct mbuf *mh_next; /* Linked list of mbufs */ + struct mbuf *mh_prev; + struct mbuf *mh_nextpkt; /* Next packet in queue/record */ + struct mbuf *mh_prevpkt; /* Flags aren't used in the output queue */ + int mh_flags; /* Misc flags */ + + int mh_size; /* Size of data */ + struct socket *mh_so; + + caddr_t mh_data; /* Location of data */ + int mh_len; /* Amount of data in this mbuf */ +}; + +/* + * How much room is in the mbuf, from m_data to the end of the mbuf + */ +#define M_ROOM(m) ((m->m_flags & M_EXT)? \ + (((m)->m_ext + (m)->m_size) - (m)->m_data) \ + : \ + (((m)->m_dat + (m)->m_size) - (m)->m_data)) + +/* + * How much free room there is + */ +#define M_FREEROOM(m) (M_ROOM(m) - (m)->m_len) +#define M_TRAILINGSPACE M_FREEROOM + +struct mbuf { + struct m_hdr m_hdr; + Slirp *slirp; + union M_dat { + char m_dat_[1]; /* ANSI don't like 0 sized arrays */ + char *m_ext_; + } M_dat; +}; + +#define m_next m_hdr.mh_next +#define m_prev m_hdr.mh_prev +#define m_nextpkt m_hdr.mh_nextpkt +#define m_prevpkt m_hdr.mh_prevpkt +#define m_flags m_hdr.mh_flags +#define m_len m_hdr.mh_len +#define m_data m_hdr.mh_data +#define m_size m_hdr.mh_size +#define m_dat M_dat.m_dat_ +#define m_ext M_dat.m_ext_ +#define m_so m_hdr.mh_so + +#define ifq_prev m_prev +#define ifq_next m_next +#define ifs_prev m_prevpkt +#define ifs_next m_nextpkt +#define ifq_so m_so + +#define M_EXT 0x01 /* m_ext points to more (malloced) data */ +#define M_FREELIST 0x02 /* mbuf is on free list */ +#define M_USEDLIST 0x04 /* XXX mbuf is on used list (for dtom()) */ +#define M_DOFREE 0x08 /* when m_free is called on the mbuf, free() + * it rather than putting it on the free list */ + +void m_init(Slirp *); +struct mbuf * m_get(Slirp *); +void m_free(struct mbuf *); +void m_cat(register struct mbuf *, register struct mbuf *); +void m_inc(struct mbuf *, int); +void m_adj(struct mbuf *, int); +int m_copy(struct mbuf *, struct mbuf *, int, int); +struct mbuf * dtom(Slirp *, void *); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c new file mode 100644 index 0000000..7a79cdb --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.c @@ -0,0 +1,403 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" + +#ifdef DEBUG +int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR; +#endif + +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +inline void +insque(void *a, void *b) +{ + register struct quehead *element = (struct quehead *) a; + register struct quehead *head = (struct quehead *) b; + element->qh_link = head->qh_link; + head->qh_link = (struct quehead *)element; + element->qh_rlink = (struct quehead *)head; + ((struct quehead *)(element->qh_link))->qh_rlink + = (struct quehead *)element; +} + +inline void +remque(void *a) +{ + register struct quehead *element = (struct quehead *) a; + ((struct quehead *)(element->qh_link))->qh_rlink = element->qh_rlink; + ((struct quehead *)(element->qh_rlink))->qh_link = element->qh_link; + element->qh_rlink = NULL; +} + +int add_exec(struct ex_list **ex_ptr, int do_pty, char *exec, + struct in_addr addr, int port) +{ + struct ex_list *tmp_ptr; + + /* First, check if the port is "bound" */ + for (tmp_ptr = *ex_ptr; tmp_ptr; tmp_ptr = tmp_ptr->ex_next) { + if (port == tmp_ptr->ex_fport && + addr.s_addr == tmp_ptr->ex_addr.s_addr) + return -1; + } + + tmp_ptr = *ex_ptr; + *ex_ptr = (struct ex_list *)malloc(sizeof(struct ex_list)); + (*ex_ptr)->ex_fport = port; + (*ex_ptr)->ex_addr = addr; + (*ex_ptr)->ex_pty = do_pty; + (*ex_ptr)->ex_exec = (do_pty == 3) ? exec : strdup(exec); + (*ex_ptr)->ex_next = tmp_ptr; + return 0; +} + +#ifndef HAVE_STRERROR + +/* + * For systems with no strerror + */ + +extern int sys_nerr; +extern char *sys_errlist[]; + +char * +strerror(error) + int error; +{ + if (error < sys_nerr) + return sys_errlist[error]; + else + return "Unknown error."; +} + +#endif + +int os_socket(int domain, int type, int protocol) +{ + return socket(domain, type, protocol); +} + +uint32_t os_get_time_ms(void) +{ + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1000 + + (ts.tv_nsec / 1000000); +} + + +#if 1 + +int +fork_exec(struct socket *so, const char *ex, int do_pty) +{ + /* not implemented */ + return 0; +} + +#else + +/* + * XXX This is ugly + * We create and bind a socket, then fork off to another + * process, which connects to this socket, after which we + * exec the wanted program. If something (strange) happens, + * the accept() call could block us forever. + * + * do_pty = 0 Fork/exec inetd style + * do_pty = 1 Fork/exec using slirp.telnetd + * do_ptr = 2 Fork/exec using pty + */ +int +fork_exec(struct socket *so, const char *ex, int do_pty) +{ + int s; + struct sockaddr_in addr; + socklen_t addrlen = sizeof(addr); + int opt; + int master = -1; + const char *argv[256]; + /* don't want to clobber the original */ + char *bptr; + const char *curarg; + int c, i, ret; + + DEBUG_CALL("fork_exec"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("ex = %lx", (long)ex); + DEBUG_ARG("do_pty = %lx", (long)do_pty); + + if (do_pty == 2) { + return 0; + } else { + addr.sin_family = AF_INET; + addr.sin_port = 0; + addr.sin_addr.s_addr = INADDR_ANY; + + if ((s = os_socket(AF_INET, SOCK_STREAM, 0)) < 0 || + bind(s, (struct sockaddr *)&addr, addrlen) < 0 || + listen(s, 1) < 0) { + lprint("Error: inet socket: %s\n", strerror(errno)); + closesocket(s); + + return 0; + } + } + + switch(fork()) { + case -1: + lprint("Error: fork failed: %s\n", strerror(errno)); + close(s); + if (do_pty == 2) + close(master); + return 0; + + case 0: + /* Set the DISPLAY */ + if (do_pty == 2) { + (void) close(master); +#ifdef TIOCSCTTY /* XXXXX */ + (void) setsid(); + ioctl(s, TIOCSCTTY, (char *)NULL); +#endif + } else { + getsockname(s, (struct sockaddr *)&addr, &addrlen); + close(s); + /* + * Connect to the socket + * XXX If any of these fail, we're in trouble! + */ + s = os_socket(AF_INET, SOCK_STREAM, 0); + addr.sin_addr = loopback_addr; + do { + ret = connect(s, (struct sockaddr *)&addr, addrlen); + } while (ret < 0 && errno == EINTR); + } + + dup2(s, 0); + dup2(s, 1); + dup2(s, 2); + for (s = getdtablesize() - 1; s >= 3; s--) + close(s); + + i = 0; + bptr = qemu_strdup(ex); /* No need to free() this */ + if (do_pty == 1) { + /* Setup "slirp.telnetd -x" */ + argv[i++] = "slirp.telnetd"; + argv[i++] = "-x"; + argv[i++] = bptr; + } else + do { + /* Change the string into argv[] */ + curarg = bptr; + while (*bptr != ' ' && *bptr != (char)0) + bptr++; + c = *bptr; + *bptr++ = (char)0; + argv[i++] = strdup(curarg); + } while (c); + + argv[i] = NULL; + execvp(argv[0], (char **)argv); + + /* Ooops, failed, let's tell the user why */ + fprintf(stderr, "Error: execvp of %s failed: %s\n", + argv[0], strerror(errno)); + close(0); close(1); close(2); /* XXX */ + exit(1); + + default: + if (do_pty == 2) { + close(s); + so->s = master; + } else { + /* + * XXX this could block us... + * XXX Should set a timer here, and if accept() doesn't + * return after X seconds, declare it a failure + * The only reason this will block forever is if socket() + * of connect() fail in the child process + */ + do { + so->s = accept(s, (struct sockaddr *)&addr, &addrlen); + } while (so->s < 0 && errno == EINTR); + closesocket(s); + opt = 1; + setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)); + opt = 1; + setsockopt(so->s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int)); + } + fd_nonblock(so->s); + + /* Append the telnet options now */ + if (so->so_m != NULL && do_pty == 1) { + sbappend(so, so->so_m); + so->so_m = NULL; + } + + return 1; + } +} +#endif + +#ifndef HAVE_STRDUP +char * +strdup(str) + const char *str; +{ + char *bptr; + + bptr = (char *)malloc(strlen(str)+1); + strcpy(bptr, str); + + return bptr; +} +#endif + +void lprint(const char *format, ...) +{ + va_list args; + + va_start(args, format); + vprintf(format, args); + va_end(args); +} + +/* + * Set fd blocking and non-blocking + */ + +void +fd_nonblock(int fd) +{ +#ifdef FIONBIO +#ifdef _WIN32 + unsigned long opt = 1; +#else + int opt = 1; +#endif + + ioctlsocket(fd, FIONBIO, &opt); +#else + int opt; + + opt = fcntl(fd, F_GETFL, 0); + opt |= O_NONBLOCK; + fcntl(fd, F_SETFL, opt); +#endif +} + +void +fd_block(int fd) +{ +#ifdef FIONBIO +#ifdef _WIN32 + unsigned long opt = 0; +#else + int opt = 0; +#endif + + ioctlsocket(fd, FIONBIO, &opt); +#else + int opt; + + opt = fcntl(fd, F_GETFL, 0); + opt &= ~O_NONBLOCK; + fcntl(fd, F_SETFL, opt); +#endif +} + +#if 0 +void slirp_connection_info(Slirp *slirp, Monitor *mon) +{ + const char * const tcpstates[] = { + [TCPS_CLOSED] = "CLOSED", + [TCPS_LISTEN] = "LISTEN", + [TCPS_SYN_SENT] = "SYN_SENT", + [TCPS_SYN_RECEIVED] = "SYN_RCVD", + [TCPS_ESTABLISHED] = "ESTABLISHED", + [TCPS_CLOSE_WAIT] = "CLOSE_WAIT", + [TCPS_FIN_WAIT_1] = "FIN_WAIT_1", + [TCPS_CLOSING] = "CLOSING", + [TCPS_LAST_ACK] = "LAST_ACK", + [TCPS_FIN_WAIT_2] = "FIN_WAIT_2", + [TCPS_TIME_WAIT] = "TIME_WAIT", + }; + struct in_addr dst_addr; + struct sockaddr_in src; + socklen_t src_len; + uint16_t dst_port; + struct socket *so; + const char *state; + char buf[20]; + int n; + + monitor_printf(mon, " Protocol[State] FD Source Address Port " + "Dest. Address Port RecvQ SendQ\n"); + + for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) { + if (so->so_state & SS_HOSTFWD) { + state = "HOST_FORWARD"; + } else if (so->so_tcpcb) { + state = tcpstates[so->so_tcpcb->t_state]; + } else { + state = "NONE"; + } + if (so->so_state & (SS_HOSTFWD | SS_INCOMING)) { + src_len = sizeof(src); + getsockname(so->s, (struct sockaddr *)&src, &src_len); + dst_addr = so->so_laddr; + dst_port = so->so_lport; + } else { + src.sin_addr = so->so_laddr; + src.sin_port = so->so_lport; + dst_addr = so->so_faddr; + dst_port = so->so_fport; + } + n = snprintf(buf, sizeof(buf), " TCP[%s]", state); + memset(&buf[n], ' ', 19 - n); + buf[19] = 0; + monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s, + src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*", + ntohs(src.sin_port)); + monitor_printf(mon, "%15s %5d %5d %5d\n", + inet_ntoa(dst_addr), ntohs(dst_port), + so->so_rcv.sb_cc, so->so_snd.sb_cc); + } + + for (so = slirp->udb.so_next; so != &slirp->udb; so = so->so_next) { + if (so->so_state & SS_HOSTFWD) { + n = snprintf(buf, sizeof(buf), " UDP[HOST_FORWARD]"); + src_len = sizeof(src); + getsockname(so->s, (struct sockaddr *)&src, &src_len); + dst_addr = so->so_laddr; + dst_port = so->so_lport; + } else { + n = snprintf(buf, sizeof(buf), " UDP[%d sec]", + (so->so_expire - curtime) / 1000); + src.sin_addr = so->so_laddr; + src.sin_port = so->so_lport; + dst_addr = so->so_faddr; + dst_port = so->so_fport; + } + memset(&buf[n], ' ', 19 - n); + buf[19] = 0; + monitor_printf(mon, "%s %3d %15s %5d ", buf, so->s, + src.sin_addr.s_addr ? inet_ntoa(src.sin_addr) : "*", + ntohs(src.sin_port)); + monitor_printf(mon, "%15s %5d %5d %5d\n", + inet_ntoa(dst_addr), ntohs(dst_port), + so->so_rcv.sb_cc, so->so_snd.sb_cc); + } +} +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h new file mode 100644 index 0000000..5c307c9 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/misc.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#ifndef _MISC_H_ +#define _MISC_H_ + +struct ex_list { + int ex_pty; /* Do we want a pty? */ + struct in_addr ex_addr; /* Server address */ + int ex_fport; /* Port to telnet to */ + const char *ex_exec; /* Command line of what to exec */ + struct ex_list *ex_next; +}; + +#ifndef HAVE_STRDUP +char *strdup(const char *); +#endif + +void do_wait(int); + +#define EMU_NONE 0x0 + +/* TCP emulations */ +#define EMU_CTL 0x1 +#define EMU_FTP 0x2 +#define EMU_KSH 0x3 +#define EMU_IRC 0x4 +#define EMU_REALAUDIO 0x5 +#define EMU_RLOGIN 0x6 +#define EMU_IDENT 0x7 +#define EMU_RSH 0x8 + +#define EMU_NOCONNECT 0x10 /* Don't connect */ + +struct tos_t { + uint16_t lport; + uint16_t fport; + uint8_t tos; + uint8_t emu; +}; + +struct emu_t { + uint16_t lport; + uint16_t fport; + uint8_t tos; + uint8_t emu; + struct emu_t *next; +}; + +extern int x_port, x_server, x_display; + +int show_x(char *, struct socket *); +void redir_x(uint32_t, int, int, int); +void slirp_insque(void *, void *); +void slirp_remque(void *); +int add_exec(struct ex_list **, int, char *, struct in_addr, int); +int slirp_openpty(int *, int *); +int fork_exec(struct socket *so, const char *ex, int do_pty); +void snooze_hup(int); +void snooze(void); +void relay(int); +void add_emu(char *); +void fd_nonblock(int); +void fd_block(int); +int rsh_exec(struct socket *, struct socket *, char *, char *, char *); +int os_socket(int domain, int type, int protocol); +uint32_t os_get_time_ms(void); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c new file mode 100644 index 0000000..ac20f21 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" + +static void sbappendsb(struct sbuf *sb, struct mbuf *m); + +void +sbfree(struct sbuf *sb) +{ + free(sb->sb_data); +} + +void +sbdrop(struct sbuf *sb, int num) +{ + /* + * We can only drop how much we have + * This should never succeed + */ + if(num > sb->sb_cc) + num = sb->sb_cc; + sb->sb_cc -= num; + sb->sb_rptr += num; + if(sb->sb_rptr >= sb->sb_data + sb->sb_datalen) + sb->sb_rptr -= sb->sb_datalen; + +} + +void +sbreserve(struct sbuf *sb, int size) +{ + if (sb->sb_data) { + /* Already alloced, realloc if necessary */ + if (sb->sb_datalen != size) { + sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)realloc(sb->sb_data, size); + sb->sb_cc = 0; + if (sb->sb_wptr) + sb->sb_datalen = size; + else + sb->sb_datalen = 0; + } + } else { + sb->sb_wptr = sb->sb_rptr = sb->sb_data = (char *)malloc(size); + sb->sb_cc = 0; + if (sb->sb_wptr) + sb->sb_datalen = size; + else + sb->sb_datalen = 0; + } +} + +/* + * Try and write() to the socket, whatever doesn't get written + * append to the buffer... for a host with a fast net connection, + * this prevents an unnecessary copy of the data + * (the socket is non-blocking, so we won't hang) + */ +void +sbappend(struct socket *so, struct mbuf *m) +{ + int ret = 0; + + DEBUG_CALL("sbappend"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("m = %lx", (long)m); + DEBUG_ARG("m->m_len = %d", m->m_len); + + /* Shouldn't happen, but... e.g. foreign host closes connection */ + if (m->m_len <= 0) { + m_free(m); + return; + } + + /* + * If there is urgent data, call sosendoob + * if not all was sent, sowrite will take care of the rest + * (The rest of this function is just an optimisation) + */ + if (so->so_urgc) { + sbappendsb(&so->so_rcv, m); + m_free(m); + sosendoob(so); + return; + } + + /* + * We only write if there's nothing in the buffer, + * ottherwise it'll arrive out of order, and hence corrupt + */ + if (!so->so_rcv.sb_cc) + ret = slirp_send(so, m->m_data, m->m_len, 0); + + if (ret <= 0) { + /* + * Nothing was written + * It's possible that the socket has closed, but + * we don't need to check because if it has closed, + * it will be detected in the normal way by soread() + */ + sbappendsb(&so->so_rcv, m); + } else if (ret != m->m_len) { + /* + * Something was written, but not everything.. + * sbappendsb the rest + */ + m->m_len -= ret; + m->m_data += ret; + sbappendsb(&so->so_rcv, m); + } /* else */ + /* Whatever happened, we free the mbuf */ + m_free(m); +} + +/* + * Copy the data from m into sb + * The caller is responsible to make sure there's enough room + */ +static void +sbappendsb(struct sbuf *sb, struct mbuf *m) +{ + int len, n, nn; + + len = m->m_len; + + if (sb->sb_wptr < sb->sb_rptr) { + n = sb->sb_rptr - sb->sb_wptr; + if (n > len) n = len; + memcpy(sb->sb_wptr, m->m_data, n); + } else { + /* Do the right edge first */ + n = sb->sb_data + sb->sb_datalen - sb->sb_wptr; + if (n > len) n = len; + memcpy(sb->sb_wptr, m->m_data, n); + len -= n; + if (len) { + /* Now the left edge */ + nn = sb->sb_rptr - sb->sb_data; + if (nn > len) nn = len; + memcpy(sb->sb_data,m->m_data+n,nn); + n += nn; + } + } + + sb->sb_cc += n; + sb->sb_wptr += n; + if (sb->sb_wptr >= sb->sb_data + sb->sb_datalen) + sb->sb_wptr -= sb->sb_datalen; +} + +/* + * Copy data from sbuf to a normal, straight buffer + * Don't update the sbuf rptr, this will be + * done in sbdrop when the data is acked + */ +void +sbcopy(struct sbuf *sb, int off, int len, char *to) +{ + char *from; + + from = sb->sb_rptr + off; + if (from >= sb->sb_data + sb->sb_datalen) + from -= sb->sb_datalen; + + if (from < sb->sb_wptr) { + if (len > sb->sb_cc) len = sb->sb_cc; + memcpy(to,from,len); + } else { + /* re-use off */ + off = (sb->sb_data + sb->sb_datalen) - from; + if (off > len) off = len; + memcpy(to,from,off); + len -= off; + if (len) + memcpy(to+off,sb->sb_data,len); + } +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h new file mode 100644 index 0000000..4f22e7c --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/sbuf.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#ifndef _SBUF_H_ +#define _SBUF_H_ + +#define sbflush(sb) sbdrop((sb),(sb)->sb_cc) +#define sbspace(sb) ((sb)->sb_datalen - (sb)->sb_cc) + +struct sbuf { + u_int sb_cc; /* actual chars in buffer */ + u_int sb_datalen; /* Length of data */ + char *sb_wptr; /* write pointer. points to where the next + * bytes should be written in the sbuf */ + char *sb_rptr; /* read pointer. points to where the next + * byte should be read from the sbuf */ + char *sb_data; /* Actual data */ +}; + +void sbfree(struct sbuf *); +void sbdrop(struct sbuf *, int); +void sbreserve(struct sbuf *, int); +void sbappend(struct socket *, struct mbuf *); +void sbcopy(struct sbuf *, int, int, char *); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c new file mode 100644 index 0000000..db8c117 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.c @@ -0,0 +1,828 @@ +/* + * libslirp glue + * + * Copyright (c) 2004-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "slirp.h" + +/* host loopback address */ +struct in_addr loopback_addr; + +/* emulated hosts use the MAC addr 52:55:IP:IP:IP:IP */ +static const uint8_t special_ethaddr[6] = { + 0x52, 0x55, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint8_t zero_ethaddr[6] = { 0, 0, 0, 0, 0, 0 }; + +/* XXX: suppress those select globals */ +fd_set *global_readfds, *global_writefds, *global_xfds; + +u_int curtime; +static u_int time_fasttimo, last_slowtimo; +static int do_slowtimo; + +static struct in_addr dns_addr; +static u_int dns_addr_time; + +#ifdef _WIN32 + +int get_dns_addr(struct in_addr *pdns_addr) +{ + FIXED_INFO *FixedInfo=NULL; + ULONG BufLen; + DWORD ret; + IP_ADDR_STRING *pIPAddr; + struct in_addr tmp_addr; + + if (dns_addr.s_addr != 0 && (curtime - dns_addr_time) < 1000) { + *pdns_addr = dns_addr; + return 0; + } + + FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof(FIXED_INFO)); + BufLen = sizeof(FIXED_INFO); + + if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &BufLen)) { + if (FixedInfo) { + GlobalFree(FixedInfo); + FixedInfo = NULL; + } + FixedInfo = GlobalAlloc(GPTR, BufLen); + } + + if ((ret = GetNetworkParams(FixedInfo, &BufLen)) != ERROR_SUCCESS) { + printf("GetNetworkParams failed. ret = %08x\n", (u_int)ret ); + if (FixedInfo) { + GlobalFree(FixedInfo); + FixedInfo = NULL; + } + return -1; + } + + pIPAddr = &(FixedInfo->DnsServerList); + inet_aton(pIPAddr->IpAddress.String, &tmp_addr); + *pdns_addr = tmp_addr; + dns_addr = tmp_addr; + dns_addr_time = curtime; + if (FixedInfo) { + GlobalFree(FixedInfo); + FixedInfo = NULL; + } + return 0; +} + +static void winsock_cleanup(void) +{ + WSACleanup(); +} + +#else + +static struct stat dns_addr_stat; + +int get_dns_addr(struct in_addr *pdns_addr) +{ + char buff[512]; + char buff2[257]; + FILE *f; + int found = 0; + struct in_addr tmp_addr; + + if (dns_addr.s_addr != 0) { + struct stat old_stat; + if ((curtime - dns_addr_time) < 1000) { + *pdns_addr = dns_addr; + return 0; + } + old_stat = dns_addr_stat; + if (stat("/etc/resolv.conf", &dns_addr_stat) != 0) + return -1; + if ((dns_addr_stat.st_dev == old_stat.st_dev) + && (dns_addr_stat.st_ino == old_stat.st_ino) + && (dns_addr_stat.st_size == old_stat.st_size) + && (dns_addr_stat.st_mtime == old_stat.st_mtime)) { + *pdns_addr = dns_addr; + return 0; + } + } + + f = fopen("/etc/resolv.conf", "r"); + if (!f) + return -1; + +#ifdef DEBUG + lprint("IP address of your DNS(s): "); +#endif + while (fgets(buff, 512, f) != NULL) { + if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) { + if (!inet_aton(buff2, &tmp_addr)) + continue; + /* If it's the first one, set it to dns_addr */ + if (!found) { + *pdns_addr = tmp_addr; + dns_addr = tmp_addr; + dns_addr_time = curtime; + } +#ifdef DEBUG + else + lprint(", "); +#endif + if (++found > 3) { +#ifdef DEBUG + lprint("(more)"); +#endif + break; + } +#ifdef DEBUG + else + lprint("%s", inet_ntoa(tmp_addr)); +#endif + } + } + fclose(f); + if (!found) + return -1; + return 0; +} + +#endif + +static void slirp_init_once(void) +{ + static int initialized; +#ifdef _WIN32 + WSADATA Data; +#endif + + if (initialized) { + return; + } + initialized = 1; + +#ifdef _WIN32 + WSAStartup(MAKEWORD(2,0), &Data); + atexit(winsock_cleanup); +#endif + + loopback_addr.s_addr = htonl(INADDR_LOOPBACK); +} + +Slirp *slirp_init(int restricted, struct in_addr vnetwork, + struct in_addr vnetmask, struct in_addr vhost, + const char *vhostname, const char *tftp_path, + const char *bootfile, struct in_addr vdhcp_start, + struct in_addr vnameserver, void *opaque) +{ + Slirp *slirp = mallocz(sizeof(Slirp)); + + slirp_init_once(); + + slirp->restricted = restricted; + + if_init(slirp); + ip_init(slirp); + + /* Initialise mbufs *after* setting the MTU */ + m_init(slirp); + + slirp->vnetwork_addr = vnetwork; + slirp->vnetwork_mask = vnetmask; + slirp->vhost_addr = vhost; + if (vhostname) { + pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostname), + vhostname); + } + if (tftp_path) { + slirp->tftp_prefix = strdup(tftp_path); + } + if (bootfile) { + slirp->bootp_filename = strdup(bootfile); + } + slirp->vdhcp_startaddr = vdhcp_start; + slirp->vnameserver_addr = vnameserver; + + slirp->opaque = opaque; + + return slirp; +} + +void slirp_cleanup(Slirp *slirp) +{ + free(slirp->tftp_prefix); + free(slirp->bootp_filename); + free(slirp); +} + +#define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED) +#define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED) +#define UPD_NFDS(x) if (nfds < (x)) nfds = (x) + +void slirp_select_fill(Slirp *slirp, int *pnfds, + fd_set *readfds, fd_set *writefds, fd_set *xfds) +{ + struct socket *so, *so_next; + int nfds; + + /* fail safe */ + global_readfds = NULL; + global_writefds = NULL; + global_xfds = NULL; + + nfds = *pnfds; + /* + * First, TCP sockets + */ + do_slowtimo = 0; + + { + /* + * *_slowtimo needs calling if there are IP fragments + * in the fragment queue, or there are TCP connections active + */ + do_slowtimo |= ((slirp->tcb.so_next != &slirp->tcb) || + (&slirp->ipq.ip_link != slirp->ipq.ip_link.next)); + + for (so = slirp->tcb.so_next; so != &slirp->tcb; + so = so_next) { + so_next = so->so_next; + + /* + * See if we need a tcp_fasttimo + */ + if (time_fasttimo == 0 && so->so_tcpcb->t_flags & TF_DELACK) + time_fasttimo = curtime; /* Flag when we want a fasttimo */ + + /* + * NOFDREF can include still connecting to local-host, + * newly socreated() sockets etc. Don't want to select these. + */ + if (so->so_state & SS_NOFDREF || so->s == -1) + continue; + + /* + * Set for reading sockets which are accepting + */ + if (so->so_state & SS_FACCEPTCONN) { + FD_SET(so->s, readfds); + UPD_NFDS(so->s); + continue; + } + + /* + * Set for writing sockets which are connecting + */ + if (so->so_state & SS_ISFCONNECTING) { + FD_SET(so->s, writefds); + UPD_NFDS(so->s); + continue; + } + + /* + * Set for writing if we are connected, can send more, and + * we have something to send + */ + if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) { + FD_SET(so->s, writefds); + UPD_NFDS(so->s); + } + + /* + * Set for reading (and urgent data) if we are connected, can + * receive more, and we have room for it XXX /2 ? + */ + if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) { + FD_SET(so->s, readfds); + FD_SET(so->s, xfds); + UPD_NFDS(so->s); + } + } + + /* + * UDP sockets + */ + for (so = slirp->udb.so_next; so != &slirp->udb; + so = so_next) { + so_next = so->so_next; + + /* + * See if it's timed out + */ + if (so->so_expire) { + if (so->so_expire <= curtime) { + udp_detach(so); + continue; + } else + do_slowtimo = 1; /* Let socket expire */ + } + + /* + * When UDP packets are received from over the + * link, they're sendto()'d straight away, so + * no need for setting for writing + * Limit the number of packets queued by this session + * to 4. Note that even though we try and limit this + * to 4 packets, the session could have more queued + * if the packets needed to be fragmented + * (XXX <= 4 ?) + */ + if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) { + FD_SET(so->s, readfds); + UPD_NFDS(so->s); + } + } + } + + *pnfds = nfds; +} + +void slirp_select_poll(Slirp *slirp, + fd_set *readfds, fd_set *writefds, fd_set *xfds, + int select_error) +{ + struct socket *so, *so_next; + int ret; + + global_readfds = readfds; + global_writefds = writefds; + global_xfds = xfds; + + curtime = os_get_time_ms(); + + { + /* + * See if anything has timed out + */ + if (time_fasttimo && ((curtime - time_fasttimo) >= 2)) { + tcp_fasttimo(slirp); + time_fasttimo = 0; + } + if (do_slowtimo && ((curtime - last_slowtimo) >= 499)) { + ip_slowtimo(slirp); + tcp_slowtimo(slirp); + last_slowtimo = curtime; + } + + /* + * Check sockets + */ + if (!select_error) { + /* + * Check TCP sockets + */ + for (so = slirp->tcb.so_next; so != &slirp->tcb; + so = so_next) { + so_next = so->so_next; + + /* + * FD_ISSET is meaningless on these sockets + * (and they can crash the program) + */ + if (so->so_state & SS_NOFDREF || so->s == -1) + continue; + + /* + * Check for URG data + * This will soread as well, so no need to + * test for readfds below if this succeeds + */ + if (FD_ISSET(so->s, xfds)) + sorecvoob(so); + /* + * Check sockets for reading + */ + else if (FD_ISSET(so->s, readfds)) { + /* + * Check for incoming connections + */ + if (so->so_state & SS_FACCEPTCONN) { + tcp_connect(so); + continue; + } /* else */ + ret = soread(so); + + /* Output it if we read something */ + if (ret > 0) + tcp_output(sototcpcb(so)); + } + + /* + * Check sockets for writing + */ + if (FD_ISSET(so->s, writefds)) { + /* + * Check for non-blocking, still-connecting sockets + */ + if (so->so_state & SS_ISFCONNECTING) { + /* Connected */ + so->so_state &= ~SS_ISFCONNECTING; + + ret = send(so->s, (const void *) &ret, 0, 0); + if (ret < 0) { + /* XXXXX Must fix, zero bytes is a NOP */ + if (errno == EAGAIN || errno == EWOULDBLOCK || + errno == EINPROGRESS || errno == ENOTCONN) + continue; + + /* else failed */ + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_NOFDREF; + } + /* else so->so_state &= ~SS_ISFCONNECTING; */ + + /* + * Continue tcp_input + */ + tcp_input((struct mbuf *)NULL, sizeof(struct ip), so); + /* continue; */ + } else + ret = sowrite(so); + /* + * XXXXX If we wrote something (a lot), there + * could be a need for a window update. + * In the worst case, the remote will send + * a window probe to get things going again + */ + } + + /* + * Probe a still-connecting, non-blocking socket + * to check if it's still alive + */ +#ifdef PROBE_CONN + if (so->so_state & SS_ISFCONNECTING) { + ret = recv(so->s, (char *)&ret, 0,0); + + if (ret < 0) { + /* XXX */ + if (errno == EAGAIN || errno == EWOULDBLOCK || + errno == EINPROGRESS || errno == ENOTCONN) + continue; /* Still connecting, continue */ + + /* else failed */ + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_NOFDREF; + + /* tcp_input will take care of it */ + } else { + ret = send(so->s, &ret, 0,0); + if (ret < 0) { + /* XXX */ + if (errno == EAGAIN || errno == EWOULDBLOCK || + errno == EINPROGRESS || errno == ENOTCONN) + continue; + /* else failed */ + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_NOFDREF; + } else + so->so_state &= ~SS_ISFCONNECTING; + + } + tcp_input((struct mbuf *)NULL, sizeof(struct ip),so); + } /* SS_ISFCONNECTING */ +#endif + } + + /* + * Now UDP sockets. + * Incoming packets are sent straight away, they're not buffered. + * Incoming UDP data isn't buffered either. + */ + for (so = slirp->udb.so_next; so != &slirp->udb; + so = so_next) { + so_next = so->so_next; + + if (so->s != -1 && FD_ISSET(so->s, readfds)) { + sorecvfrom(so); + } + } + } + + /* + * See if we can start outputting + */ + if (slirp->if_queued) { + if_start(slirp); + } + } + + /* clear global file descriptor sets. + * these reside on the stack in vl.c + * so they're unusable if we're not in + * slirp_select_fill or slirp_select_poll. + */ + global_readfds = NULL; + global_writefds = NULL; + global_xfds = NULL; +} + +#define ETH_ALEN 6 +#define ETH_HLEN 14 + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_P_ARP 0x0806 /* Address Resolution packet */ + +#define ARPOP_REQUEST 1 /* ARP request */ +#define ARPOP_REPLY 2 /* ARP reply */ + +struct ethhdr +{ + unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ + unsigned char h_source[ETH_ALEN]; /* source ether addr */ + unsigned short h_proto; /* packet type ID field */ +}; + +struct arphdr +{ + unsigned short ar_hrd; /* format of hardware address */ + unsigned short ar_pro; /* format of protocol address */ + unsigned char ar_hln; /* length of hardware address */ + unsigned char ar_pln; /* length of protocol address */ + unsigned short ar_op; /* ARP opcode (command) */ + + /* + * Ethernet looks like this : This bit is variable sized however... + */ + unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */ + uint32_t ar_sip; /* sender IP address */ + unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ + uint32_t ar_tip ; /* target IP address */ +} __attribute__((packed)); + +static void arp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) +{ + struct ethhdr *eh = (struct ethhdr *)pkt; + struct arphdr *ah = (struct arphdr *)(pkt + ETH_HLEN); + uint8_t arp_reply[max(ETH_HLEN + sizeof(struct arphdr), 64)]; + struct ethhdr *reh = (struct ethhdr *)arp_reply; + struct arphdr *rah = (struct arphdr *)(arp_reply + ETH_HLEN); + int ar_op; + struct ex_list *ex_ptr; + + ar_op = ntohs(ah->ar_op); + switch(ar_op) { + case ARPOP_REQUEST: + if ((ah->ar_tip & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + if (ah->ar_tip == slirp->vnameserver_addr.s_addr || + ah->ar_tip == slirp->vhost_addr.s_addr) + goto arp_ok; + for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) { + if (ex_ptr->ex_addr.s_addr == ah->ar_tip) + goto arp_ok; + } + return; + arp_ok: + memset(arp_reply, 0, sizeof(arp_reply)); + /* XXX: make an ARP request to have the client address */ + memcpy(slirp->client_ethaddr, eh->h_source, ETH_ALEN); + + /* ARP request for alias/dns mac address */ + memcpy(reh->h_dest, pkt + ETH_ALEN, ETH_ALEN); + memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4); + memcpy(&reh->h_source[2], &ah->ar_tip, 4); + reh->h_proto = htons(ETH_P_ARP); + + rah->ar_hrd = htons(1); + rah->ar_pro = htons(ETH_P_IP); + rah->ar_hln = ETH_ALEN; + rah->ar_pln = 4; + rah->ar_op = htons(ARPOP_REPLY); + memcpy(rah->ar_sha, reh->h_source, ETH_ALEN); + rah->ar_sip = ah->ar_tip; + memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN); + rah->ar_tip = ah->ar_sip; + slirp_output(slirp->opaque, arp_reply, sizeof(arp_reply)); + } + break; + case ARPOP_REPLY: + /* reply to request of client mac address ? */ + if (!memcmp(slirp->client_ethaddr, zero_ethaddr, ETH_ALEN) && + ah->ar_sip == slirp->client_ipaddr.s_addr) { + memcpy(slirp->client_ethaddr, ah->ar_sha, ETH_ALEN); + } + break; + default: + break; + } +} + +void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len) +{ + struct mbuf *m; + int proto; + + if (pkt_len < ETH_HLEN) + return; + + proto = ntohs(*(uint16_t *)(pkt + 12)); + switch(proto) { + case ETH_P_ARP: + arp_input(slirp, pkt, pkt_len); + break; + case ETH_P_IP: + m = m_get(slirp); + if (!m) + return; + /* Note: we add to align the IP header */ + if (M_FREEROOM(m) < pkt_len + 2) { + m_inc(m, pkt_len + 2); + } + m->m_len = pkt_len + 2; + memcpy(m->m_data + 2, pkt, pkt_len); + + m->m_data += 2 + ETH_HLEN; + m->m_len -= 2 + ETH_HLEN; + + ip_input(m); + break; + default: + break; + } +} + +/* output the IP packet to the ethernet device */ +void if_encap(Slirp *slirp, const uint8_t *ip_data, int ip_data_len) +{ + uint8_t buf[1600]; + struct ethhdr *eh = (struct ethhdr *)buf; + + if (ip_data_len + ETH_HLEN > sizeof(buf)) + return; + + if (!memcmp(slirp->client_ethaddr, zero_ethaddr, ETH_ALEN)) { + uint8_t arp_req[ETH_HLEN + sizeof(struct arphdr)]; + struct ethhdr *reh = (struct ethhdr *)arp_req; + struct arphdr *rah = (struct arphdr *)(arp_req + ETH_HLEN); + const struct ip *iph = (const struct ip *)ip_data; + + /* If the client addr is not known, there is no point in + sending the packet to it. Normally the sender should have + done an ARP request to get its MAC address. Here we do it + in place of sending the packet and we hope that the sender + will retry sending its packet. */ + memset(reh->h_dest, 0xff, ETH_ALEN); + memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4); + memcpy(&reh->h_source[2], &slirp->vhost_addr, 4); + reh->h_proto = htons(ETH_P_ARP); + rah->ar_hrd = htons(1); + rah->ar_pro = htons(ETH_P_IP); + rah->ar_hln = ETH_ALEN; + rah->ar_pln = 4; + rah->ar_op = htons(ARPOP_REQUEST); + /* source hw addr */ + memcpy(rah->ar_sha, special_ethaddr, ETH_ALEN - 4); + memcpy(&rah->ar_sha[2], &slirp->vhost_addr, 4); + /* source IP */ + rah->ar_sip = slirp->vhost_addr.s_addr; + /* target hw addr (none) */ + memset(rah->ar_tha, 0, ETH_ALEN); + /* target IP */ + rah->ar_tip = iph->ip_dst.s_addr; + slirp->client_ipaddr = iph->ip_dst; + slirp_output(slirp->opaque, arp_req, sizeof(arp_req)); + } else { + memcpy(eh->h_dest, slirp->client_ethaddr, ETH_ALEN); + memcpy(eh->h_source, special_ethaddr, ETH_ALEN - 4); + /* XXX: not correct */ + memcpy(&eh->h_source[2], &slirp->vhost_addr, 4); + eh->h_proto = htons(ETH_P_IP); + memcpy(buf + sizeof(struct ethhdr), ip_data, ip_data_len); + slirp_output(slirp->opaque, buf, ip_data_len + ETH_HLEN); + } +} + +/* Drop host forwarding rule, return 0 if found. */ +int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, + int host_port) +{ + struct socket *so; + struct socket *head = (is_udp ? &slirp->udb : &slirp->tcb); + struct sockaddr_in addr; + int port = htons(host_port); + socklen_t addr_len; + + for (so = head->so_next; so != head; so = so->so_next) { + addr_len = sizeof(addr); + if ((so->so_state & SS_HOSTFWD) && + getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && + addr.sin_addr.s_addr == host_addr.s_addr && + addr.sin_port == port) { + close(so->s); + sofree(so); + return 0; + } + } + + return -1; +} + +int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, + int host_port, struct in_addr guest_addr, int guest_port) +{ + if (!guest_addr.s_addr) { + guest_addr = slirp->vdhcp_startaddr; + } + if (is_udp) { + if (!udp_listen(slirp, host_addr.s_addr, htons(host_port), + guest_addr.s_addr, htons(guest_port), SS_HOSTFWD)) + return -1; + } else { + if (!tcp_listen(slirp, host_addr.s_addr, htons(host_port), + guest_addr.s_addr, htons(guest_port), SS_HOSTFWD)) + return -1; + } + return 0; +} + +int slirp_add_exec(Slirp *slirp, int do_pty, const void *args, + struct in_addr *guest_addr, int guest_port) +{ + if (!guest_addr->s_addr) { + guest_addr->s_addr = slirp->vnetwork_addr.s_addr | + (htonl(0x0204) & ~slirp->vnetwork_mask.s_addr); + } + if ((guest_addr->s_addr & slirp->vnetwork_mask.s_addr) != + slirp->vnetwork_addr.s_addr || + guest_addr->s_addr == slirp->vhost_addr.s_addr || + guest_addr->s_addr == slirp->vnameserver_addr.s_addr) { + return -1; + } + return add_exec(&slirp->exec_list, do_pty, (char *)args, *guest_addr, + htons(guest_port)); +} + +ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags) +{ +#if 0 + if (so->s == -1 && so->extra) { + qemu_chr_write(so->extra, buf, len); + return len; + } +#endif + return send(so->s, buf, len, flags); +} + +static struct socket * +slirp_find_ctl_socket(Slirp *slirp, struct in_addr guest_addr, int guest_port) +{ + struct socket *so; + + for (so = slirp->tcb.so_next; so != &slirp->tcb; so = so->so_next) { + if (so->so_faddr.s_addr == guest_addr.s_addr && + htons(so->so_fport) == guest_port) { + return so; + } + } + return NULL; +} + +size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr, + int guest_port) +{ + struct iovec iov[2]; + struct socket *so; + + so = slirp_find_ctl_socket(slirp, guest_addr, guest_port); + + if (!so || so->so_state & SS_NOFDREF) + return 0; + + if (!CONN_CANFRCV(so) || so->so_snd.sb_cc >= (so->so_snd.sb_datalen/2)) + return 0; + + return sopreprbuf(so, iov, NULL); +} + +void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, int guest_port, + const uint8_t *buf, int size) +{ + int ret; + struct socket *so = slirp_find_ctl_socket(slirp, guest_addr, guest_port); + + if (!so) + return; + + ret = soreadbuf(so, (const char *)buf, size); + + if (ret > 0) + tcp_output(sototcpcb(so)); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h new file mode 100644 index 0000000..e2fc655 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp.h @@ -0,0 +1,313 @@ +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#include <stdlib.h> +#include "../cutils.h" +#include "slirp_config.h" + +#ifdef _WIN32 +# include <inttypes.h> + +typedef char *caddr_t; + +# include <windows.h> +# include <winsock2.h> +# include <ws2tcpip.h> +# include <sys/timeb.h> +# include <iphlpapi.h> + +# define EWOULDBLOCK WSAEWOULDBLOCK +# define EINPROGRESS WSAEINPROGRESS +# define ENOTCONN WSAENOTCONN +# define EHOSTUNREACH WSAEHOSTUNREACH +# define ENETUNREACH WSAENETUNREACH +# define ECONNREFUSED WSAECONNREFUSED +#else +# define ioctlsocket ioctl +# define closesocket(s) close(s) +# if !defined(__HAIKU__) +# define O_BINARY 0 +# endif +#endif + +#include <sys/types.h> +#ifdef HAVE_SYS_BITYPES_H +# include <sys/bitypes.h> +#endif + +#include <sys/time.h> + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#include <stdio.h> +#include <errno.h> + +#ifndef HAVE_MEMMOVE +#define memmove(x, y, z) bcopy(y, x, z) +#endif + +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + +#ifdef HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +#endif + +#ifndef _WIN32 +#include <sys/uio.h> +#endif + +#ifndef _WIN32 +#include <netinet/in.h> +#include <arpa/inet.h> +#endif + +/* Systems lacking strdup() definition in <string.h>. */ +#if defined(ultrix) +char *strdup(const char *); +#endif + +/* Systems lacking malloc() definition in <stdlib.h>. */ +#if defined(ultrix) || defined(hcx) +void *malloc(size_t arg); +void free(void *ptr); +#endif + +#ifndef HAVE_INET_ATON +int inet_aton(const char *cp, struct in_addr *ia); +#endif + +#include <fcntl.h> +#ifndef NO_UNIX_SOCKETS +#include <sys/un.h> +#endif +#include <signal.h> +#ifdef HAVE_SYS_SIGNAL_H +# include <sys/signal.h> +#endif +#ifndef _WIN32 +#include <sys/socket.h> +#endif + +#if defined(HAVE_SYS_IOCTL_H) +# include <sys/ioctl.h> +#endif + +#ifdef HAVE_SYS_SELECT_H +# include <sys/select.h> +#endif + +#ifdef HAVE_SYS_WAIT_H +# include <sys/wait.h> +#endif + +#ifdef HAVE_SYS_FILIO_H +# include <sys/filio.h> +#endif + +#ifdef USE_PPP +#include <ppp/slirppp.h> +#endif + +#ifdef __STDC__ +#include <stdarg.h> +#else +#include <varargs.h> +#endif + +#include <sys/stat.h> + +/* Avoid conflicting with the libc insque() and remque(), which + have different prototypes. */ +#define insque slirp_insque +#define remque slirp_remque + +#ifdef HAVE_SYS_STROPTS_H +#include <sys/stropts.h> +#endif + +#include "debug.h" + +#include "libslirp.h" +#include "ip.h" +#include "tcp.h" +#include "tcp_timer.h" +#include "tcp_var.h" +#include "tcpip.h" +#include "udp.h" +#include "mbuf.h" +#include "sbuf.h" +#include "socket.h" +#include "if.h" +#include "main.h" +#include "misc.h" +#ifdef USE_PPP +#include "ppp/pppd.h" +#include "ppp/ppp.h" +#endif + +#include "bootp.h" +#include "tftp.h" + +struct Slirp { + /* virtual network configuration */ + struct in_addr vnetwork_addr; + struct in_addr vnetwork_mask; + struct in_addr vhost_addr; + struct in_addr vdhcp_startaddr; + struct in_addr vnameserver_addr; + + /* ARP cache for the guest IP addresses (XXX: allow many entries) */ + uint8_t client_ethaddr[6]; + + struct in_addr client_ipaddr; + char client_hostname[33]; + + int restricted; + struct timeval tt; + struct ex_list *exec_list; + + /* mbuf states */ + struct mbuf m_freelist, m_usedlist; + int mbuf_alloced; + + /* if states */ + int if_queued; /* number of packets queued so far */ + struct mbuf if_fastq; /* fast queue (for interactive data) */ + struct mbuf if_batchq; /* queue for non-interactive data */ + struct mbuf *next_m; /* pointer to next mbuf to output */ + + /* ip states */ + struct ipq ipq; /* ip reass. queue */ + uint16_t ip_id; /* ip packet ctr, for ids */ + + /* bootp/dhcp states */ + BOOTPClient bootp_clients[NB_BOOTP_CLIENTS]; + char *bootp_filename; + + /* tcp states */ + struct socket tcb; + struct socket *tcp_last_so; + tcp_seq tcp_iss; /* tcp initial send seq # */ + uint32_t tcp_now; /* for RFC 1323 timestamps */ + + /* udp states */ + struct socket udb; + struct socket *udp_last_so; + + /* tftp states */ + char *tftp_prefix; + struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX]; + + void *opaque; +}; + +extern Slirp *slirp_instance; + +#ifndef NULL +#define NULL (void *)0 +#endif + +#ifndef FULL_BOLT +void if_start(Slirp *); +#else +void if_start(struct ttys *); +#endif + +#ifndef HAVE_STRERROR + char *strerror(int error); +#endif + +#ifndef HAVE_INDEX + char *index(const char *, int); +#endif + +#ifndef HAVE_GETHOSTID + long gethostid(void); +#endif + +void lprint(const char *, ...) __attribute__((format(printf, 1, 2))); + +#ifndef _WIN32 +#include <netdb.h> +#endif + +#define DEFAULT_BAUD 115200 + +#define SO_OPTIONS DO_KEEPALIVE +#define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL) + +/* cksum.c */ +int cksum(struct mbuf *m, int len); + +/* if.c */ +void if_init(Slirp *); +void if_output(struct socket *, struct mbuf *); + +/* ip_input.c */ +void ip_init(Slirp *); +void ip_input(struct mbuf *); +void ip_slowtimo(Slirp *); +void ip_stripoptions(register struct mbuf *, struct mbuf *); + +/* ip_output.c */ +int ip_output(struct socket *, struct mbuf *); + +/* tcp_input.c */ +void tcp_input(register struct mbuf *, int, struct socket *); +int tcp_mss(register struct tcpcb *, u_int); + +/* tcp_output.c */ +int tcp_output(register struct tcpcb *); +void tcp_setpersist(register struct tcpcb *); + +/* tcp_subr.c */ +void tcp_init(Slirp *); +void tcp_template(struct tcpcb *); +void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int); +struct tcpcb * tcp_newtcpcb(struct socket *); +struct tcpcb * tcp_close(register struct tcpcb *); +void tcp_sockclosed(struct tcpcb *); +int tcp_fconnect(struct socket *); +void tcp_connect(struct socket *); +int tcp_attach(struct socket *); +uint8_t tcp_tos(struct socket *); +int tcp_emu(struct socket *, struct mbuf *); +int tcp_ctl(struct socket *); +struct tcpcb *tcp_drop(struct tcpcb *tp, int err); + +#ifdef USE_PPP +#define MIN_MRU MINMRU +#define MAX_MRU MAXMRU +#else +#define MIN_MRU 128 +#define MAX_MRU 16384 +#endif + +#ifndef _WIN32 +#define min(x,y) ((x) < (y) ? (x) : (y)) +#define max(x,y) ((x) > (y) ? (x) : (y)) +#endif + +#ifdef _WIN32 +#undef errno +#define errno (WSAGetLastError()) +#endif + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h new file mode 100644 index 0000000..18db45c --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/slirp_config.h @@ -0,0 +1,188 @@ +/* + * User definable configuration options + */ + +/* Define if you want the connection to be probed */ +/* XXX Not working yet, so ignore this for now */ +#undef PROBE_CONN + +/* Define to 1 if you want KEEPALIVE timers */ +#define DO_KEEPALIVE 0 + +/* Define to MAX interfaces you expect to use at once */ +/* MAX_INTERFACES determines the max. TOTAL number of interfaces (SLIP and PPP) */ +/* MAX_PPP_INTERFACES determines max. number of PPP interfaces */ +#define MAX_INTERFACES 1 +#define MAX_PPP_INTERFACES 1 + +/* Define if you want slirp's socket in /tmp */ +/* XXXXXX Do this in ./configure */ +#undef USE_TMPSOCKET + +/* Define if you want slirp to use cfsetXspeed() on the terminal */ +#undef DO_CFSETSPEED + +/* Define this if you want slirp to write to the tty as fast as it can */ +/* This should only be set if you are using load-balancing, slirp does a */ +/* pretty good job on single modems already, and seting this will make */ +/* interactive sessions less responsive */ +/* XXXXX Talk about having fast modem as unit 0 */ +#undef FULL_BOLT + +/* + * Define if you want slirp to use less CPU + * You will notice a small lag in interactive sessions, but it's not that bad + * Things like Netscape/ftp/etc. are completely unaffected + * This is mainly for sysadmins who have many slirp users + */ +#undef USE_LOWCPU + +/* Define this if your compiler doesn't like prototypes */ +#ifndef __STDC__ +#define NO_PROTOTYPES +#endif + +/*********************************************************/ +/* + * Autoconf defined configuration options + * You shouldn't need to touch any of these + */ + +/* Ignore this */ +#undef DUMMY_PPP + +/* Define if you have unistd.h */ +#define HAVE_UNISTD_H + +/* Define if you have stdlib.h */ +#define HAVE_STDLIB_H + +/* Define if you have sys/ioctl.h */ +#undef HAVE_SYS_IOCTL_H +#ifndef _WIN32 +#define HAVE_SYS_IOCTL_H +#endif + +/* Define if you have sys/filio.h */ +#undef HAVE_SYS_FILIO_H +#ifdef __APPLE__ +#define HAVE_SYS_FILIO_H +#endif + +/* Define if you have strerror */ +#define HAVE_STRERROR + +/* Define if you have strdup() */ +#define HAVE_STRDUP + +/* Define according to how time.h should be included */ +#define TIME_WITH_SYS_TIME 0 +#undef HAVE_SYS_TIME_H + +/* Define if you have sys/bitypes.h */ +#undef HAVE_SYS_BITYPES_H + +/* Define if the machine is big endian */ +//#undef HOST_WORDS_BIGENDIAN + +/* Define if you have readv */ +#undef HAVE_READV + +/* Define if iovec needs to be declared */ +#undef DECLARE_IOVEC +#ifdef _WIN32 +#define DECLARE_IOVEC +#endif + +/* Define if you have a POSIX.1 sys/wait.h */ +#undef HAVE_SYS_WAIT_H + +/* Define if you have sys/select.h */ +#undef HAVE_SYS_SELECT_H +#ifndef _WIN32 +#define HAVE_SYS_SELECT_H +#endif + +/* Define if you have strings.h */ +#define HAVE_STRING_H + +/* Define if you have arpa/inet.h */ +#undef HAVE_ARPA_INET_H +#ifndef _WIN32 +#define HAVE_ARPA_INET_H +#endif + +/* Define if you have sys/signal.h */ +#undef HAVE_SYS_SIGNAL_H + +/* Define if you have sys/stropts.h */ +#undef HAVE_SYS_STROPTS_H + +/* Define to whatever your compiler thinks inline should be */ +//#define inline inline + +/* Define to whatever your compiler thinks const should be */ +//#define const const + +/* Define if your compiler doesn't like prototypes */ +#undef NO_PROTOTYPES + +/* Define to sizeof(char) */ +#define SIZEOF_CHAR 1 + +/* Define to sizeof(short) */ +#define SIZEOF_SHORT 2 + +/* Define to sizeof(int) */ +#define SIZEOF_INT 4 + +/* Define to sizeof(char *) */ +#define SIZEOF_CHAR_P (HOST_LONG_BITS / 8) + +/* Define if you have random() */ +#undef HAVE_RANDOM + +/* Define if you have srandom() */ +#undef HAVE_SRANDOM + +/* Define if you have inet_aton */ +#undef HAVE_INET_ATON +#ifndef _WIN32 +#define HAVE_INET_ATON +#endif + +/* Define if you have setenv */ +#undef HAVE_SETENV + +/* Define if you have index() */ +#define HAVE_INDEX + +/* Define if you have bcmp() */ +#undef HAVE_BCMP + +/* Define if you have drand48 */ +#undef HAVE_DRAND48 + +/* Define if you have memmove */ +#define HAVE_MEMMOVE + +/* Define if you have gethostid */ +#define HAVE_GETHOSTID + +/* Define if you DON'T have unix-domain sockets */ +#undef NO_UNIX_SOCKETS +#ifdef _WIN32 +#define NO_UNIX_SOCKETS +#endif + +/* Define if you have revoke() */ +#undef HAVE_REVOKE + +/* Define if you have the sysv method of opening pty's (/dev/ptmx, etc.) */ +#undef HAVE_GRANTPT + +/* Define if you have fchmod */ +#undef HAVE_FCHMOD + +/* Define if you have <sys/type32.h> */ +#undef HAVE_SYS_TYPES32_H diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c new file mode 100644 index 0000000..1ba8ae1 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.c @@ -0,0 +1,722 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" +#include "ip_icmp.h" + +static void sofcantrcvmore(struct socket *so); +static void sofcantsendmore(struct socket *so); + +struct socket * +solookup(struct socket *head, struct in_addr laddr, u_int lport, + struct in_addr faddr, u_int fport) +{ + struct socket *so; + + for (so = head->so_next; so != head; so = so->so_next) { + if (so->so_lport == lport && + so->so_laddr.s_addr == laddr.s_addr && + so->so_faddr.s_addr == faddr.s_addr && + so->so_fport == fport) + break; + } + + if (so == head) + return (struct socket *)NULL; + return so; + +} + +/* + * Create a new socket, initialise the fields + * It is the responsibility of the caller to + * insque() it into the correct linked-list + */ +struct socket * +socreate(Slirp *slirp) +{ + struct socket *so; + + so = (struct socket *)malloc(sizeof(struct socket)); + if(so) { + memset(so, 0, sizeof(struct socket)); + so->so_state = SS_NOFDREF; + so->s = -1; + so->slirp = slirp; + } + return(so); +} + +/* + * remque and free a socket, clobber cache + */ +void +sofree(struct socket *so) +{ + Slirp *slirp = so->slirp; + + if (so->so_emu==EMU_RSH && so->extra) { + sofree(so->extra); + so->extra=NULL; + } + if (so == slirp->tcp_last_so) { + slirp->tcp_last_so = &slirp->tcb; + } else if (so == slirp->udp_last_so) { + slirp->udp_last_so = &slirp->udb; + } + m_free(so->so_m); + + if(so->so_next && so->so_prev) + remque(so); /* crashes if so is not in a queue */ + + free(so); +} + +size_t sopreprbuf(struct socket *so, struct iovec *iov, int *np) +{ + int n, lss, total; + struct sbuf *sb = &so->so_snd; + int len = sb->sb_datalen - sb->sb_cc; + int mss = so->so_tcpcb->t_maxseg; + + DEBUG_CALL("sopreprbuf"); + DEBUG_ARG("so = %lx", (long )so); + + if (len <= 0) + return 0; + + iov[0].iov_base = sb->sb_wptr; + iov[1].iov_base = NULL; + iov[1].iov_len = 0; + if (sb->sb_wptr < sb->sb_rptr) { + iov[0].iov_len = sb->sb_rptr - sb->sb_wptr; + /* Should never succeed, but... */ + if (iov[0].iov_len > len) + iov[0].iov_len = len; + if (iov[0].iov_len > mss) + iov[0].iov_len -= iov[0].iov_len%mss; + n = 1; + } else { + iov[0].iov_len = (sb->sb_data + sb->sb_datalen) - sb->sb_wptr; + /* Should never succeed, but... */ + if (iov[0].iov_len > len) iov[0].iov_len = len; + len -= iov[0].iov_len; + if (len) { + iov[1].iov_base = sb->sb_data; + iov[1].iov_len = sb->sb_rptr - sb->sb_data; + if(iov[1].iov_len > len) + iov[1].iov_len = len; + total = iov[0].iov_len + iov[1].iov_len; + if (total > mss) { + lss = total%mss; + if (iov[1].iov_len > lss) { + iov[1].iov_len -= lss; + n = 2; + } else { + lss -= iov[1].iov_len; + iov[0].iov_len -= lss; + n = 1; + } + } else + n = 2; + } else { + if (iov[0].iov_len > mss) + iov[0].iov_len -= iov[0].iov_len%mss; + n = 1; + } + } + if (np) + *np = n; + + return iov[0].iov_len + (n - 1) * iov[1].iov_len; +} + +/* + * Read from so's socket into sb_snd, updating all relevant sbuf fields + * NOTE: This will only be called if it is select()ed for reading, so + * a read() of 0 (or less) means it's disconnected + */ +int +soread(struct socket *so) +{ + int n, nn; + struct sbuf *sb = &so->so_snd; + struct iovec iov[2]; + + DEBUG_CALL("soread"); + DEBUG_ARG("so = %lx", (long )so); + + /* + * No need to check if there's enough room to read. + * soread wouldn't have been called if there weren't + */ + sopreprbuf(so, iov, &n); + +#ifdef HAVE_READV + nn = readv(so->s, (struct iovec *)iov, n); + DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn)); +#else + nn = recv(so->s, iov[0].iov_base, iov[0].iov_len,0); +#endif + if (nn <= 0) { + if (nn < 0 && (errno == EINTR || errno == EAGAIN)) + return 0; + else { + DEBUG_MISC((dfd, " --- soread() disconnected, nn = %d, errno = %d-%s\n", nn, errno,strerror(errno))); + sofcantrcvmore(so); + tcp_sockclosed(sototcpcb(so)); + return -1; + } + } + +#ifndef HAVE_READV + /* + * If there was no error, try and read the second time round + * We read again if n = 2 (ie, there's another part of the buffer) + * and we read as much as we could in the first read + * We don't test for <= 0 this time, because there legitimately + * might not be any more data (since the socket is non-blocking), + * a close will be detected on next iteration. + * A return of -1 wont (shouldn't) happen, since it didn't happen above + */ + if (n == 2 && nn == iov[0].iov_len) { + int ret; + ret = recv(so->s, iov[1].iov_base, iov[1].iov_len,0); + if (ret > 0) + nn += ret; + } + + DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn)); +#endif + + /* Update fields */ + sb->sb_cc += nn; + sb->sb_wptr += nn; + if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen)) + sb->sb_wptr -= sb->sb_datalen; + return nn; +} + +int soreadbuf(struct socket *so, const char *buf, int size) +{ + int n, nn, copy = size; + struct sbuf *sb = &so->so_snd; + struct iovec iov[2]; + + DEBUG_CALL("soreadbuf"); + DEBUG_ARG("so = %lx", (long )so); + + /* + * No need to check if there's enough room to read. + * soread wouldn't have been called if there weren't + */ + if (sopreprbuf(so, iov, &n) < size) + goto err; + + nn = min(iov[0].iov_len, copy); + memcpy(iov[0].iov_base, buf, nn); + + copy -= nn; + buf += nn; + + if (copy == 0) + goto done; + + memcpy(iov[1].iov_base, buf, copy); + +done: + /* Update fields */ + sb->sb_cc += size; + sb->sb_wptr += size; + if (sb->sb_wptr >= (sb->sb_data + sb->sb_datalen)) + sb->sb_wptr -= sb->sb_datalen; + return size; +err: + + sofcantrcvmore(so); + tcp_sockclosed(sototcpcb(so)); + fprintf(stderr, "soreadbuf buffer to small"); + return -1; +} + +/* + * Get urgent data + * + * When the socket is created, we set it SO_OOBINLINE, + * so when OOB data arrives, we soread() it and everything + * in the send buffer is sent as urgent data + */ +void +sorecvoob(struct socket *so) +{ + struct tcpcb *tp = sototcpcb(so); + + DEBUG_CALL("sorecvoob"); + DEBUG_ARG("so = %lx", (long)so); + + /* + * We take a guess at how much urgent data has arrived. + * In most situations, when urgent data arrives, the next + * read() should get all the urgent data. This guess will + * be wrong however if more data arrives just after the + * urgent data, or the read() doesn't return all the + * urgent data. + */ + soread(so); + tp->snd_up = tp->snd_una + so->so_snd.sb_cc; + tp->t_force = 1; + tcp_output(tp); + tp->t_force = 0; +} + +/* + * Send urgent data + * There's a lot duplicated code here, but... + */ +int +sosendoob(struct socket *so) +{ + struct sbuf *sb = &so->so_rcv; + char buff[2048]; /* XXX Shouldn't be sending more oob data than this */ + + int n, len; + + DEBUG_CALL("sosendoob"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("sb->sb_cc = %d", sb->sb_cc); + + if (so->so_urgc > 2048) + so->so_urgc = 2048; /* XXXX */ + + if (sb->sb_rptr < sb->sb_wptr) { + /* We can send it directly */ + n = slirp_send(so, sb->sb_rptr, so->so_urgc, (MSG_OOB)); /* |MSG_DONTWAIT)); */ + so->so_urgc -= n; + + DEBUG_MISC((dfd, " --- sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc)); + } else { + /* + * Since there's no sendv or sendtov like writev, + * we must copy all data to a linear buffer then + * send it all + */ + len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr; + if (len > so->so_urgc) len = so->so_urgc; + memcpy(buff, sb->sb_rptr, len); + so->so_urgc -= len; + if (so->so_urgc) { + n = sb->sb_wptr - sb->sb_data; + if (n > so->so_urgc) n = so->so_urgc; + memcpy((buff + len), sb->sb_data, n); + so->so_urgc -= n; + len += n; + } + n = slirp_send(so, buff, len, (MSG_OOB)); /* |MSG_DONTWAIT)); */ +#ifdef DEBUG + if (n != len) + DEBUG_ERROR((dfd, "Didn't send all data urgently XXXXX\n")); +#endif + DEBUG_MISC((dfd, " ---2 sent %d bytes urgent data, %d urgent bytes left\n", n, so->so_urgc)); + } + + sb->sb_cc -= n; + sb->sb_rptr += n; + if (sb->sb_rptr >= (sb->sb_data + sb->sb_datalen)) + sb->sb_rptr -= sb->sb_datalen; + + return n; +} + +/* + * Write data from so_rcv to so's socket, + * updating all sbuf field as necessary + */ +int +sowrite(struct socket *so) +{ + int n,nn; + struct sbuf *sb = &so->so_rcv; + int len = sb->sb_cc; + struct iovec iov[2]; + + DEBUG_CALL("sowrite"); + DEBUG_ARG("so = %lx", (long)so); + + if (so->so_urgc) { + sosendoob(so); + if (sb->sb_cc == 0) + return 0; + } + + /* + * No need to check if there's something to write, + * sowrite wouldn't have been called otherwise + */ + + iov[0].iov_base = sb->sb_rptr; + iov[1].iov_base = NULL; + iov[1].iov_len = 0; + if (sb->sb_rptr < sb->sb_wptr) { + iov[0].iov_len = sb->sb_wptr - sb->sb_rptr; + /* Should never succeed, but... */ + if (iov[0].iov_len > len) iov[0].iov_len = len; + n = 1; + } else { + iov[0].iov_len = (sb->sb_data + sb->sb_datalen) - sb->sb_rptr; + if (iov[0].iov_len > len) iov[0].iov_len = len; + len -= iov[0].iov_len; + if (len) { + iov[1].iov_base = sb->sb_data; + iov[1].iov_len = sb->sb_wptr - sb->sb_data; + if (iov[1].iov_len > len) iov[1].iov_len = len; + n = 2; + } else + n = 1; + } + /* Check if there's urgent data to send, and if so, send it */ + +#ifdef HAVE_READV + nn = writev(so->s, (const struct iovec *)iov, n); + + DEBUG_MISC((dfd, " ... wrote nn = %d bytes\n", nn)); +#else + nn = slirp_send(so, iov[0].iov_base, iov[0].iov_len,0); +#endif + /* This should never happen, but people tell me it does *shrug* */ + if (nn < 0 && (errno == EAGAIN || errno == EINTR)) + return 0; + + if (nn <= 0) { + DEBUG_MISC((dfd, " --- sowrite disconnected, so->so_state = %x, errno = %d\n", + so->so_state, errno)); + sofcantsendmore(so); + tcp_sockclosed(sototcpcb(so)); + return -1; + } + +#ifndef HAVE_READV + if (n == 2 && nn == iov[0].iov_len) { + int ret; + ret = slirp_send(so, iov[1].iov_base, iov[1].iov_len,0); + if (ret > 0) + nn += ret; + } + DEBUG_MISC((dfd, " ... wrote nn = %d bytes\n", nn)); +#endif + + /* Update sbuf */ + sb->sb_cc -= nn; + sb->sb_rptr += nn; + if (sb->sb_rptr >= (sb->sb_data + sb->sb_datalen)) + sb->sb_rptr -= sb->sb_datalen; + + /* + * If in DRAIN mode, and there's no more data, set + * it CANTSENDMORE + */ + if ((so->so_state & SS_FWDRAIN) && sb->sb_cc == 0) + sofcantsendmore(so); + + return nn; +} + +/* + * recvfrom() a UDP socket + */ +void +sorecvfrom(struct socket *so) +{ + struct sockaddr_in addr; + socklen_t addrlen = sizeof(struct sockaddr_in); + + DEBUG_CALL("sorecvfrom"); + DEBUG_ARG("so = %lx", (long)so); + + if (so->so_type == IPPROTO_ICMP) { /* This is a "ping" reply */ + char buff[256]; + int len; + + len = recvfrom(so->s, buff, 256, 0, + (struct sockaddr *)&addr, &addrlen); + /* XXX Check if reply is "correct"? */ + + if(len == -1 || len == 0) { + u_char code=ICMP_UNREACH_PORT; + + if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST; + else if(errno == ENETUNREACH) code=ICMP_UNREACH_NET; + + DEBUG_MISC((dfd," udp icmp rx errno = %d-%s\n", + errno,strerror(errno))); + icmp_error(so->so_m, ICMP_UNREACH,code, 0,strerror(errno)); + } else { + icmp_reflect(so->so_m); + so->so_m = NULL; /* Don't m_free() it again! */ + } + /* No need for this socket anymore, udp_detach it */ + udp_detach(so); + } else { /* A "normal" UDP packet */ + struct mbuf *m; + int len; +#ifdef _WIN32 + unsigned long n; +#else + int n; +#endif + + m = m_get(so->slirp); + if (!m) { + return; + } + m->m_data += IF_MAXLINKHDR; + + /* + * XXX Shouldn't FIONREAD packets destined for port 53, + * but I don't know the max packet size for DNS lookups + */ + len = M_FREEROOM(m); + /* if (so->so_fport != htons(53)) { */ + ioctlsocket(so->s, FIONREAD, &n); + + if (n > len) { + n = (m->m_data - m->m_dat) + m->m_len + n + 1; + m_inc(m, n); + len = M_FREEROOM(m); + } + /* } */ + + m->m_len = recvfrom(so->s, m->m_data, len, 0, + (struct sockaddr *)&addr, &addrlen); + DEBUG_MISC((dfd, " did recvfrom %d, errno = %d-%s\n", + m->m_len, errno,strerror(errno))); + if(m->m_len<0) { + u_char code=ICMP_UNREACH_PORT; + + if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST; + else if(errno == ENETUNREACH) code=ICMP_UNREACH_NET; + + DEBUG_MISC((dfd," rx error, tx icmp ICMP_UNREACH:%i\n", code)); + icmp_error(so->so_m, ICMP_UNREACH,code, 0,strerror(errno)); + m_free(m); + } else { + /* + * Hack: domain name lookup will be used the most for UDP, + * and since they'll only be used once there's no need + * for the 4 minute (or whatever) timeout... So we time them + * out much quicker (10 seconds for now...) + */ + if (so->so_expire) { + if (so->so_fport == htons(53)) + so->so_expire = curtime + SO_EXPIREFAST; + else + so->so_expire = curtime + SO_EXPIRE; + } + + /* + * If this packet was destined for CTL_ADDR, + * make it look like that's where it came from, done by udp_output + */ + udp_output(so, m, &addr); + } /* rx error */ + } /* if ping packet */ +} + +/* + * sendto() a socket + */ +int +sosendto(struct socket *so, struct mbuf *m) +{ + Slirp *slirp = so->slirp; + int ret; + struct sockaddr_in addr; + + DEBUG_CALL("sosendto"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("m = %lx", (long)m); + + addr.sin_family = AF_INET; + if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + /* It's an alias */ + if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) { + if (get_dns_addr(&addr.sin_addr) < 0) + addr.sin_addr = loopback_addr; + } else { + addr.sin_addr = loopback_addr; + } + } else + addr.sin_addr = so->so_faddr; + addr.sin_port = so->so_fport; + + DEBUG_MISC((dfd, " sendto()ing, addr.sin_port=%d, addr.sin_addr.s_addr=%.16s\n", ntohs(addr.sin_port), inet_ntoa(addr.sin_addr))); + + /* Don't care what port we get */ + ret = sendto(so->s, m->m_data, m->m_len, 0, + (struct sockaddr *)&addr, sizeof (struct sockaddr)); + if (ret < 0) + return -1; + + /* + * Kill the socket if there's no reply in 4 minutes, + * but only if it's an expirable socket + */ + if (so->so_expire) + so->so_expire = curtime + SO_EXPIRE; + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_ISFCONNECTED; /* So that it gets select()ed */ + return 0; +} + +/* + * Listen for incoming TCP connections + */ +struct socket * +tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr, + u_int lport, int flags) +{ + struct sockaddr_in addr; + struct socket *so; + int s, opt = 1; + socklen_t addrlen = sizeof(addr); + memset(&addr, 0, addrlen); + + DEBUG_CALL("tcp_listen"); + DEBUG_ARG("haddr = %x", haddr); + DEBUG_ARG("hport = %d", hport); + DEBUG_ARG("laddr = %x", laddr); + DEBUG_ARG("lport = %d", lport); + DEBUG_ARG("flags = %x", flags); + + so = socreate(slirp); + if (!so) { + return NULL; + } + + /* Don't tcp_attach... we don't need so_snd nor so_rcv */ + if ((so->so_tcpcb = tcp_newtcpcb(so)) == NULL) { + free(so); + return NULL; + } + insque(so, &slirp->tcb); + + /* + * SS_FACCEPTONCE sockets must time out. + */ + if (flags & SS_FACCEPTONCE) + so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2; + + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= (SS_FACCEPTCONN | flags); + so->so_lport = lport; /* Kept in network format */ + so->so_laddr.s_addr = laddr; /* Ditto */ + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = haddr; + addr.sin_port = hport; + + if (((s = os_socket(AF_INET,SOCK_STREAM,0)) < 0) || + (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)) < 0) || + (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) || + (listen(s,1) < 0)) { + int tmperrno = errno; /* Don't clobber the real reason we failed */ + + close(s); + sofree(so); + /* Restore the real errno */ +#ifdef _WIN32 + WSASetLastError(tmperrno); +#else + errno = tmperrno; +#endif + return NULL; + } + setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int)); + + getsockname(s,(struct sockaddr *)&addr,&addrlen); + so->so_fport = addr.sin_port; + if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr) + so->so_faddr = slirp->vhost_addr; + else + so->so_faddr = addr.sin_addr; + + so->s = s; + return so; +} + +/* + * Various session state calls + * XXX Should be #define's + * The socket state stuff needs work, these often get call 2 or 3 + * times each when only 1 was needed + */ +void +soisfconnecting(struct socket *so) +{ + so->so_state &= ~(SS_NOFDREF|SS_ISFCONNECTED|SS_FCANTRCVMORE| + SS_FCANTSENDMORE|SS_FWDRAIN); + so->so_state |= SS_ISFCONNECTING; /* Clobber other states */ +} + +void +soisfconnected(struct socket *so) +{ + so->so_state &= ~(SS_ISFCONNECTING|SS_FWDRAIN|SS_NOFDREF); + so->so_state |= SS_ISFCONNECTED; /* Clobber other states */ +} + +static void +sofcantrcvmore(struct socket *so) +{ + if ((so->so_state & SS_NOFDREF) == 0) { + shutdown(so->s,0); + if(global_writefds) { + FD_CLR(so->s,global_writefds); + } + } + so->so_state &= ~(SS_ISFCONNECTING); + if (so->so_state & SS_FCANTSENDMORE) { + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_NOFDREF; /* Don't select it */ + } else { + so->so_state |= SS_FCANTRCVMORE; + } +} + +static void +sofcantsendmore(struct socket *so) +{ + if ((so->so_state & SS_NOFDREF) == 0) { + shutdown(so->s,1); /* send FIN to fhost */ + if (global_readfds) { + FD_CLR(so->s,global_readfds); + } + if (global_xfds) { + FD_CLR(so->s,global_xfds); + } + } + so->so_state &= ~(SS_ISFCONNECTING); + if (so->so_state & SS_FCANTRCVMORE) { + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_NOFDREF; /* as above */ + } else { + so->so_state |= SS_FCANTSENDMORE; + } +} + +/* + * Set write drain mode + * Set CANTSENDMORE once all data has been write()n + */ +void +sofwdrain(struct socket *so) +{ + if (so->so_rcv.sb_cc) + so->so_state |= SS_FWDRAIN; + else + sofcantsendmore(so); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h new file mode 100644 index 0000000..857b0da --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/socket.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#ifndef _SLIRP_SOCKET_H_ +#define _SLIRP_SOCKET_H_ + +#define SO_EXPIRE 240000 +#define SO_EXPIREFAST 10000 + +/* + * Our socket structure + */ + +struct socket { + struct socket *so_next,*so_prev; /* For a linked list of sockets */ + + int s; /* The actual socket */ + + Slirp *slirp; /* managing slirp instance */ + + /* XXX union these with not-yet-used sbuf params */ + struct mbuf *so_m; /* Pointer to the original SYN packet, + * for non-blocking connect()'s, and + * PING reply's */ + struct tcpiphdr *so_ti; /* Pointer to the original ti within + * so_mconn, for non-blocking connections */ + int so_urgc; + struct in_addr so_faddr; /* foreign host table entry */ + struct in_addr so_laddr; /* local host table entry */ + uint16_t so_fport; /* foreign port */ + uint16_t so_lport; /* local port */ + + uint8_t so_iptos; /* Type of service */ + uint8_t so_emu; /* Is the socket emulated? */ + + u_char so_type; /* Type of socket, UDP or TCP */ + int so_state; /* internal state flags SS_*, below */ + + struct tcpcb *so_tcpcb; /* pointer to TCP protocol control block */ + u_int so_expire; /* When the socket will expire */ + + int so_queued; /* Number of packets queued from this socket */ + int so_nqueued; /* Number of packets queued in a row + * Used to determine when to "downgrade" a session + * from fastq to batchq */ + + struct sbuf so_rcv; /* Receive buffer */ + struct sbuf so_snd; /* Send buffer */ + void * extra; /* Extra pointer */ +}; + + +/* + * Socket state bits. (peer means the host on the Internet, + * local host means the host on the other end of the modem) + */ +#define SS_NOFDREF 0x001 /* No fd reference */ + +#define SS_ISFCONNECTING 0x002 /* Socket is connecting to peer (non-blocking connect()'s) */ +#define SS_ISFCONNECTED 0x004 /* Socket is connected to peer */ +#define SS_FCANTRCVMORE 0x008 /* Socket can't receive more from peer (for half-closes) */ +#define SS_FCANTSENDMORE 0x010 /* Socket can't send more to peer (for half-closes) */ +#define SS_FWDRAIN 0x040 /* We received a FIN, drain data and set SS_FCANTSENDMORE */ + +#define SS_CTL 0x080 +#define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from a host on the internet */ +#define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket will die after one accept */ + +#define SS_PERSISTENT_MASK 0xf000 /* Unremovable state bits */ +#define SS_HOSTFWD 0x1000 /* Socket describes host->guest forwarding */ +#define SS_INCOMING 0x2000 /* Connection was initiated by a host on the internet */ + +struct socket * solookup(struct socket *, struct in_addr, u_int, struct in_addr, u_int); +struct socket * socreate(Slirp *); +void sofree(struct socket *); +int soread(struct socket *); +void sorecvoob(struct socket *); +int sosendoob(struct socket *); +int sowrite(struct socket *); +void sorecvfrom(struct socket *); +int sosendto(struct socket *, struct mbuf *); +struct socket * tcp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int, + int); +void soisfconnecting(register struct socket *); +void soisfconnected(register struct socket *); +void sofwdrain(struct socket *); +struct iovec; /* For win32 */ +size_t sopreprbuf(struct socket *so, struct iovec *iov, int *np); +int soreadbuf(struct socket *so, const char *buf, int size); + +#endif /* _SOCKET_H_ */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h new file mode 100644 index 0000000..9d06836 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp.h @@ -0,0 +1,164 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp.h 8.1 (Berkeley) 6/10/93 + * tcp.h,v 1.3 1994/08/21 05:27:34 paul Exp + */ + +#ifndef _TCP_H_ +#define _TCP_H_ + +typedef uint32_t tcp_seq; + +#define PR_SLOWHZ 2 /* 2 slow timeouts per second (approx) */ +#define PR_FASTHZ 5 /* 5 fast timeouts per second (not important) */ + +#define TCP_SNDSPACE 8192 +#define TCP_RCVSPACE 8192 + +/* + * TCP header. + * Per RFC 793, September, 1981. + */ +struct tcphdr { + uint16_t th_sport; /* source port */ + uint16_t th_dport; /* destination port */ + tcp_seq th_seq; /* sequence number */ + tcp_seq th_ack; /* acknowledgement number */ +#ifdef HOST_WORDS_BIGENDIAN + u_int th_off:4, /* data offset */ + th_x2:4; /* (unused) */ +#else + u_int th_x2:4, /* (unused) */ + th_off:4; /* data offset */ +#endif + uint8_t th_flags; +#define TH_FIN 0x01 +#define TH_SYN 0x02 +#define TH_RST 0x04 +#define TH_PUSH 0x08 +#define TH_ACK 0x10 +#define TH_URG 0x20 + uint16_t th_win; /* window */ + uint16_t th_sum; /* checksum */ + uint16_t th_urp; /* urgent pointer */ +}; + +#include "tcp_var.h" + +#define TCPOPT_EOL 0 +#define TCPOPT_NOP 1 +#define TCPOPT_MAXSEG 2 +#define TCPOLEN_MAXSEG 4 +#define TCPOPT_WINDOW 3 +#define TCPOLEN_WINDOW 3 +#define TCPOPT_SACK_PERMITTED 4 /* Experimental */ +#define TCPOLEN_SACK_PERMITTED 2 +#define TCPOPT_SACK 5 /* Experimental */ +#define TCPOPT_TIMESTAMP 8 +#define TCPOLEN_TIMESTAMP 10 +#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ + +#define TCPOPT_TSTAMP_HDR \ + (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) + +/* + * Default maximum segment size for TCP. + * With an IP MSS of 576, this is 536, + * but 512 is probably more convenient. + * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). + * + * We make this 1460 because we only care about Ethernet in the qemu context. + */ +#define TCP_MSS 1460 + +#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ + +#define TCP_MAX_WINSHIFT 14 /* maximum window shift */ + +/* + * User-settable options (used with setsockopt). + * + * We don't use the system headers on unix because we have conflicting + * local structures. We can't avoid the system definitions on Windows, + * so we undefine them. + */ +#undef TCP_NODELAY +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#undef TCP_MAXSEG + +/* + * TCP FSM state definitions. + * Per RFC793, September, 1981. + */ + +#define TCP_NSTATES 11 + +#define TCPS_CLOSED 0 /* closed */ +#define TCPS_LISTEN 1 /* listening for connection */ +#define TCPS_SYN_SENT 2 /* active, have sent syn */ +#define TCPS_SYN_RECEIVED 3 /* have send and received syn */ +/* states < TCPS_ESTABLISHED are those where connections not established */ +#define TCPS_ESTABLISHED 4 /* established */ +#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ +/* states > TCPS_CLOSE_WAIT are those where user has closed */ +#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ +#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ +#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ +/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */ +#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ +#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ + +#define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED) +#define TCPS_HAVEESTABLISHED(s) ((s) >= TCPS_ESTABLISHED) +#define TCPS_HAVERCVDFIN(s) ((s) >= TCPS_TIME_WAIT) + +/* + * TCP sequence numbers are 32 bit integers operated + * on with modular arithmetic. These macros can be + * used to compare such integers. + */ +#define SEQ_LT(a,b) ((int)((a)-(b)) < 0) +#define SEQ_LEQ(a,b) ((int)((a)-(b)) <= 0) +#define SEQ_GT(a,b) ((int)((a)-(b)) > 0) +#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* + * Macros to initialize tcp sequence numbers for + * send and receive from initial send and receive + * sequence numbers. + */ +#define tcp_rcvseqinit(tp) \ + (tp)->rcv_adv = (tp)->rcv_nxt = (tp)->irs + 1 + +#define tcp_sendseqinit(tp) \ + (tp)->snd_una = (tp)->snd_nxt = (tp)->snd_max = (tp)->snd_up = (tp)->iss + +#define TCP_ISSINCR (125*1024) /* increment for tcp_iss each second */ + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c new file mode 100644 index 0000000..53dbc87 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_input.c @@ -0,0 +1,1487 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_input.c 8.5 (Berkeley) 4/10/94 + * tcp_input.c,v 1.10 1994/10/13 18:36:32 wollman Exp + */ + +/* + * Changes and additions relating to SLiRP + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" +#include "ip_icmp.h" + +#define TCPREXMTTHRESH 3 + +#define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ) + +/* for modulo comparisons of timestamps */ +#define TSTMP_LT(a,b) ((int)((a)-(b)) < 0) +#define TSTMP_GEQ(a,b) ((int)((a)-(b)) >= 0) + +/* + * Insert segment ti into reassembly queue of tcp with + * control block tp. Return TH_FIN if reassembly now includes + * a segment with FIN. The macro form does the common case inline + * (segment is the next to be received on an established connection, + * and the queue is empty), avoiding linkage into and removal + * from the queue and repetition of various conversions. + * Set DELACK for segments received in order, but ack immediately + * when segments are out of order (so fast retransmit can work). + */ +#ifdef TCP_ACK_HACK +#define TCP_REASS(tp, ti, m, so, flags) {\ + if ((ti)->ti_seq == (tp)->rcv_nxt && \ + tcpfrag_list_empty(tp) && \ + (tp)->t_state == TCPS_ESTABLISHED) {\ + if (ti->ti_flags & TH_PUSH) \ + tp->t_flags |= TF_ACKNOW; \ + else \ + tp->t_flags |= TF_DELACK; \ + (tp)->rcv_nxt += (ti)->ti_len; \ + flags = (ti)->ti_flags & TH_FIN; \ + if (so->so_emu) { \ + if (tcp_emu((so),(m))) sbappend((so), (m)); \ + } else \ + sbappend((so), (m)); \ + } else {\ + (flags) = tcp_reass((tp), (ti), (m)); \ + tp->t_flags |= TF_ACKNOW; \ + } \ +} +#else +#define TCP_REASS(tp, ti, m, so, flags) { \ + if ((ti)->ti_seq == (tp)->rcv_nxt && \ + tcpfrag_list_empty(tp) && \ + (tp)->t_state == TCPS_ESTABLISHED) { \ + tp->t_flags |= TF_DELACK; \ + (tp)->rcv_nxt += (ti)->ti_len; \ + flags = (ti)->ti_flags & TH_FIN; \ + if (so->so_emu) { \ + if (tcp_emu((so),(m))) sbappend(so, (m)); \ + } else \ + sbappend((so), (m)); \ + } else { \ + (flags) = tcp_reass((tp), (ti), (m)); \ + tp->t_flags |= TF_ACKNOW; \ + } \ +} +#endif +static void tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, + struct tcpiphdr *ti); +static void tcp_xmit_timer(register struct tcpcb *tp, int rtt); + +static int +tcp_reass(register struct tcpcb *tp, register struct tcpiphdr *ti, + struct mbuf *m) +{ + register struct tcpiphdr *q; + struct socket *so = tp->t_socket; + int flags; + + /* + * Call with ti==NULL after become established to + * force pre-ESTABLISHED data up to user socket. + */ + if (ti == NULL) + goto present; + + /* + * Find a segment which begins after this one does. + */ + for (q = tcpfrag_list_first(tp); !tcpfrag_list_end(q, tp); + q = tcpiphdr_next(q)) + if (SEQ_GT(q->ti_seq, ti->ti_seq)) + break; + + /* + * If there is a preceding segment, it may provide some of + * our data already. If so, drop the data from the incoming + * segment. If it provides all of our data, drop us. + */ + if (!tcpfrag_list_end(tcpiphdr_prev(q), tp)) { + register int i; + q = tcpiphdr_prev(q); + /* conversion to int (in i) handles seq wraparound */ + i = q->ti_seq + q->ti_len - ti->ti_seq; + if (i > 0) { + if (i >= ti->ti_len) { + m_freem(m); + /* + * Try to present any queued data + * at the left window edge to the user. + * This is needed after the 3-WHS + * completes. + */ + goto present; /* ??? */ + } + m_adj(m, i); + ti->ti_len -= i; + ti->ti_seq += i; + } + q = tcpiphdr_next(q); + } + ti->ti_mbuf = m; + + /* + * While we overlap succeeding segments trim them or, + * if they are completely covered, dequeue them. + */ + while (!tcpfrag_list_end(q, tp)) { + register int i = (ti->ti_seq + ti->ti_len) - q->ti_seq; + if (i <= 0) + break; + if (i < q->ti_len) { + q->ti_seq += i; + q->ti_len -= i; + m_adj(q->ti_mbuf, i); + break; + } + q = tcpiphdr_next(q); + m = tcpiphdr_prev(q)->ti_mbuf; + remque(tcpiphdr2qlink(tcpiphdr_prev(q))); + m_freem(m); + } + + /* + * Stick new segment in its place. + */ + insque(tcpiphdr2qlink(ti), tcpiphdr2qlink(tcpiphdr_prev(q))); + +present: + /* + * Present data to user, advancing rcv_nxt through + * completed sequence space. + */ + if (!TCPS_HAVEESTABLISHED(tp->t_state)) + return (0); + ti = tcpfrag_list_first(tp); + if (tcpfrag_list_end(ti, tp) || ti->ti_seq != tp->rcv_nxt) + return (0); + if (tp->t_state == TCPS_SYN_RECEIVED && ti->ti_len) + return (0); + do { + tp->rcv_nxt += ti->ti_len; + flags = ti->ti_flags & TH_FIN; + remque(tcpiphdr2qlink(ti)); + m = ti->ti_mbuf; + ti = tcpiphdr_next(ti); + if (so->so_state & SS_FCANTSENDMORE) + m_freem(m); + else { + if (so->so_emu) { + if (tcp_emu(so,m)) sbappend(so, m); + } else + sbappend(so, m); + } + } while (ti != (struct tcpiphdr *)tp && ti->ti_seq == tp->rcv_nxt); + return (flags); +} + +/* + * TCP input routine, follows pages 65-76 of the + * protocol specification dated September, 1981 very closely. + */ +void +tcp_input(struct mbuf *m, int iphlen, struct socket *inso) +{ + struct ip save_ip, *ip; + register struct tcpiphdr *ti; + caddr_t optp = NULL; + int optlen = 0; + int len, tlen, off; + register struct tcpcb *tp = NULL; + register int tiflags; + struct socket *so = NULL; + int todrop, acked, ourfinisacked, needoutput = 0; + int iss = 0; + u_long tiwin; + int ret; + struct ex_list *ex_ptr; + Slirp *slirp; + + DEBUG_CALL("tcp_input"); + DEBUG_ARGS((dfd," m = %8lx iphlen = %2d inso = %lx\n", + (long )m, iphlen, (long )inso )); + + /* + * If called with m == 0, then we're continuing the connect + */ + if (m == NULL) { + so = inso; + slirp = so->slirp; + + /* Re-set a few variables */ + tp = sototcpcb(so); + m = so->so_m; + so->so_m = NULL; + ti = so->so_ti; + tiwin = ti->ti_win; + tiflags = ti->ti_flags; + + goto cont_conn; + } + slirp = m->slirp; + + /* + * Get IP and TCP header together in first mbuf. + * Note: IP leaves IP header in first mbuf. + */ + ti = mtod(m, struct tcpiphdr *); + if (iphlen > sizeof(struct ip )) { + ip_stripoptions(m, (struct mbuf *)0); + iphlen=sizeof(struct ip ); + } + /* XXX Check if too short */ + + + /* + * Save a copy of the IP header in case we want restore it + * for sending an ICMP error message in response. + */ + ip=mtod(m, struct ip *); + save_ip = *ip; + save_ip.ip_len+= iphlen; + + /* + * Checksum extended TCP header and data. + */ + tlen = ((struct ip *)ti)->ip_len; + tcpiphdr2qlink(ti)->next = tcpiphdr2qlink(ti)->prev = NULL; + memset(&ti->ti_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr)); + ti->ti_x1 = 0; + ti->ti_len = htons((uint16_t)tlen); + len = sizeof(struct ip ) + tlen; + if(cksum(m, len)) { + goto drop; + } + + /* + * Check that TCP offset makes sense, + * pull out TCP options and adjust length. XXX + */ + off = ti->ti_off << 2; + if (off < sizeof (struct tcphdr) || off > tlen) { + goto drop; + } + tlen -= off; + ti->ti_len = tlen; + if (off > sizeof (struct tcphdr)) { + optlen = off - sizeof (struct tcphdr); + optp = mtod(m, caddr_t) + sizeof (struct tcpiphdr); + } + tiflags = ti->ti_flags; + + /* + * Convert TCP protocol specific fields to host format. + */ + NTOHL(ti->ti_seq); + NTOHL(ti->ti_ack); + NTOHS(ti->ti_win); + NTOHS(ti->ti_urp); + + /* + * Drop TCP, IP headers and TCP options. + */ + m->m_data += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_len -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + + if (slirp->restricted) { + for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) { + if (ex_ptr->ex_fport == ti->ti_dport && + ti->ti_dst.s_addr == ex_ptr->ex_addr.s_addr) { + break; + } + } + if (!ex_ptr) + goto drop; + } + /* + * Locate pcb for segment. + */ +findso: + so = slirp->tcp_last_so; + if (so->so_fport != ti->ti_dport || + so->so_lport != ti->ti_sport || + so->so_laddr.s_addr != ti->ti_src.s_addr || + so->so_faddr.s_addr != ti->ti_dst.s_addr) { + so = solookup(&slirp->tcb, ti->ti_src, ti->ti_sport, + ti->ti_dst, ti->ti_dport); + if (so) + slirp->tcp_last_so = so; + } + + /* + * If the state is CLOSED (i.e., TCB does not exist) then + * all data in the incoming segment is discarded. + * If the TCB exists but is in CLOSED state, it is embryonic, + * but should either do a listen or a connect soon. + * + * state == CLOSED means we've done socreate() but haven't + * attached it to a protocol yet... + * + * XXX If a TCB does not exist, and the TH_SYN flag is + * the only flag set, then create a session, mark it + * as if it was LISTENING, and continue... + */ + if (so == NULL) { + if ((tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) != TH_SYN) + goto dropwithreset; + + if ((so = socreate(slirp)) == NULL) + goto dropwithreset; + if (tcp_attach(so) < 0) { + free(so); /* Not sofree (if it failed, it's not insqued) */ + goto dropwithreset; + } + + sbreserve(&so->so_snd, TCP_SNDSPACE); + sbreserve(&so->so_rcv, TCP_RCVSPACE); + + so->so_laddr = ti->ti_src; + so->so_lport = ti->ti_sport; + so->so_faddr = ti->ti_dst; + so->so_fport = ti->ti_dport; + + if ((so->so_iptos = tcp_tos(so)) == 0) + so->so_iptos = ((struct ip *)ti)->ip_tos; + + tp = sototcpcb(so); + tp->t_state = TCPS_LISTEN; + } + + /* + * If this is a still-connecting socket, this probably + * a retransmit of the SYN. Whether it's a retransmit SYN + * or something else, we nuke it. + */ + if (so->so_state & SS_ISFCONNECTING) + goto drop; + + tp = sototcpcb(so); + + /* XXX Should never fail */ + if (tp == NULL) + goto dropwithreset; + if (tp->t_state == TCPS_CLOSED) + goto drop; + + tiwin = ti->ti_win; + + /* + * Segment received on connection. + * Reset idle time and keep-alive timer. + */ + tp->t_idle = 0; + if (SO_OPTIONS) + tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL; + else + tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE; + + /* + * Process options if not in LISTEN state, + * else do it below (after getting remote address). + */ + if (optp && tp->t_state != TCPS_LISTEN) + tcp_dooptions(tp, (u_char *)optp, optlen, ti); + + /* + * Header prediction: check for the two common cases + * of a uni-directional data xfer. If the packet has + * no control flags, is in-sequence, the window didn't + * change and we're not retransmitting, it's a + * candidate. If the length is zero and the ack moved + * forward, we're the sender side of the xfer. Just + * free the data acked & wake any higher level process + * that was blocked waiting for space. If the length + * is non-zero and the ack didn't move, we're the + * receiver side. If we're getting packets in-order + * (the reassembly queue is empty), add the data to + * the socket buffer and note that we need a delayed ack. + * + * XXX Some of these tests are not needed + * eg: the tiwin == tp->snd_wnd prevents many more + * predictions.. with no *real* advantage.. + */ + if (tp->t_state == TCPS_ESTABLISHED && + (tiflags & (TH_SYN|TH_FIN|TH_RST|TH_URG|TH_ACK)) == TH_ACK && + ti->ti_seq == tp->rcv_nxt && + tiwin && tiwin == tp->snd_wnd && + tp->snd_nxt == tp->snd_max) { + if (ti->ti_len == 0) { + if (SEQ_GT(ti->ti_ack, tp->snd_una) && + SEQ_LEQ(ti->ti_ack, tp->snd_max) && + tp->snd_cwnd >= tp->snd_wnd) { + /* + * this is a pure ack for outstanding data. + */ + if (tp->t_rtt && + SEQ_GT(ti->ti_ack, tp->t_rtseq)) + tcp_xmit_timer(tp, tp->t_rtt); + acked = ti->ti_ack - tp->snd_una; + sbdrop(&so->so_snd, acked); + tp->snd_una = ti->ti_ack; + m_freem(m); + + /* + * If all outstanding data are acked, stop + * retransmit timer, otherwise restart timer + * using current (possibly backed-off) value. + * If process is waiting for space, + * wakeup/selwakeup/signal. If data + * are ready to send, let tcp_output + * decide between more output or persist. + */ + if (tp->snd_una == tp->snd_max) + tp->t_timer[TCPT_REXMT] = 0; + else if (tp->t_timer[TCPT_PERSIST] == 0) + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + + /* + * This is called because sowwakeup might have + * put data into so_snd. Since we don't so sowwakeup, + * we don't need this.. XXX??? + */ + if (so->so_snd.sb_cc) + (void) tcp_output(tp); + + return; + } + } else if (ti->ti_ack == tp->snd_una && + tcpfrag_list_empty(tp) && + ti->ti_len <= sbspace(&so->so_rcv)) { + /* + * this is a pure, in-sequence data packet + * with nothing on the reassembly queue and + * we have enough buffer space to take it. + */ + tp->rcv_nxt += ti->ti_len; + /* + * Add data to socket buffer. + */ + if (so->so_emu) { + if (tcp_emu(so,m)) sbappend(so, m); + } else + sbappend(so, m); + + /* + * If this is a short packet, then ACK now - with Nagel + * congestion avoidance sender won't send more until + * he gets an ACK. + * + * It is better to not delay acks at all to maximize + * TCP throughput. See RFC 2581. + */ + tp->t_flags |= TF_ACKNOW; + tcp_output(tp); + return; + } + } /* header prediction */ + /* + * Calculate amount of space in receive window, + * and then do TCP input processing. + * Receive window is amount of space in rcv queue, + * but not less than advertised window. + */ + { int win; + win = sbspace(&so->so_rcv); + if (win < 0) + win = 0; + tp->rcv_wnd = max(win, (int)(tp->rcv_adv - tp->rcv_nxt)); + } + + switch (tp->t_state) { + + /* + * If the state is LISTEN then ignore segment if it contains an RST. + * If the segment contains an ACK then it is bad and send a RST. + * If it does not contain a SYN then it is not interesting; drop it. + * Don't bother responding if the destination was a broadcast. + * Otherwise initialize tp->rcv_nxt, and tp->irs, select an initial + * tp->iss, and send a segment: + * <SEQ=ISS><ACK=RCV_NXT><CTL=SYN,ACK> + * Also initialize tp->snd_nxt to tp->iss+1 and tp->snd_una to tp->iss. + * Fill in remote peer address fields if not previously specified. + * Enter SYN_RECEIVED state, and process any other fields of this + * segment in this state. + */ + case TCPS_LISTEN: { + + if (tiflags & TH_RST) + goto drop; + if (tiflags & TH_ACK) + goto dropwithreset; + if ((tiflags & TH_SYN) == 0) + goto drop; + + /* + * This has way too many gotos... + * But a bit of spaghetti code never hurt anybody :) + */ + + /* + * If this is destined for the control address, then flag to + * tcp_ctl once connected, otherwise connect + */ + if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr && + so->so_faddr.s_addr != slirp->vnameserver_addr.s_addr) { + /* May be an add exec */ + for (ex_ptr = slirp->exec_list; ex_ptr; + ex_ptr = ex_ptr->ex_next) { + if(ex_ptr->ex_fport == so->so_fport && + so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) { + so->so_state |= SS_CTL; + break; + } + } + if (so->so_state & SS_CTL) { + goto cont_input; + } + } + /* CTL_ALIAS: Do nothing, tcp_fconnect will be called on it */ + } + + if (so->so_emu & EMU_NOCONNECT) { + so->so_emu &= ~EMU_NOCONNECT; + goto cont_input; + } + + if((tcp_fconnect(so) == -1) && (errno != EINPROGRESS) && (errno != EWOULDBLOCK)) { + u_char code=ICMP_UNREACH_NET; + DEBUG_MISC((dfd," tcp fconnect errno = %d-%s\n", + errno,strerror(errno))); + if(errno == ECONNREFUSED) { + /* ACK the SYN, send RST to refuse the connection */ + tcp_respond(tp, ti, m, ti->ti_seq+1, (tcp_seq)0, + TH_RST|TH_ACK); + } else { + if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST; + HTONL(ti->ti_seq); /* restore tcp header */ + HTONL(ti->ti_ack); + HTONS(ti->ti_win); + HTONS(ti->ti_urp); + m->m_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + m->m_len += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr); + *ip=save_ip; + icmp_error(m, ICMP_UNREACH,code, 0,strerror(errno)); + } + tcp_close(tp); + m_free(m); + } else { + /* + * Haven't connected yet, save the current mbuf + * and ti, and return + * XXX Some OS's don't tell us whether the connect() + * succeeded or not. So we must time it out. + */ + so->so_m = m; + so->so_ti = ti; + tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT; + tp->t_state = TCPS_SYN_RECEIVED; + } + return; + + cont_conn: + /* m==NULL + * Check if the connect succeeded + */ + if (so->so_state & SS_NOFDREF) { + tp = tcp_close(tp); + goto dropwithreset; + } + cont_input: + tcp_template(tp); + + if (optp) + tcp_dooptions(tp, (u_char *)optp, optlen, ti); + + if (iss) + tp->iss = iss; + else + tp->iss = slirp->tcp_iss; + slirp->tcp_iss += TCP_ISSINCR/2; + tp->irs = ti->ti_seq; + tcp_sendseqinit(tp); + tcp_rcvseqinit(tp); + tp->t_flags |= TF_ACKNOW; + tp->t_state = TCPS_SYN_RECEIVED; + tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT; + goto trimthenstep6; + } /* case TCPS_LISTEN */ + + /* + * If the state is SYN_SENT: + * if seg contains an ACK, but not for our SYN, drop the input. + * if seg contains a RST, then drop the connection. + * if seg does not contain SYN, then drop it. + * Otherwise this is an acceptable SYN segment + * initialize tp->rcv_nxt and tp->irs + * if seg contains ack then advance tp->snd_una + * if SYN has been acked change to ESTABLISHED else SYN_RCVD state + * arrange for segment to be acked (eventually) + * continue processing rest of data/controls, beginning with URG + */ + case TCPS_SYN_SENT: + if ((tiflags & TH_ACK) && + (SEQ_LEQ(ti->ti_ack, tp->iss) || + SEQ_GT(ti->ti_ack, tp->snd_max))) + goto dropwithreset; + + if (tiflags & TH_RST) { + if (tiflags & TH_ACK) { + tcp_drop(tp, 0); /* XXX Check t_softerror! */ + } + goto drop; + } + + if ((tiflags & TH_SYN) == 0) + goto drop; + if (tiflags & TH_ACK) { + tp->snd_una = ti->ti_ack; + if (SEQ_LT(tp->snd_nxt, tp->snd_una)) + tp->snd_nxt = tp->snd_una; + } + + tp->t_timer[TCPT_REXMT] = 0; + tp->irs = ti->ti_seq; + tcp_rcvseqinit(tp); + tp->t_flags |= TF_ACKNOW; + if (tiflags & TH_ACK && SEQ_GT(tp->snd_una, tp->iss)) { + soisfconnected(so); + tp->t_state = TCPS_ESTABLISHED; + + (void) tcp_reass(tp, (struct tcpiphdr *)0, + (struct mbuf *)0); + /* + * if we didn't have to retransmit the SYN, + * use its rtt as our initial srtt & rtt var. + */ + if (tp->t_rtt) + tcp_xmit_timer(tp, tp->t_rtt); + } else + tp->t_state = TCPS_SYN_RECEIVED; + +trimthenstep6: + /* + * Advance ti->ti_seq to correspond to first data byte. + * If data, trim to stay within window, + * dropping FIN if necessary. + */ + ti->ti_seq++; + if (ti->ti_len > tp->rcv_wnd) { + todrop = ti->ti_len - tp->rcv_wnd; + m_adj(m, -todrop); + ti->ti_len = tp->rcv_wnd; + tiflags &= ~TH_FIN; + } + tp->snd_wl1 = ti->ti_seq - 1; + tp->rcv_up = ti->ti_seq; + goto step6; + } /* switch tp->t_state */ + /* + * States other than LISTEN or SYN_SENT. + * Check that at least some bytes of segment are within + * receive window. If segment begins before rcv_nxt, + * drop leading data (and SYN); if nothing left, just ack. + */ + todrop = tp->rcv_nxt - ti->ti_seq; + if (todrop > 0) { + if (tiflags & TH_SYN) { + tiflags &= ~TH_SYN; + ti->ti_seq++; + if (ti->ti_urp > 1) + ti->ti_urp--; + else + tiflags &= ~TH_URG; + todrop--; + } + /* + * Following if statement from Stevens, vol. 2, p. 960. + */ + if (todrop > ti->ti_len + || (todrop == ti->ti_len && (tiflags & TH_FIN) == 0)) { + /* + * Any valid FIN must be to the left of the window. + * At this point the FIN must be a duplicate or out + * of sequence; drop it. + */ + tiflags &= ~TH_FIN; + + /* + * Send an ACK to resynchronize and drop any data. + * But keep on processing for RST or ACK. + */ + tp->t_flags |= TF_ACKNOW; + todrop = ti->ti_len; + } + m_adj(m, todrop); + ti->ti_seq += todrop; + ti->ti_len -= todrop; + if (ti->ti_urp > todrop) + ti->ti_urp -= todrop; + else { + tiflags &= ~TH_URG; + ti->ti_urp = 0; + } + } + /* + * If new data are received on a connection after the + * user processes are gone, then RST the other end. + */ + if ((so->so_state & SS_NOFDREF) && + tp->t_state > TCPS_CLOSE_WAIT && ti->ti_len) { + tp = tcp_close(tp); + goto dropwithreset; + } + + /* + * If segment ends after window, drop trailing data + * (and PUSH and FIN); if nothing left, just ACK. + */ + todrop = (ti->ti_seq+ti->ti_len) - (tp->rcv_nxt+tp->rcv_wnd); + if (todrop > 0) { + if (todrop >= ti->ti_len) { + /* + * If a new connection request is received + * while in TIME_WAIT, drop the old connection + * and start over if the sequence numbers + * are above the previous ones. + */ + if (tiflags & TH_SYN && + tp->t_state == TCPS_TIME_WAIT && + SEQ_GT(ti->ti_seq, tp->rcv_nxt)) { + iss = tp->rcv_nxt + TCP_ISSINCR; + tp = tcp_close(tp); + goto findso; + } + /* + * If window is closed can only take segments at + * window edge, and have to drop data and PUSH from + * incoming segments. Continue processing, but + * remember to ack. Otherwise, drop segment + * and ack. + */ + if (tp->rcv_wnd == 0 && ti->ti_seq == tp->rcv_nxt) { + tp->t_flags |= TF_ACKNOW; + } else { + goto dropafterack; + } + } + m_adj(m, -todrop); + ti->ti_len -= todrop; + tiflags &= ~(TH_PUSH|TH_FIN); + } + + /* + * If the RST bit is set examine the state: + * SYN_RECEIVED STATE: + * If passive open, return to LISTEN state. + * If active open, inform user that connection was refused. + * ESTABLISHED, FIN_WAIT_1, FIN_WAIT2, CLOSE_WAIT STATES: + * Inform user that connection was reset, and close tcb. + * CLOSING, LAST_ACK, TIME_WAIT STATES + * Close the tcb. + */ + if (tiflags&TH_RST) switch (tp->t_state) { + + case TCPS_SYN_RECEIVED: + case TCPS_ESTABLISHED: + case TCPS_FIN_WAIT_1: + case TCPS_FIN_WAIT_2: + case TCPS_CLOSE_WAIT: + tp->t_state = TCPS_CLOSED; + tcp_close(tp); + goto drop; + + case TCPS_CLOSING: + case TCPS_LAST_ACK: + case TCPS_TIME_WAIT: + tcp_close(tp); + goto drop; + } + + /* + * If a SYN is in the window, then this is an + * error and we send an RST and drop the connection. + */ + if (tiflags & TH_SYN) { + tp = tcp_drop(tp,0); + goto dropwithreset; + } + + /* + * If the ACK bit is off we drop the segment and return. + */ + if ((tiflags & TH_ACK) == 0) goto drop; + + /* + * Ack processing. + */ + switch (tp->t_state) { + /* + * In SYN_RECEIVED state if the ack ACKs our SYN then enter + * ESTABLISHED state and continue processing, otherwise + * send an RST. una<=ack<=max + */ + case TCPS_SYN_RECEIVED: + + if (SEQ_GT(tp->snd_una, ti->ti_ack) || + SEQ_GT(ti->ti_ack, tp->snd_max)) + goto dropwithreset; + tp->t_state = TCPS_ESTABLISHED; + /* + * The sent SYN is ack'ed with our sequence number +1 + * The first data byte already in the buffer will get + * lost if no correction is made. This is only needed for + * SS_CTL since the buffer is empty otherwise. + * tp->snd_una++; or: + */ + tp->snd_una=ti->ti_ack; + if (so->so_state & SS_CTL) { + /* So tcp_ctl reports the right state */ + ret = tcp_ctl(so); + if (ret == 1) { + soisfconnected(so); + so->so_state &= ~SS_CTL; /* success XXX */ + } else if (ret == 2) { + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_NOFDREF; /* CTL_CMD */ + } else { + needoutput = 1; + tp->t_state = TCPS_FIN_WAIT_1; + } + } else { + soisfconnected(so); + } + + (void) tcp_reass(tp, (struct tcpiphdr *)0, (struct mbuf *)0); + tp->snd_wl1 = ti->ti_seq - 1; + /* Avoid ack processing; snd_una==ti_ack => dup ack */ + goto synrx_to_est; + /* fall into ... */ + + /* + * In ESTABLISHED state: drop duplicate ACKs; ACK out of range + * ACKs. If the ack is in the range + * tp->snd_una < ti->ti_ack <= tp->snd_max + * then advance tp->snd_una to ti->ti_ack and drop + * data from the retransmission queue. If this ACK reflects + * more up to date window information we update our window information. + */ + case TCPS_ESTABLISHED: + case TCPS_FIN_WAIT_1: + case TCPS_FIN_WAIT_2: + case TCPS_CLOSE_WAIT: + case TCPS_CLOSING: + case TCPS_LAST_ACK: + case TCPS_TIME_WAIT: + + if (SEQ_LEQ(ti->ti_ack, tp->snd_una)) { + if (ti->ti_len == 0 && tiwin == tp->snd_wnd) { + DEBUG_MISC((dfd," dup ack m = %lx so = %lx \n", + (long )m, (long )so)); + /* + * If we have outstanding data (other than + * a window probe), this is a completely + * duplicate ack (ie, window info didn't + * change), the ack is the biggest we've + * seen and we've seen exactly our rexmt + * threshold of them, assume a packet + * has been dropped and retransmit it. + * Kludge snd_nxt & the congestion + * window so we send only this one + * packet. + * + * We know we're losing at the current + * window size so do congestion avoidance + * (set ssthresh to half the current window + * and pull our congestion window back to + * the new ssthresh). + * + * Dup acks mean that packets have left the + * network (they're now cached at the receiver) + * so bump cwnd by the amount in the receiver + * to keep a constant cwnd packets in the + * network. + */ + if (tp->t_timer[TCPT_REXMT] == 0 || + ti->ti_ack != tp->snd_una) + tp->t_dupacks = 0; + else if (++tp->t_dupacks == TCPREXMTTHRESH) { + tcp_seq onxt = tp->snd_nxt; + u_int win = + min(tp->snd_wnd, tp->snd_cwnd) / 2 / + tp->t_maxseg; + + if (win < 2) + win = 2; + tp->snd_ssthresh = win * tp->t_maxseg; + tp->t_timer[TCPT_REXMT] = 0; + tp->t_rtt = 0; + tp->snd_nxt = ti->ti_ack; + tp->snd_cwnd = tp->t_maxseg; + (void) tcp_output(tp); + tp->snd_cwnd = tp->snd_ssthresh + + tp->t_maxseg * tp->t_dupacks; + if (SEQ_GT(onxt, tp->snd_nxt)) + tp->snd_nxt = onxt; + goto drop; + } else if (tp->t_dupacks > TCPREXMTTHRESH) { + tp->snd_cwnd += tp->t_maxseg; + (void) tcp_output(tp); + goto drop; + } + } else + tp->t_dupacks = 0; + break; + } + synrx_to_est: + /* + * If the congestion window was inflated to account + * for the other side's cached packets, retract it. + */ + if (tp->t_dupacks > TCPREXMTTHRESH && + tp->snd_cwnd > tp->snd_ssthresh) + tp->snd_cwnd = tp->snd_ssthresh; + tp->t_dupacks = 0; + if (SEQ_GT(ti->ti_ack, tp->snd_max)) { + goto dropafterack; + } + acked = ti->ti_ack - tp->snd_una; + + /* + * If transmit timer is running and timed sequence + * number was acked, update smoothed round trip time. + * Since we now have an rtt measurement, cancel the + * timer backoff (cf., Phil Karn's retransmit alg.). + * Recompute the initial retransmit timer. + */ + if (tp->t_rtt && SEQ_GT(ti->ti_ack, tp->t_rtseq)) + tcp_xmit_timer(tp,tp->t_rtt); + + /* + * If all outstanding data is acked, stop retransmit + * timer and remember to restart (more output or persist). + * If there is more data to be acked, restart retransmit + * timer, using current (possibly backed-off) value. + */ + if (ti->ti_ack == tp->snd_max) { + tp->t_timer[TCPT_REXMT] = 0; + needoutput = 1; + } else if (tp->t_timer[TCPT_PERSIST] == 0) + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + /* + * When new data is acked, open the congestion window. + * If the window gives us less than ssthresh packets + * in flight, open exponentially (maxseg per packet). + * Otherwise open linearly: maxseg per window + * (maxseg^2 / cwnd per packet). + */ + { + register u_int cw = tp->snd_cwnd; + register u_int incr = tp->t_maxseg; + + if (cw > tp->snd_ssthresh) + incr = incr * incr / cw; + tp->snd_cwnd = min(cw + incr, TCP_MAXWIN<<tp->snd_scale); + } + if (acked > so->so_snd.sb_cc) { + tp->snd_wnd -= so->so_snd.sb_cc; + sbdrop(&so->so_snd, (int )so->so_snd.sb_cc); + ourfinisacked = 1; + } else { + sbdrop(&so->so_snd, acked); + tp->snd_wnd -= acked; + ourfinisacked = 0; + } + tp->snd_una = ti->ti_ack; + if (SEQ_LT(tp->snd_nxt, tp->snd_una)) + tp->snd_nxt = tp->snd_una; + + switch (tp->t_state) { + + /* + * In FIN_WAIT_1 STATE in addition to the processing + * for the ESTABLISHED state if our FIN is now acknowledged + * then enter FIN_WAIT_2. + */ + case TCPS_FIN_WAIT_1: + if (ourfinisacked) { + /* + * If we can't receive any more + * data, then closing user can proceed. + * Starting the timer is contrary to the + * specification, but if we don't get a FIN + * we'll hang forever. + */ + if (so->so_state & SS_FCANTRCVMORE) { + tp->t_timer[TCPT_2MSL] = TCP_MAXIDLE; + } + tp->t_state = TCPS_FIN_WAIT_2; + } + break; + + /* + * In CLOSING STATE in addition to the processing for + * the ESTABLISHED state if the ACK acknowledges our FIN + * then enter the TIME-WAIT state, otherwise ignore + * the segment. + */ + case TCPS_CLOSING: + if (ourfinisacked) { + tp->t_state = TCPS_TIME_WAIT; + tcp_canceltimers(tp); + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + } + break; + + /* + * In LAST_ACK, we may still be waiting for data to drain + * and/or to be acked, as well as for the ack of our FIN. + * If our FIN is now acknowledged, delete the TCB, + * enter the closed state and return. + */ + case TCPS_LAST_ACK: + if (ourfinisacked) { + tcp_close(tp); + goto drop; + } + break; + + /* + * In TIME_WAIT state the only thing that should arrive + * is a retransmission of the remote FIN. Acknowledge + * it and restart the finack timer. + */ + case TCPS_TIME_WAIT: + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + goto dropafterack; + } + } /* switch(tp->t_state) */ + +step6: + /* + * Update window information. + * Don't look at window if no ACK: TAC's send garbage on first SYN. + */ + if ((tiflags & TH_ACK) && + (SEQ_LT(tp->snd_wl1, ti->ti_seq) || + (tp->snd_wl1 == ti->ti_seq && (SEQ_LT(tp->snd_wl2, ti->ti_ack) || + (tp->snd_wl2 == ti->ti_ack && tiwin > tp->snd_wnd))))) { + tp->snd_wnd = tiwin; + tp->snd_wl1 = ti->ti_seq; + tp->snd_wl2 = ti->ti_ack; + if (tp->snd_wnd > tp->max_sndwnd) + tp->max_sndwnd = tp->snd_wnd; + needoutput = 1; + } + + /* + * Process segments with URG. + */ + if ((tiflags & TH_URG) && ti->ti_urp && + TCPS_HAVERCVDFIN(tp->t_state) == 0) { + /* + * This is a kludge, but if we receive and accept + * random urgent pointers, we'll crash in + * soreceive. It's hard to imagine someone + * actually wanting to send this much urgent data. + */ + if (ti->ti_urp + so->so_rcv.sb_cc > so->so_rcv.sb_datalen) { + ti->ti_urp = 0; + tiflags &= ~TH_URG; + goto dodata; + } + /* + * If this segment advances the known urgent pointer, + * then mark the data stream. This should not happen + * in CLOSE_WAIT, CLOSING, LAST_ACK or TIME_WAIT STATES since + * a FIN has been received from the remote side. + * In these states we ignore the URG. + * + * According to RFC961 (Assigned Protocols), + * the urgent pointer points to the last octet + * of urgent data. We continue, however, + * to consider it to indicate the first octet + * of data past the urgent section as the original + * spec states (in one of two places). + */ + if (SEQ_GT(ti->ti_seq+ti->ti_urp, tp->rcv_up)) { + tp->rcv_up = ti->ti_seq + ti->ti_urp; + so->so_urgc = so->so_rcv.sb_cc + + (tp->rcv_up - tp->rcv_nxt); /* -1; */ + tp->rcv_up = ti->ti_seq + ti->ti_urp; + + } + } else + /* + * If no out of band data is expected, + * pull receive urgent pointer along + * with the receive window. + */ + if (SEQ_GT(tp->rcv_nxt, tp->rcv_up)) + tp->rcv_up = tp->rcv_nxt; +dodata: + + /* + * Process the segment text, merging it into the TCP sequencing queue, + * and arranging for acknowledgment of receipt if necessary. + * This process logically involves adjusting tp->rcv_wnd as data + * is presented to the user (this happens in tcp_usrreq.c, + * case PRU_RCVD). If a FIN has already been received on this + * connection then we just ignore the text. + */ + if ((ti->ti_len || (tiflags&TH_FIN)) && + TCPS_HAVERCVDFIN(tp->t_state) == 0) { + TCP_REASS(tp, ti, m, so, tiflags); + } else { + m_free(m); + tiflags &= ~TH_FIN; + } + + /* + * If FIN is received ACK the FIN and let the user know + * that the connection is closing. + */ + if (tiflags & TH_FIN) { + if (TCPS_HAVERCVDFIN(tp->t_state) == 0) { + /* + * If we receive a FIN we can't send more data, + * set it SS_FDRAIN + * Shutdown the socket if there is no rx data in the + * buffer. + * soread() is called on completion of shutdown() and + * will got to TCPS_LAST_ACK, and use tcp_output() + * to send the FIN. + */ + sofwdrain(so); + + tp->t_flags |= TF_ACKNOW; + tp->rcv_nxt++; + } + switch (tp->t_state) { + + /* + * In SYN_RECEIVED and ESTABLISHED STATES + * enter the CLOSE_WAIT state. + */ + case TCPS_SYN_RECEIVED: + case TCPS_ESTABLISHED: + if(so->so_emu == EMU_CTL) /* no shutdown on socket */ + tp->t_state = TCPS_LAST_ACK; + else + tp->t_state = TCPS_CLOSE_WAIT; + break; + + /* + * If still in FIN_WAIT_1 STATE FIN has not been acked so + * enter the CLOSING state. + */ + case TCPS_FIN_WAIT_1: + tp->t_state = TCPS_CLOSING; + break; + + /* + * In FIN_WAIT_2 state enter the TIME_WAIT state, + * starting the time-wait timer, turning off the other + * standard timers. + */ + case TCPS_FIN_WAIT_2: + tp->t_state = TCPS_TIME_WAIT; + tcp_canceltimers(tp); + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + break; + + /* + * In TIME_WAIT state restart the 2 MSL time_wait timer. + */ + case TCPS_TIME_WAIT: + tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL; + break; + } + } + + /* + * If this is a small packet, then ACK now - with Nagel + * congestion avoidance sender won't send more until + * he gets an ACK. + * + * See above. + */ + if (ti->ti_len && (unsigned)ti->ti_len <= 5 && + ((struct tcpiphdr_2 *)ti)->first_char == (char)27) { + tp->t_flags |= TF_ACKNOW; + } + + /* + * Return any desired output. + */ + if (needoutput || (tp->t_flags & TF_ACKNOW)) { + (void) tcp_output(tp); + } + return; + +dropafterack: + /* + * Generate an ACK dropping incoming segment if it occupies + * sequence space, where the ACK reflects our state. + */ + if (tiflags & TH_RST) + goto drop; + m_freem(m); + tp->t_flags |= TF_ACKNOW; + (void) tcp_output(tp); + return; + +dropwithreset: + /* reuses m if m!=NULL, m_free() unnecessary */ + if (tiflags & TH_ACK) + tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST); + else { + if (tiflags & TH_SYN) ti->ti_len++; + tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0, + TH_RST|TH_ACK); + } + + return; + +drop: + /* + * Drop space held by incoming segment and return. + */ + m_free(m); + + return; +} + +static void +tcp_dooptions(struct tcpcb *tp, u_char *cp, int cnt, struct tcpiphdr *ti) +{ + uint16_t mss; + int opt, optlen; + + DEBUG_CALL("tcp_dooptions"); + DEBUG_ARGS((dfd," tp = %lx cnt=%i \n", (long )tp, cnt)); + + for (; cnt > 0; cnt -= optlen, cp += optlen) { + opt = cp[0]; + if (opt == TCPOPT_EOL) + break; + if (opt == TCPOPT_NOP) + optlen = 1; + else { + optlen = cp[1]; + if (optlen <= 0) + break; + } + switch (opt) { + + default: + continue; + + case TCPOPT_MAXSEG: + if (optlen != TCPOLEN_MAXSEG) + continue; + if (!(ti->ti_flags & TH_SYN)) + continue; + memcpy((char *) &mss, (char *) cp + 2, sizeof(mss)); + NTOHS(mss); + (void) tcp_mss(tp, mss); /* sets t_maxseg */ + break; + } + } +} + + +/* + * Pull out of band byte out of a segment so + * it doesn't appear in the user's data queue. + * It is still reflected in the segment length for + * sequencing purposes. + */ + +#ifdef notdef + +void +tcp_pulloutofband(so, ti, m) + struct socket *so; + struct tcpiphdr *ti; + register struct mbuf *m; +{ + int cnt = ti->ti_urp - 1; + + while (cnt >= 0) { + if (m->m_len > cnt) { + char *cp = mtod(m, caddr_t) + cnt; + struct tcpcb *tp = sototcpcb(so); + + tp->t_iobc = *cp; + tp->t_oobflags |= TCPOOB_HAVEDATA; + memcpy(sp, cp+1, (unsigned)(m->m_len - cnt - 1)); + m->m_len--; + return; + } + cnt -= m->m_len; + m = m->m_next; /* XXX WRONG! Fix it! */ + if (m == 0) + break; + } + panic("tcp_pulloutofband"); +} + +#endif /* notdef */ + +/* + * Collect new round-trip time estimate + * and update averages and current timeout. + */ + +static void +tcp_xmit_timer(register struct tcpcb *tp, int rtt) +{ + register short delta; + + DEBUG_CALL("tcp_xmit_timer"); + DEBUG_ARG("tp = %lx", (long)tp); + DEBUG_ARG("rtt = %d", rtt); + + if (tp->t_srtt != 0) { + /* + * srtt is stored as fixed point with 3 bits after the + * binary point (i.e., scaled by 8). The following magic + * is equivalent to the smoothing algorithm in rfc793 with + * an alpha of .875 (srtt = rtt/8 + srtt*7/8 in fixed + * point). Adjust rtt to origin 0. + */ + delta = rtt - 1 - (tp->t_srtt >> TCP_RTT_SHIFT); + if ((tp->t_srtt += delta) <= 0) + tp->t_srtt = 1; + /* + * We accumulate a smoothed rtt variance (actually, a + * smoothed mean difference), then set the retransmit + * timer to smoothed rtt + 4 times the smoothed variance. + * rttvar is stored as fixed point with 2 bits after the + * binary point (scaled by 4). The following is + * equivalent to rfc793 smoothing with an alpha of .75 + * (rttvar = rttvar*3/4 + |delta| / 4). This replaces + * rfc793's wired-in beta. + */ + if (delta < 0) + delta = -delta; + delta -= (tp->t_rttvar >> TCP_RTTVAR_SHIFT); + if ((tp->t_rttvar += delta) <= 0) + tp->t_rttvar = 1; + } else { + /* + * No rtt measurement yet - use the unsmoothed rtt. + * Set the variance to half the rtt (so our first + * retransmit happens at 3*rtt). + */ + tp->t_srtt = rtt << TCP_RTT_SHIFT; + tp->t_rttvar = rtt << (TCP_RTTVAR_SHIFT - 1); + } + tp->t_rtt = 0; + tp->t_rxtshift = 0; + + /* + * the retransmit should happen at rtt + 4 * rttvar. + * Because of the way we do the smoothing, srtt and rttvar + * will each average +1/2 tick of bias. When we compute + * the retransmit timer, we want 1/2 tick of rounding and + * 1 extra tick because of +-1/2 tick uncertainty in the + * firing of the timer. The bias will give us exactly the + * 1.5 tick we need. But, because the bias is + * statistical, we have to test that we don't drop below + * the minimum feasible timer (which is 2 ticks). + */ + TCPT_RANGESET(tp->t_rxtcur, TCP_REXMTVAL(tp), + (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */ + + /* + * We received an ack for a packet that wasn't retransmitted; + * it is probably safe to discard any error indications we've + * received recently. This isn't quite right, but close enough + * for now (a route might have failed after we sent a segment, + * and the return path might not be symmetrical). + */ + tp->t_softerror = 0; +} + +/* + * Determine a reasonable value for maxseg size. + * If the route is known, check route for mtu. + * If none, use an mss that can be handled on the outgoing + * interface without forcing IP to fragment; if bigger than + * an mbuf cluster (MCLBYTES), round down to nearest multiple of MCLBYTES + * to utilize large mbufs. If no route is found, route has no mtu, + * or the destination isn't local, use a default, hopefully conservative + * size (usually 512 or the default IP max size, but no more than the mtu + * of the interface), as we can't discover anything about intervening + * gateways or networks. We also initialize the congestion/slow start + * window to be a single segment if the destination isn't local. + * While looking at the routing entry, we also initialize other path-dependent + * parameters from pre-set or cached values in the routing entry. + */ + +int +tcp_mss(struct tcpcb *tp, u_int offer) +{ + struct socket *so = tp->t_socket; + int mss; + + DEBUG_CALL("tcp_mss"); + DEBUG_ARG("tp = %lx", (long)tp); + DEBUG_ARG("offer = %d", offer); + + mss = min(IF_MTU, IF_MRU) - sizeof(struct tcpiphdr); + if (offer) + mss = min(mss, offer); + mss = max(mss, 32); + if (mss < tp->t_maxseg || offer != 0) + tp->t_maxseg = mss; + + tp->snd_cwnd = mss; + + sbreserve(&so->so_snd, TCP_SNDSPACE + ((TCP_SNDSPACE % mss) ? + (mss - (TCP_SNDSPACE % mss)) : + 0)); + sbreserve(&so->so_rcv, TCP_RCVSPACE + ((TCP_RCVSPACE % mss) ? + (mss - (TCP_RCVSPACE % mss)) : + 0)); + + DEBUG_MISC((dfd, " returning mss = %d\n", mss)); + + return mss; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c new file mode 100644 index 0000000..01725db --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_output.c @@ -0,0 +1,492 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_output.c 8.3 (Berkeley) 12/30/93 + * tcp_output.c,v 1.3 1994/09/15 10:36:55 davidg Exp + */ + +/* + * Changes and additions relating to SLiRP + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" + +static const u_char tcp_outflags[TCP_NSTATES] = { + TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, + TH_ACK, TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, + TH_FIN|TH_ACK, TH_ACK, TH_ACK, +}; + + +#define MAX_TCPOPTLEN 32 /* max # bytes that go in options */ + +/* + * Tcp output routine: figure out what should be sent and send it. + */ +int +tcp_output(struct tcpcb *tp) +{ + register struct socket *so = tp->t_socket; + register long len, win; + int off, flags, error; + register struct mbuf *m; + register struct tcpiphdr *ti; + u_char opt[MAX_TCPOPTLEN]; + unsigned optlen, hdrlen; + int idle, sendalot; + + DEBUG_CALL("tcp_output"); + DEBUG_ARG("tp = %lx", (long )tp); + + /* + * Determine length of data that should be transmitted, + * and flags that will be used. + * If there is some data or critical controls (SYN, RST) + * to send, then transmit; otherwise, investigate further. + */ + idle = (tp->snd_max == tp->snd_una); + if (idle && tp->t_idle >= tp->t_rxtcur) + /* + * We have been idle for "a while" and no acks are + * expected to clock out any data we send -- + * slow start to get ack "clock" running again. + */ + tp->snd_cwnd = tp->t_maxseg; +again: + sendalot = 0; + off = tp->snd_nxt - tp->snd_una; + win = min(tp->snd_wnd, tp->snd_cwnd); + + flags = tcp_outflags[tp->t_state]; + + DEBUG_MISC((dfd, " --- tcp_output flags = 0x%x\n",flags)); + + /* + * If in persist timeout with window of 0, send 1 byte. + * Otherwise, if window is small but nonzero + * and timer expired, we will send what we can + * and go to transmit state. + */ + if (tp->t_force) { + if (win == 0) { + /* + * If we still have some data to send, then + * clear the FIN bit. Usually this would + * happen below when it realizes that we + * aren't sending all the data. However, + * if we have exactly 1 byte of unset data, + * then it won't clear the FIN bit below, + * and if we are in persist state, we wind + * up sending the packet without recording + * that we sent the FIN bit. + * + * We can't just blindly clear the FIN bit, + * because if we don't have any more data + * to send then the probe will be the FIN + * itself. + */ + if (off < so->so_snd.sb_cc) + flags &= ~TH_FIN; + win = 1; + } else { + tp->t_timer[TCPT_PERSIST] = 0; + tp->t_rxtshift = 0; + } + } + + len = min(so->so_snd.sb_cc, win) - off; + + if (len < 0) { + /* + * If FIN has been sent but not acked, + * but we haven't been called to retransmit, + * len will be -1. Otherwise, window shrank + * after we sent into it. If window shrank to 0, + * cancel pending retransmit and pull snd_nxt + * back to (closed) window. We will enter persist + * state below. If the window didn't close completely, + * just wait for an ACK. + */ + len = 0; + if (win == 0) { + tp->t_timer[TCPT_REXMT] = 0; + tp->snd_nxt = tp->snd_una; + } + } + + if (len > tp->t_maxseg) { + len = tp->t_maxseg; + sendalot = 1; + } + if (SEQ_LT(tp->snd_nxt + len, tp->snd_una + so->so_snd.sb_cc)) + flags &= ~TH_FIN; + + win = sbspace(&so->so_rcv); + + /* + * Sender silly window avoidance. If connection is idle + * and can send all data, a maximum segment, + * at least a maximum default-size segment do it, + * or are forced, do it; otherwise don't bother. + * If peer's buffer is tiny, then send + * when window is at least half open. + * If retransmitting (possibly after persist timer forced us + * to send into a small window), then must resend. + */ + if (len) { + if (len == tp->t_maxseg) + goto send; + if ((1 || idle || tp->t_flags & TF_NODELAY) && + len + off >= so->so_snd.sb_cc) + goto send; + if (tp->t_force) + goto send; + if (len >= tp->max_sndwnd / 2 && tp->max_sndwnd > 0) + goto send; + if (SEQ_LT(tp->snd_nxt, tp->snd_max)) + goto send; + } + + /* + * Compare available window to amount of window + * known to peer (as advertised window less + * next expected input). If the difference is at least two + * max size segments, or at least 50% of the maximum possible + * window, then want to send a window update to peer. + */ + if (win > 0) { + /* + * "adv" is the amount we can increase the window, + * taking into account that we are limited by + * TCP_MAXWIN << tp->rcv_scale. + */ + long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale) - + (tp->rcv_adv - tp->rcv_nxt); + + if (adv >= (long) (2 * tp->t_maxseg)) + goto send; + if (2 * adv >= (long) so->so_rcv.sb_datalen) + goto send; + } + + /* + * Send if we owe peer an ACK. + */ + if (tp->t_flags & TF_ACKNOW) + goto send; + if (flags & (TH_SYN|TH_RST)) + goto send; + if (SEQ_GT(tp->snd_up, tp->snd_una)) + goto send; + /* + * If our state indicates that FIN should be sent + * and we have not yet done so, or we're retransmitting the FIN, + * then we need to send. + */ + if (flags & TH_FIN && + ((tp->t_flags & TF_SENTFIN) == 0 || tp->snd_nxt == tp->snd_una)) + goto send; + + /* + * TCP window updates are not reliable, rather a polling protocol + * using ``persist'' packets is used to insure receipt of window + * updates. The three ``states'' for the output side are: + * idle not doing retransmits or persists + * persisting to move a small or zero window + * (re)transmitting and thereby not persisting + * + * tp->t_timer[TCPT_PERSIST] + * is set when we are in persist state. + * tp->t_force + * is set when we are called to send a persist packet. + * tp->t_timer[TCPT_REXMT] + * is set when we are retransmitting + * The output side is idle when both timers are zero. + * + * If send window is too small, there is data to transmit, and no + * retransmit or persist is pending, then go to persist state. + * If nothing happens soon, send when timer expires: + * if window is nonzero, transmit what we can, + * otherwise force out a byte. + */ + if (so->so_snd.sb_cc && tp->t_timer[TCPT_REXMT] == 0 && + tp->t_timer[TCPT_PERSIST] == 0) { + tp->t_rxtshift = 0; + tcp_setpersist(tp); + } + + /* + * No reason to send a segment, just return. + */ + return (0); + +send: + /* + * Before ESTABLISHED, force sending of initial options + * unless TCP set not to do any options. + * NOTE: we assume that the IP/TCP header plus TCP options + * always fit in a single mbuf, leaving room for a maximum + * link header, i.e. + * max_linkhdr + sizeof (struct tcpiphdr) + optlen <= MHLEN + */ + optlen = 0; + hdrlen = sizeof (struct tcpiphdr); + if (flags & TH_SYN) { + tp->snd_nxt = tp->iss; + if ((tp->t_flags & TF_NOOPT) == 0) { + uint16_t mss; + + opt[0] = TCPOPT_MAXSEG; + opt[1] = 4; + mss = htons((uint16_t) tcp_mss(tp, 0)); + memcpy((caddr_t)(opt + 2), (caddr_t)&mss, sizeof(mss)); + optlen = 4; + } + } + + hdrlen += optlen; + + /* + * Adjust data length if insertion of options will + * bump the packet length beyond the t_maxseg length. + */ + if (len > tp->t_maxseg - optlen) { + len = tp->t_maxseg - optlen; + sendalot = 1; + } + + /* + * Grab a header mbuf, attaching a copy of data to + * be transmitted, and initialize the header from + * the template for sends on this connection. + */ + if (len) { + m = m_get(so->slirp); + if (m == NULL) { + error = 1; + goto out; + } + m->m_data += IF_MAXLINKHDR; + m->m_len = hdrlen; + + sbcopy(&so->so_snd, off, (int) len, mtod(m, caddr_t) + hdrlen); + m->m_len += len; + + /* + * If we're sending everything we've got, set PUSH. + * (This will keep happy those implementations which only + * give data to the user when a buffer fills or + * a PUSH comes in.) + */ + if (off + len == so->so_snd.sb_cc) + flags |= TH_PUSH; + } else { + m = m_get(so->slirp); + if (m == NULL) { + error = 1; + goto out; + } + m->m_data += IF_MAXLINKHDR; + m->m_len = hdrlen; + } + + ti = mtod(m, struct tcpiphdr *); + + memcpy((caddr_t)ti, &tp->t_template, sizeof (struct tcpiphdr)); + + /* + * Fill in fields, remembering maximum advertised + * window for use in delaying messages about window sizes. + * If resending a FIN, be sure not to use a new sequence number. + */ + if (flags & TH_FIN && tp->t_flags & TF_SENTFIN && + tp->snd_nxt == tp->snd_max) + tp->snd_nxt--; + /* + * If we are doing retransmissions, then snd_nxt will + * not reflect the first unsent octet. For ACK only + * packets, we do not want the sequence number of the + * retransmitted packet, we want the sequence number + * of the next unsent octet. So, if there is no data + * (and no SYN or FIN), use snd_max instead of snd_nxt + * when filling in ti_seq. But if we are in persist + * state, snd_max might reflect one byte beyond the + * right edge of the window, so use snd_nxt in that + * case, since we know we aren't doing a retransmission. + * (retransmit and persist are mutually exclusive...) + */ + if (len || (flags & (TH_SYN|TH_FIN)) || tp->t_timer[TCPT_PERSIST]) + ti->ti_seq = htonl(tp->snd_nxt); + else + ti->ti_seq = htonl(tp->snd_max); + ti->ti_ack = htonl(tp->rcv_nxt); + if (optlen) { + memcpy((caddr_t)(ti + 1), (caddr_t)opt, optlen); + ti->ti_off = (sizeof (struct tcphdr) + optlen) >> 2; + } + ti->ti_flags = flags; + /* + * Calculate receive window. Don't shrink window, + * but avoid silly window syndrome. + */ + if (win < (long)(so->so_rcv.sb_datalen / 4) && win < (long)tp->t_maxseg) + win = 0; + if (win > (long)TCP_MAXWIN << tp->rcv_scale) + win = (long)TCP_MAXWIN << tp->rcv_scale; + if (win < (long)(tp->rcv_adv - tp->rcv_nxt)) + win = (long)(tp->rcv_adv - tp->rcv_nxt); + ti->ti_win = htons((uint16_t) (win>>tp->rcv_scale)); + + if (SEQ_GT(tp->snd_up, tp->snd_una)) { + ti->ti_urp = htons((uint16_t)(tp->snd_up - ntohl(ti->ti_seq))); + ti->ti_flags |= TH_URG; + } else + /* + * If no urgent pointer to send, then we pull + * the urgent pointer to the left edge of the send window + * so that it doesn't drift into the send window on sequence + * number wraparound. + */ + tp->snd_up = tp->snd_una; /* drag it along */ + + /* + * Put TCP length in extended header, and then + * checksum extended header and data. + */ + if (len + optlen) + ti->ti_len = htons((uint16_t)(sizeof (struct tcphdr) + + optlen + len)); + ti->ti_sum = cksum(m, (int)(hdrlen + len)); + + /* + * In transmit state, time the transmission and arrange for + * the retransmit. In persist state, just set snd_max. + */ + if (tp->t_force == 0 || tp->t_timer[TCPT_PERSIST] == 0) { + tcp_seq startseq = tp->snd_nxt; + + /* + * Advance snd_nxt over sequence space of this segment. + */ + if (flags & (TH_SYN|TH_FIN)) { + if (flags & TH_SYN) + tp->snd_nxt++; + if (flags & TH_FIN) { + tp->snd_nxt++; + tp->t_flags |= TF_SENTFIN; + } + } + tp->snd_nxt += len; + if (SEQ_GT(tp->snd_nxt, tp->snd_max)) { + tp->snd_max = tp->snd_nxt; + /* + * Time this transmission if not a retransmission and + * not currently timing anything. + */ + if (tp->t_rtt == 0) { + tp->t_rtt = 1; + tp->t_rtseq = startseq; + } + } + + /* + * Set retransmit timer if not currently set, + * and not doing an ack or a keep-alive probe. + * Initial value for retransmit timer is smoothed + * round-trip time + 2 * round-trip time variance. + * Initialize shift counter which is used for backoff + * of retransmit time. + */ + if (tp->t_timer[TCPT_REXMT] == 0 && + tp->snd_nxt != tp->snd_una) { + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + if (tp->t_timer[TCPT_PERSIST]) { + tp->t_timer[TCPT_PERSIST] = 0; + tp->t_rxtshift = 0; + } + } + } else + if (SEQ_GT(tp->snd_nxt + len, tp->snd_max)) + tp->snd_max = tp->snd_nxt + len; + + /* + * Fill in IP length and desired time to live and + * send to IP level. There should be a better way + * to handle ttl and tos; we could keep them in + * the template, but need a way to checksum without them. + */ + m->m_len = hdrlen + len; /* XXX Needed? m_len should be correct */ + + { + + ((struct ip *)ti)->ip_len = m->m_len; + + ((struct ip *)ti)->ip_ttl = IPDEFTTL; + ((struct ip *)ti)->ip_tos = so->so_iptos; + + error = ip_output(so, m); + } + if (error) { +out: + return (error); + } + + /* + * Data sent (as far as we can tell). + * If this advertises a larger window than any other segment, + * then remember the size of the advertised window. + * Any pending ACK has now been sent. + */ + if (win > 0 && SEQ_GT(tp->rcv_nxt+win, tp->rcv_adv)) + tp->rcv_adv = tp->rcv_nxt + win; + tp->last_ack_sent = tp->rcv_nxt; + tp->t_flags &= ~(TF_ACKNOW|TF_DELACK); + if (sendalot) + goto again; + + return (0); +} + +void +tcp_setpersist(struct tcpcb *tp) +{ + int t = ((tp->t_srtt >> 2) + tp->t_rttvar) >> 1; + + /* + * Start/restart persistence timer. + */ + TCPT_RANGESET(tp->t_timer[TCPT_PERSIST], + t * tcp_backoff[tp->t_rxtshift], + TCPTV_PERSMIN, TCPTV_PERSMAX); + if (tp->t_rxtshift < TCP_MAXRXTSHIFT) + tp->t_rxtshift++; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c new file mode 100644 index 0000000..1557e89 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_subr.c @@ -0,0 +1,915 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_subr.c 8.1 (Berkeley) 6/10/93 + * tcp_subr.c,v 1.5 1994/10/08 22:39:58 phk Exp + */ + +/* + * Changes and additions relating to SLiRP + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" + +/* patchable/settable parameters for tcp */ +/* Don't do rfc1323 performance enhancements */ +#define TCP_DO_RFC1323 0 + +/* + * Tcp initialization + */ +void +tcp_init(Slirp *slirp) +{ + slirp->tcp_iss = 1; /* wrong */ + slirp->tcb.so_next = slirp->tcb.so_prev = &slirp->tcb; + slirp->tcp_last_so = &slirp->tcb; +} + +/* + * Create template to be used to send tcp packets on a connection. + * Call after host entry created, fills + * in a skeletal tcp/ip header, minimizing the amount of work + * necessary when the connection is used. + */ +void +tcp_template(struct tcpcb *tp) +{ + struct socket *so = tp->t_socket; + register struct tcpiphdr *n = &tp->t_template; + + n->ti_mbuf = NULL; + n->ti_x1 = 0; + n->ti_pr = IPPROTO_TCP; + n->ti_len = htons(sizeof (struct tcpiphdr) - sizeof (struct ip)); + n->ti_src = so->so_faddr; + n->ti_dst = so->so_laddr; + n->ti_sport = so->so_fport; + n->ti_dport = so->so_lport; + + n->ti_seq = 0; + n->ti_ack = 0; + n->ti_x2 = 0; + n->ti_off = 5; + n->ti_flags = 0; + n->ti_win = 0; + n->ti_sum = 0; + n->ti_urp = 0; +} + +/* + * Send a single message to the TCP at address specified by + * the given TCP/IP header. If m == 0, then we make a copy + * of the tcpiphdr at ti and send directly to the addressed host. + * This is used to force keep alive messages out using the TCP + * template for a connection tp->t_template. If flags are given + * then we send a message back to the TCP which originated the + * segment ti, and discard the mbuf containing it and any other + * attached mbufs. + * + * In any case the ack and sequence number of the transmitted + * segment are as specified by the parameters. + */ +void +tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m, + tcp_seq ack, tcp_seq seq, int flags) +{ + register int tlen; + int win = 0; + + DEBUG_CALL("tcp_respond"); + DEBUG_ARG("tp = %lx", (long)tp); + DEBUG_ARG("ti = %lx", (long)ti); + DEBUG_ARG("m = %lx", (long)m); + DEBUG_ARG("ack = %u", ack); + DEBUG_ARG("seq = %u", seq); + DEBUG_ARG("flags = %x", flags); + + if (tp) + win = sbspace(&tp->t_socket->so_rcv); + if (m == NULL) { + if ((m = m_get(tp->t_socket->slirp)) == NULL) + return; + tlen = 0; + m->m_data += IF_MAXLINKHDR; + *mtod(m, struct tcpiphdr *) = *ti; + ti = mtod(m, struct tcpiphdr *); + flags = TH_ACK; + } else { + /* + * ti points into m so the next line is just making + * the mbuf point to ti + */ + m->m_data = (caddr_t)ti; + + m->m_len = sizeof (struct tcpiphdr); + tlen = 0; +#define xchg(a,b,type) { type t; t=a; a=b; b=t; } + xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, uint32_t); + xchg(ti->ti_dport, ti->ti_sport, uint16_t); +#undef xchg + } + ti->ti_len = htons((u_short)(sizeof (struct tcphdr) + tlen)); + tlen += sizeof (struct tcpiphdr); + m->m_len = tlen; + + ti->ti_mbuf = NULL; + ti->ti_x1 = 0; + ti->ti_seq = htonl(seq); + ti->ti_ack = htonl(ack); + ti->ti_x2 = 0; + ti->ti_off = sizeof (struct tcphdr) >> 2; + ti->ti_flags = flags; + if (tp) + ti->ti_win = htons((uint16_t) (win >> tp->rcv_scale)); + else + ti->ti_win = htons((uint16_t)win); + ti->ti_urp = 0; + ti->ti_sum = 0; + ti->ti_sum = cksum(m, tlen); + ((struct ip *)ti)->ip_len = tlen; + + if(flags & TH_RST) + ((struct ip *)ti)->ip_ttl = MAXTTL; + else + ((struct ip *)ti)->ip_ttl = IPDEFTTL; + + (void) ip_output((struct socket *)0, m); +} + +/* + * Create a new TCP control block, making an + * empty reassembly queue and hooking it to the argument + * protocol control block. + */ +struct tcpcb * +tcp_newtcpcb(struct socket *so) +{ + register struct tcpcb *tp; + + tp = (struct tcpcb *)malloc(sizeof(*tp)); + if (tp == NULL) + return ((struct tcpcb *)0); + + memset((char *) tp, 0, sizeof(struct tcpcb)); + tp->seg_next = tp->seg_prev = (struct tcpiphdr*)tp; + tp->t_maxseg = TCP_MSS; + + tp->t_flags = TCP_DO_RFC1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0; + tp->t_socket = so; + + /* + * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no + * rtt estimate. Set rttvar so that srtt + 2 * rttvar gives + * reasonable initial retransmit time. + */ + tp->t_srtt = TCPTV_SRTTBASE; + tp->t_rttvar = TCPTV_SRTTDFLT << 2; + tp->t_rttmin = TCPTV_MIN; + + TCPT_RANGESET(tp->t_rxtcur, + ((TCPTV_SRTTBASE >> 2) + (TCPTV_SRTTDFLT << 2)) >> 1, + TCPTV_MIN, TCPTV_REXMTMAX); + + tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT; + tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT; + tp->t_state = TCPS_CLOSED; + + so->so_tcpcb = tp; + + return (tp); +} + +/* + * Drop a TCP connection, reporting + * the specified error. If connection is synchronized, + * then send a RST to peer. + */ +struct tcpcb *tcp_drop(struct tcpcb *tp, int err) +{ + DEBUG_CALL("tcp_drop"); + DEBUG_ARG("tp = %lx", (long)tp); + DEBUG_ARG("errno = %d", errno); + + if (TCPS_HAVERCVDSYN(tp->t_state)) { + tp->t_state = TCPS_CLOSED; + (void) tcp_output(tp); + } + return (tcp_close(tp)); +} + +/* + * Close a TCP control block: + * discard all space held by the tcp + * discard internet protocol block + * wake up any sleepers + */ +struct tcpcb * +tcp_close(struct tcpcb *tp) +{ + register struct tcpiphdr *t; + struct socket *so = tp->t_socket; + Slirp *slirp = so->slirp; + register struct mbuf *m; + + DEBUG_CALL("tcp_close"); + DEBUG_ARG("tp = %lx", (long )tp); + + /* free the reassembly queue, if any */ + t = tcpfrag_list_first(tp); + while (!tcpfrag_list_end(t, tp)) { + t = tcpiphdr_next(t); + m = tcpiphdr_prev(t)->ti_mbuf; + remque(tcpiphdr2qlink(tcpiphdr_prev(t))); + m_freem(m); + } + free(tp); + so->so_tcpcb = NULL; + /* clobber input socket cache if we're closing the cached connection */ + if (so == slirp->tcp_last_so) + slirp->tcp_last_so = &slirp->tcb; + closesocket(so->s); + sbfree(&so->so_rcv); + sbfree(&so->so_snd); + sofree(so); + return ((struct tcpcb *)0); +} + +/* + * TCP protocol interface to socket abstraction. + */ + +/* + * User issued close, and wish to trail through shutdown states: + * if never received SYN, just forget it. If got a SYN from peer, + * but haven't sent FIN, then go to FIN_WAIT_1 state to send peer a FIN. + * If already got a FIN from peer, then almost done; go to LAST_ACK + * state. In all other cases, have already sent FIN to peer (e.g. + * after PRU_SHUTDOWN), and just have to play tedious game waiting + * for peer to send FIN or not respond to keep-alives, etc. + * We can let the user exit from the close as soon as the FIN is acked. + */ +void +tcp_sockclosed(struct tcpcb *tp) +{ + + DEBUG_CALL("tcp_sockclosed"); + DEBUG_ARG("tp = %lx", (long)tp); + + switch (tp->t_state) { + + case TCPS_CLOSED: + case TCPS_LISTEN: + case TCPS_SYN_SENT: + tp->t_state = TCPS_CLOSED; + tp = tcp_close(tp); + break; + + case TCPS_SYN_RECEIVED: + case TCPS_ESTABLISHED: + tp->t_state = TCPS_FIN_WAIT_1; + break; + + case TCPS_CLOSE_WAIT: + tp->t_state = TCPS_LAST_ACK; + break; + } + if (tp) + tcp_output(tp); +} + +/* + * Connect to a host on the Internet + * Called by tcp_input + * Only do a connect, the tcp fields will be set in tcp_input + * return 0 if there's a result of the connect, + * else return -1 means we're still connecting + * The return value is almost always -1 since the socket is + * nonblocking. Connect returns after the SYN is sent, and does + * not wait for ACK+SYN. + */ +int tcp_fconnect(struct socket *so) +{ + Slirp *slirp = so->slirp; + int ret=0; + + DEBUG_CALL("tcp_fconnect"); + DEBUG_ARG("so = %lx", (long )so); + + if( (ret = so->s = os_socket(AF_INET,SOCK_STREAM,0)) >= 0) { + int opt, s=so->s; + struct sockaddr_in addr; + + fd_nonblock(s); + opt = 1; + setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(opt )); + opt = 1; + setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(opt )); + + addr.sin_family = AF_INET; + if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + /* It's an alias */ + if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) { + if (get_dns_addr(&addr.sin_addr) < 0) + addr.sin_addr = loopback_addr; + } else { + addr.sin_addr = loopback_addr; + } + } else + addr.sin_addr = so->so_faddr; + addr.sin_port = so->so_fport; + + DEBUG_MISC((dfd, " connect()ing, addr.sin_port=%d, " + "addr.sin_addr.s_addr=%.16s\n", + ntohs(addr.sin_port), inet_ntoa(addr.sin_addr))); + /* We don't care what port we get */ + ret = connect(s,(struct sockaddr *)&addr,sizeof (addr)); + + /* + * If it's not in progress, it failed, so we just return 0, + * without clearing SS_NOFDREF + */ + soisfconnecting(so); + } + + return(ret); +} + +/* + * Accept the socket and connect to the local-host + * + * We have a problem. The correct thing to do would be + * to first connect to the local-host, and only if the + * connection is accepted, then do an accept() here. + * But, a) we need to know who's trying to connect + * to the socket to be able to SYN the local-host, and + * b) we are already connected to the foreign host by + * the time it gets to accept(), so... We simply accept + * here and SYN the local-host. + */ +void +tcp_connect(struct socket *inso) +{ + Slirp *slirp = inso->slirp; + struct socket *so; + struct sockaddr_in addr; + socklen_t addrlen = sizeof(struct sockaddr_in); + struct tcpcb *tp; + int s, opt; + + DEBUG_CALL("tcp_connect"); + DEBUG_ARG("inso = %lx", (long)inso); + + /* + * If it's an SS_ACCEPTONCE socket, no need to socreate() + * another socket, just use the accept() socket. + */ + if (inso->so_state & SS_FACCEPTONCE) { + /* FACCEPTONCE already have a tcpcb */ + so = inso; + } else { + if ((so = socreate(slirp)) == NULL) { + /* If it failed, get rid of the pending connection */ + closesocket(accept(inso->s,(struct sockaddr *)&addr,&addrlen)); + return; + } + if (tcp_attach(so) < 0) { + free(so); /* NOT sofree */ + return; + } + so->so_laddr = inso->so_laddr; + so->so_lport = inso->so_lport; + } + + (void) tcp_mss(sototcpcb(so), 0); + + if ((s = accept(inso->s,(struct sockaddr *)&addr,&addrlen)) < 0) { + tcp_close(sototcpcb(so)); /* This will sofree() as well */ + return; + } + fd_nonblock(s); + opt = 1; + setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)); + opt = 1; + setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int)); + opt = 1; + setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char *)&opt,sizeof(int)); + + so->so_fport = addr.sin_port; + so->so_faddr = addr.sin_addr; + /* Translate connections from localhost to the real hostname */ + if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr) + so->so_faddr = slirp->vhost_addr; + + /* Close the accept() socket, set right state */ + if (inso->so_state & SS_FACCEPTONCE) { + closesocket(so->s); /* If we only accept once, close the accept() socket */ + so->so_state = SS_NOFDREF; /* Don't select it yet, even though we have an FD */ + /* if it's not FACCEPTONCE, it's already NOFDREF */ + } + so->s = s; + so->so_state |= SS_INCOMING; + + so->so_iptos = tcp_tos(so); + tp = sototcpcb(so); + + tcp_template(tp); + + tp->t_state = TCPS_SYN_SENT; + tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT; + tp->iss = slirp->tcp_iss; + slirp->tcp_iss += TCP_ISSINCR/2; + tcp_sendseqinit(tp); + tcp_output(tp); +} + +/* + * Attach a TCPCB to a socket. + */ +int +tcp_attach(struct socket *so) +{ + if ((so->so_tcpcb = tcp_newtcpcb(so)) == NULL) + return -1; + + insque(so, &so->slirp->tcb); + + return 0; +} + +/* + * Set the socket's type of service field + */ +static const struct tos_t tcptos[] = { + {0, 20, IPTOS_THROUGHPUT, 0}, /* ftp data */ + {21, 21, IPTOS_LOWDELAY, EMU_FTP}, /* ftp control */ + {0, 23, IPTOS_LOWDELAY, 0}, /* telnet */ + {0, 80, IPTOS_THROUGHPUT, 0}, /* WWW */ + {0, 513, IPTOS_LOWDELAY, EMU_RLOGIN|EMU_NOCONNECT}, /* rlogin */ + {0, 514, IPTOS_LOWDELAY, EMU_RSH|EMU_NOCONNECT}, /* shell */ + {0, 544, IPTOS_LOWDELAY, EMU_KSH}, /* kshell */ + {0, 543, IPTOS_LOWDELAY, 0}, /* klogin */ + {0, 6667, IPTOS_THROUGHPUT, EMU_IRC}, /* IRC */ + {0, 6668, IPTOS_THROUGHPUT, EMU_IRC}, /* IRC undernet */ + {0, 7070, IPTOS_LOWDELAY, EMU_REALAUDIO }, /* RealAudio control */ + {0, 113, IPTOS_LOWDELAY, EMU_IDENT }, /* identd protocol */ + {0, 0, 0, 0} +}; + +static struct emu_t *tcpemu = NULL; + +/* + * Return TOS according to the above table + */ +uint8_t +tcp_tos(struct socket *so) +{ + int i = 0; + struct emu_t *emup; + + while(tcptos[i].tos) { + if ((tcptos[i].fport && (ntohs(so->so_fport) == tcptos[i].fport)) || + (tcptos[i].lport && (ntohs(so->so_lport) == tcptos[i].lport))) { + so->so_emu = tcptos[i].emu; + return tcptos[i].tos; + } + i++; + } + + /* Nope, lets see if there's a user-added one */ + for (emup = tcpemu; emup; emup = emup->next) { + if ((emup->fport && (ntohs(so->so_fport) == emup->fport)) || + (emup->lport && (ntohs(so->so_lport) == emup->lport))) { + so->so_emu = emup->emu; + return emup->tos; + } + } + + return 0; +} + +/* + * Emulate programs that try and connect to us + * This includes ftp (the data connection is + * initiated by the server) and IRC (DCC CHAT and + * DCC SEND) for now + * + * NOTE: It's possible to crash SLiRP by sending it + * unstandard strings to emulate... if this is a problem, + * more checks are needed here + * + * XXX Assumes the whole command came in one packet + * + * XXX Some ftp clients will have their TOS set to + * LOWDELAY and so Nagel will kick in. Because of this, + * we'll get the first letter, followed by the rest, so + * we simply scan for ORT instead of PORT... + * DCC doesn't have this problem because there's other stuff + * in the packet before the DCC command. + * + * Return 1 if the mbuf m is still valid and should be + * sbappend()ed + * + * NOTE: if you return 0 you MUST m_free() the mbuf! + */ +int +tcp_emu(struct socket *so, struct mbuf *m) +{ + Slirp *slirp = so->slirp; + u_int n1, n2, n3, n4, n5, n6; + char buff[257]; + uint32_t laddr; + u_int lport; + char *bptr; + + DEBUG_CALL("tcp_emu"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("m = %lx", (long)m); + + switch(so->so_emu) { + int x, i; + + case EMU_IDENT: + /* + * Identification protocol as per rfc-1413 + */ + + { + struct socket *tmpso; + struct sockaddr_in addr; + socklen_t addrlen = sizeof(struct sockaddr_in); + struct sbuf *so_rcv = &so->so_rcv; + + memcpy(so_rcv->sb_wptr, m->m_data, m->m_len); + so_rcv->sb_wptr += m->m_len; + so_rcv->sb_rptr += m->m_len; + m->m_data[m->m_len] = 0; /* NULL terminate */ + if (strchr(m->m_data, '\r') || strchr(m->m_data, '\n')) { + if (sscanf(so_rcv->sb_data, "%u%*[ ,]%u", &n1, &n2) == 2) { + HTONS(n1); + HTONS(n2); + /* n2 is the one on our host */ + for (tmpso = slirp->tcb.so_next; + tmpso != &slirp->tcb; + tmpso = tmpso->so_next) { + if (tmpso->so_laddr.s_addr == so->so_laddr.s_addr && + tmpso->so_lport == n2 && + tmpso->so_faddr.s_addr == so->so_faddr.s_addr && + tmpso->so_fport == n1) { + if (getsockname(tmpso->s, + (struct sockaddr *)&addr, &addrlen) == 0) + n2 = ntohs(addr.sin_port); + break; + } + } + } + so_rcv->sb_cc = snprintf(so_rcv->sb_data, + so_rcv->sb_datalen, + "%d,%d\r\n", n1, n2); + so_rcv->sb_rptr = so_rcv->sb_data; + so_rcv->sb_wptr = so_rcv->sb_data + so_rcv->sb_cc; + } + m_free(m); + return 0; + } + + case EMU_FTP: /* ftp */ + *(m->m_data+m->m_len) = 0; /* NUL terminate for strstr */ + if ((bptr = (char *)strstr(m->m_data, "ORT")) != NULL) { + /* + * Need to emulate the PORT command + */ + x = sscanf(bptr, "ORT %u,%u,%u,%u,%u,%u\r\n%256[^\177]", + &n1, &n2, &n3, &n4, &n5, &n6, buff); + if (x < 6) + return 1; + + laddr = htonl((n1 << 24) | (n2 << 16) | (n3 << 8) | (n4)); + lport = htons((n5 << 8) | (n6)); + + if ((so = tcp_listen(slirp, INADDR_ANY, 0, laddr, + lport, SS_FACCEPTONCE)) == NULL) { + return 1; + } + n6 = ntohs(so->so_fport); + + n5 = (n6 >> 8) & 0xff; + n6 &= 0xff; + + laddr = ntohl(so->so_faddr.s_addr); + + n1 = ((laddr >> 24) & 0xff); + n2 = ((laddr >> 16) & 0xff); + n3 = ((laddr >> 8) & 0xff); + n4 = (laddr & 0xff); + + m->m_len = bptr - m->m_data; /* Adjust length */ + m->m_len += snprintf(bptr, m->m_hdr.mh_size - m->m_len, + "ORT %d,%d,%d,%d,%d,%d\r\n%s", + n1, n2, n3, n4, n5, n6, x==7?buff:""); + return 1; + } else if ((bptr = (char *)strstr(m->m_data, "27 Entering")) != NULL) { + /* + * Need to emulate the PASV response + */ + x = sscanf(bptr, "27 Entering Passive Mode (%u,%u,%u,%u,%u,%u)\r\n%256[^\177]", + &n1, &n2, &n3, &n4, &n5, &n6, buff); + if (x < 6) + return 1; + + laddr = htonl((n1 << 24) | (n2 << 16) | (n3 << 8) | (n4)); + lport = htons((n5 << 8) | (n6)); + + if ((so = tcp_listen(slirp, INADDR_ANY, 0, laddr, + lport, SS_FACCEPTONCE)) == NULL) { + return 1; + } + n6 = ntohs(so->so_fport); + + n5 = (n6 >> 8) & 0xff; + n6 &= 0xff; + + laddr = ntohl(so->so_faddr.s_addr); + + n1 = ((laddr >> 24) & 0xff); + n2 = ((laddr >> 16) & 0xff); + n3 = ((laddr >> 8) & 0xff); + n4 = (laddr & 0xff); + + m->m_len = bptr - m->m_data; /* Adjust length */ + m->m_len += snprintf(bptr, m->m_hdr.mh_size - m->m_len, + "27 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n%s", + n1, n2, n3, n4, n5, n6, x==7?buff:""); + + return 1; + } + + return 1; + + case EMU_KSH: + /* + * The kshell (Kerberos rsh) and shell services both pass + * a local port port number to carry signals to the server + * and stderr to the client. It is passed at the beginning + * of the connection as a NUL-terminated decimal ASCII string. + */ + so->so_emu = 0; + for (lport = 0, i = 0; i < m->m_len-1; ++i) { + if (m->m_data[i] < '0' || m->m_data[i] > '9') + return 1; /* invalid number */ + lport *= 10; + lport += m->m_data[i] - '0'; + } + if (m->m_data[m->m_len-1] == '\0' && lport != 0 && + (so = tcp_listen(slirp, INADDR_ANY, 0, so->so_laddr.s_addr, + htons(lport), SS_FACCEPTONCE)) != NULL) + m->m_len = snprintf(m->m_data, m->m_hdr.mh_size, "%d", + ntohs(so->so_fport)) + 1; + return 1; + + case EMU_IRC: + /* + * Need to emulate DCC CHAT, DCC SEND and DCC MOVE + */ + *(m->m_data+m->m_len) = 0; /* NULL terminate the string for strstr */ + if ((bptr = (char *)strstr(m->m_data, "DCC")) == NULL) + return 1; + + /* The %256s is for the broken mIRC */ + if (sscanf(bptr, "DCC CHAT %256s %u %u", buff, &laddr, &lport) == 3) { + if ((so = tcp_listen(slirp, INADDR_ANY, 0, + htonl(laddr), htons(lport), + SS_FACCEPTONCE)) == NULL) { + return 1; + } + m->m_len = bptr - m->m_data; /* Adjust length */ + m->m_len += snprintf(bptr, m->m_hdr.mh_size, + "DCC CHAT chat %lu %u%c\n", + (unsigned long)ntohl(so->so_faddr.s_addr), + ntohs(so->so_fport), 1); + } else if (sscanf(bptr, "DCC SEND %256s %u %u %u", buff, &laddr, &lport, &n1) == 4) { + if ((so = tcp_listen(slirp, INADDR_ANY, 0, + htonl(laddr), htons(lport), + SS_FACCEPTONCE)) == NULL) { + return 1; + } + m->m_len = bptr - m->m_data; /* Adjust length */ + m->m_len += snprintf(bptr, m->m_hdr.mh_size, + "DCC SEND %s %lu %u %u%c\n", buff, + (unsigned long)ntohl(so->so_faddr.s_addr), + ntohs(so->so_fport), n1, 1); + } else if (sscanf(bptr, "DCC MOVE %256s %u %u %u", buff, &laddr, &lport, &n1) == 4) { + if ((so = tcp_listen(slirp, INADDR_ANY, 0, + htonl(laddr), htons(lport), + SS_FACCEPTONCE)) == NULL) { + return 1; + } + m->m_len = bptr - m->m_data; /* Adjust length */ + m->m_len += snprintf(bptr, m->m_hdr.mh_size, + "DCC MOVE %s %lu %u %u%c\n", buff, + (unsigned long)ntohl(so->so_faddr.s_addr), + ntohs(so->so_fport), n1, 1); + } + return 1; + + case EMU_REALAUDIO: + /* + * RealAudio emulation - JP. We must try to parse the incoming + * data and try to find the two characters that contain the + * port number. Then we redirect an udp port and replace the + * number with the real port we got. + * + * The 1.0 beta versions of the player are not supported + * any more. + * + * A typical packet for player version 1.0 (release version): + * + * 0000:50 4E 41 00 05 + * 0000:00 01 00 02 1B D7 00 00 67 E6 6C DC 63 00 12 50 ........g.l.c..P + * 0010:4E 43 4C 49 45 4E 54 20 31 30 31 20 41 4C 50 48 NCLIENT 101 ALPH + * 0020:41 6C 00 00 52 00 17 72 61 66 69 6C 65 73 2F 76 Al..R..rafiles/v + * 0030:6F 61 2F 65 6E 67 6C 69 73 68 5F 2E 72 61 79 42 oa/english_.rayB + * + * Now the port number 0x1BD7 is found at offset 0x04 of the + * Now the port number 0x1BD7 is found at offset 0x04 of the + * second packet. This time we received five bytes first and + * then the rest. You never know how many bytes you get. + * + * A typical packet for player version 2.0 (beta): + * + * 0000:50 4E 41 00 06 00 02 00 00 00 01 00 02 1B C1 00 PNA............. + * 0010:00 67 75 78 F5 63 00 0A 57 69 6E 32 2E 30 2E 30 .gux.c..Win2.0.0 + * 0020:2E 35 6C 00 00 52 00 1C 72 61 66 69 6C 65 73 2F .5l..R..rafiles/ + * 0030:77 65 62 73 69 74 65 2F 32 30 72 65 6C 65 61 73 website/20releas + * 0040:65 2E 72 61 79 53 00 00 06 36 42 e.rayS...6B + * + * Port number 0x1BC1 is found at offset 0x0d. + * + * This is just a horrible switch statement. Variable ra tells + * us where we're going. + */ + + bptr = m->m_data; + while (bptr < m->m_data + m->m_len) { + u_short p; + static int ra = 0; + char ra_tbl[4]; + + ra_tbl[0] = 0x50; + ra_tbl[1] = 0x4e; + ra_tbl[2] = 0x41; + ra_tbl[3] = 0; + + switch (ra) { + case 0: + case 2: + case 3: + if (*bptr++ != ra_tbl[ra]) { + ra = 0; + continue; + } + break; + + case 1: + /* + * We may get 0x50 several times, ignore them + */ + if (*bptr == 0x50) { + ra = 1; + bptr++; + continue; + } else if (*bptr++ != ra_tbl[ra]) { + ra = 0; + continue; + } + break; + + case 4: + /* + * skip version number + */ + bptr++; + break; + + case 5: + /* + * The difference between versions 1.0 and + * 2.0 is here. For future versions of + * the player this may need to be modified. + */ + if (*(bptr + 1) == 0x02) + bptr += 8; + else + bptr += 4; + break; + + case 6: + /* This is the field containing the port + * number that RA-player is listening to. + */ + lport = (((u_char*)bptr)[0] << 8) + + ((u_char *)bptr)[1]; + if (lport < 6970) + lport += 256; /* don't know why */ + if (lport < 6970 || lport > 7170) + return 1; /* failed */ + + /* try to get udp port between 6970 - 7170 */ + for (p = 6970; p < 7071; p++) { + if (udp_listen(slirp, INADDR_ANY, + htons(p), + so->so_laddr.s_addr, + htons(lport), + SS_FACCEPTONCE)) { + break; + } + } + if (p == 7071) + p = 0; + *(u_char *)bptr++ = (p >> 8) & 0xff; + *(u_char *)bptr = p & 0xff; + ra = 0; + return 1; /* port redirected, we're done */ + break; + + default: + ra = 0; + } + ra++; + } + return 1; + + default: + /* Ooops, not emulated, won't call tcp_emu again */ + so->so_emu = 0; + return 1; + } +} + +/* + * Do misc. config of SLiRP while its running. + * Return 0 if this connections is to be closed, 1 otherwise, + * return 2 if this is a command-line connection + */ +int tcp_ctl(struct socket *so) +{ + Slirp *slirp = so->slirp; + struct sbuf *sb = &so->so_snd; + struct ex_list *ex_ptr; + int do_pty; + + DEBUG_CALL("tcp_ctl"); + DEBUG_ARG("so = %lx", (long )so); + + if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr) { + /* Check if it's pty_exec */ + for (ex_ptr = slirp->exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next) { + if (ex_ptr->ex_fport == so->so_fport && + so->so_faddr.s_addr == ex_ptr->ex_addr.s_addr) { + if (ex_ptr->ex_pty == 3) { + so->s = -1; + so->extra = (void *)ex_ptr->ex_exec; + return 1; + } + do_pty = ex_ptr->ex_pty; + DEBUG_MISC((dfd, " executing %s \n",ex_ptr->ex_exec)); + return fork_exec(so, ex_ptr->ex_exec, do_pty); + } + } + } + sb->sb_cc = + snprintf(sb->sb_wptr, sb->sb_datalen - (sb->sb_wptr - sb->sb_data), + "Error: No application configured.\r\n"); + sb->sb_wptr += sb->sb_cc; + return 0; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c new file mode 100644 index 0000000..1e6e051 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.c @@ -0,0 +1,292 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_timer.c 8.1 (Berkeley) 6/10/93 + * tcp_timer.c,v 1.2 1994/08/02 07:49:10 davidg Exp + */ + +#include "slirp.h" + +static struct tcpcb *tcp_timers(register struct tcpcb *tp, int timer); + +/* + * Fast timeout routine for processing delayed acks + */ +void +tcp_fasttimo(Slirp *slirp) +{ + register struct socket *so; + register struct tcpcb *tp; + + DEBUG_CALL("tcp_fasttimo"); + + so = slirp->tcb.so_next; + if (so) + for (; so != &slirp->tcb; so = so->so_next) + if ((tp = (struct tcpcb *)so->so_tcpcb) && + (tp->t_flags & TF_DELACK)) { + tp->t_flags &= ~TF_DELACK; + tp->t_flags |= TF_ACKNOW; + (void) tcp_output(tp); + } +} + +/* + * Tcp protocol timeout routine called every 500 ms. + * Updates the timers in all active tcb's and + * causes finite state machine actions if timers expire. + */ +void +tcp_slowtimo(Slirp *slirp) +{ + register struct socket *ip, *ipnxt; + register struct tcpcb *tp; + register int i; + + DEBUG_CALL("tcp_slowtimo"); + + /* + * Search through tcb's and update active timers. + */ + ip = slirp->tcb.so_next; + if (ip == NULL) { + return; + } + for (; ip != &slirp->tcb; ip = ipnxt) { + ipnxt = ip->so_next; + tp = sototcpcb(ip); + if (tp == NULL) { + continue; + } + for (i = 0; i < TCPT_NTIMERS; i++) { + if (tp->t_timer[i] && --tp->t_timer[i] == 0) { + tcp_timers(tp,i); + if (ipnxt->so_prev != ip) + goto tpgone; + } + } + tp->t_idle++; + if (tp->t_rtt) + tp->t_rtt++; +tpgone: + ; + } + slirp->tcp_iss += TCP_ISSINCR/PR_SLOWHZ; /* increment iss */ + slirp->tcp_now++; /* for timestamps */ +} + +/* + * Cancel all timers for TCP tp. + */ +void +tcp_canceltimers(struct tcpcb *tp) +{ + register int i; + + for (i = 0; i < TCPT_NTIMERS; i++) + tp->t_timer[i] = 0; +} + +const int tcp_backoff[TCP_MAXRXTSHIFT + 1] = + { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; + +/* + * TCP timer processing. + */ +static struct tcpcb * +tcp_timers(register struct tcpcb *tp, int timer) +{ + register int rexmt; + + DEBUG_CALL("tcp_timers"); + + switch (timer) { + + /* + * 2 MSL timeout in shutdown went off. If we're closed but + * still waiting for peer to close and connection has been idle + * too long, or if 2MSL time is up from TIME_WAIT, delete connection + * control block. Otherwise, check again in a bit. + */ + case TCPT_2MSL: + if (tp->t_state != TCPS_TIME_WAIT && + tp->t_idle <= TCP_MAXIDLE) + tp->t_timer[TCPT_2MSL] = TCPTV_KEEPINTVL; + else + tp = tcp_close(tp); + break; + + /* + * Retransmission timer went off. Message has not + * been acked within retransmit interval. Back off + * to a longer retransmit interval and retransmit one segment. + */ + case TCPT_REXMT: + + /* + * XXXXX If a packet has timed out, then remove all the queued + * packets for that session. + */ + + if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) { + /* + * This is a hack to suit our terminal server here at the uni of canberra + * since they have trouble with zeroes... It usually lets them through + * unharmed, but under some conditions, it'll eat the zeros. If we + * keep retransmitting it, it'll keep eating the zeroes, so we keep + * retransmitting, and eventually the connection dies... + * (this only happens on incoming data) + * + * So, if we were gonna drop the connection from too many retransmits, + * don't... instead halve the t_maxseg, which might break up the NULLs and + * let them through + * + * *sigh* + */ + + tp->t_maxseg >>= 1; + if (tp->t_maxseg < 32) { + /* + * We tried our best, now the connection must die! + */ + tp->t_rxtshift = TCP_MAXRXTSHIFT; + tp = tcp_drop(tp, tp->t_softerror); + /* tp->t_softerror : ETIMEDOUT); */ /* XXX */ + return (tp); /* XXX */ + } + + /* + * Set rxtshift to 6, which is still at the maximum + * backoff time + */ + tp->t_rxtshift = 6; + } + rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; + TCPT_RANGESET(tp->t_rxtcur, rexmt, + (short)tp->t_rttmin, TCPTV_REXMTMAX); /* XXX */ + tp->t_timer[TCPT_REXMT] = tp->t_rxtcur; + /* + * If losing, let the lower level know and try for + * a better route. Also, if we backed off this far, + * our srtt estimate is probably bogus. Clobber it + * so we'll take the next rtt measurement as our srtt; + * move the current srtt into rttvar to keep the current + * retransmit times until then. + */ + if (tp->t_rxtshift > TCP_MAXRXTSHIFT / 4) { + tp->t_rttvar += (tp->t_srtt >> TCP_RTT_SHIFT); + tp->t_srtt = 0; + } + tp->snd_nxt = tp->snd_una; + /* + * If timing a segment in this window, stop the timer. + */ + tp->t_rtt = 0; + /* + * Close the congestion window down to one segment + * (we'll open it by one segment for each ack we get). + * Since we probably have a window's worth of unacked + * data accumulated, this "slow start" keeps us from + * dumping all that data as back-to-back packets (which + * might overwhelm an intermediate gateway). + * + * There are two phases to the opening: Initially we + * open by one mss on each ack. This makes the window + * size increase exponentially with time. If the + * window is larger than the path can handle, this + * exponential growth results in dropped packet(s) + * almost immediately. To get more time between + * drops but still "push" the network to take advantage + * of improving conditions, we switch from exponential + * to linear window opening at some threshold size. + * For a threshold, we use half the current window + * size, truncated to a multiple of the mss. + * + * (the minimum cwnd that will give us exponential + * growth is 2 mss. We don't allow the threshold + * to go below this.) + */ + { + u_int win = min(tp->snd_wnd, tp->snd_cwnd) / 2 / tp->t_maxseg; + if (win < 2) + win = 2; + tp->snd_cwnd = tp->t_maxseg; + tp->snd_ssthresh = win * tp->t_maxseg; + tp->t_dupacks = 0; + } + (void) tcp_output(tp); + break; + + /* + * Persistence timer into zero window. + * Force a byte to be output, if possible. + */ + case TCPT_PERSIST: + tcp_setpersist(tp); + tp->t_force = 1; + (void) tcp_output(tp); + tp->t_force = 0; + break; + + /* + * Keep-alive timer went off; send something + * or drop connection if idle for too long. + */ + case TCPT_KEEP: + if (tp->t_state < TCPS_ESTABLISHED) + goto dropit; + + if ((SO_OPTIONS) && tp->t_state <= TCPS_CLOSE_WAIT) { + if (tp->t_idle >= TCPTV_KEEP_IDLE + TCP_MAXIDLE) + goto dropit; + /* + * Send a packet designed to force a response + * if the peer is up and reachable: + * either an ACK if the connection is still alive, + * or an RST if the peer has closed the connection + * due to timeout or reboot. + * Using sequence number tp->snd_una-1 + * causes the transmitted zero-length segment + * to lie outside the receive window; + * by the protocol spec, this requires the + * correspondent TCP to respond. + */ + tcp_respond(tp, &tp->t_template, (struct mbuf *)NULL, + tp->rcv_nxt, tp->snd_una - 1, 0); + tp->t_timer[TCPT_KEEP] = TCPTV_KEEPINTVL; + } else + tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_IDLE; + break; + + dropit: + tp = tcp_drop(tp, 0); + break; + } + + return (tp); +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h new file mode 100644 index 0000000..ff17914 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_timer.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_timer.h 8.1 (Berkeley) 6/10/93 + * tcp_timer.h,v 1.4 1994/08/21 05:27:38 paul Exp + */ + +#ifndef _TCP_TIMER_H_ +#define _TCP_TIMER_H_ + +/* + * Definitions of the TCP timers. These timers are counted + * down PR_SLOWHZ times a second. + */ +#define TCPT_NTIMERS 4 + +#define TCPT_REXMT 0 /* retransmit */ +#define TCPT_PERSIST 1 /* retransmit persistence */ +#define TCPT_KEEP 2 /* keep alive */ +#define TCPT_2MSL 3 /* 2*msl quiet time timer */ + +/* + * The TCPT_REXMT timer is used to force retransmissions. + * The TCP has the TCPT_REXMT timer set whenever segments + * have been sent for which ACKs are expected but not yet + * received. If an ACK is received which advances tp->snd_una, + * then the retransmit timer is cleared (if there are no more + * outstanding segments) or reset to the base value (if there + * are more ACKs expected). Whenever the retransmit timer goes off, + * we retransmit one unacknowledged segment, and do a backoff + * on the retransmit timer. + * + * The TCPT_PERSIST timer is used to keep window size information + * flowing even if the window goes shut. If all previous transmissions + * have been acknowledged (so that there are no retransmissions in progress), + * and the window is too small to bother sending anything, then we start + * the TCPT_PERSIST timer. When it expires, if the window is nonzero, + * we go to transmit state. Otherwise, at intervals send a single byte + * into the peer's window to force him to update our window information. + * We do this at most as often as TCPT_PERSMIN time intervals, + * but no more frequently than the current estimate of round-trip + * packet time. The TCPT_PERSIST timer is cleared whenever we receive + * a window update from the peer. + * + * The TCPT_KEEP timer is used to keep connections alive. If an + * connection is idle (no segments received) for TCPTV_KEEP_INIT amount of time, + * but not yet established, then we drop the connection. Once the connection + * is established, if the connection is idle for TCPTV_KEEP_IDLE time + * (and keepalives have been enabled on the socket), we begin to probe + * the connection. We force the peer to send us a segment by sending: + * <SEQ=SND.UNA-1><ACK=RCV.NXT><CTL=ACK> + * This segment is (deliberately) outside the window, and should elicit + * an ack segment in response from the peer. If, despite the TCPT_KEEP + * initiated segments we cannot elicit a response from a peer in TCPT_MAXIDLE + * amount of time probing, then we drop the connection. + */ + +/* + * Time constants. + */ +#define TCPTV_MSL ( 5*PR_SLOWHZ) /* max seg lifetime (hah!) */ + +#define TCPTV_SRTTBASE 0 /* base roundtrip time; + if 0, no idea yet */ +#define TCPTV_SRTTDFLT ( 3*PR_SLOWHZ) /* assumed RTT if no info */ + +#define TCPTV_PERSMIN ( 5*PR_SLOWHZ) /* retransmit persistence */ +#define TCPTV_PERSMAX ( 60*PR_SLOWHZ) /* maximum persist interval */ + +#define TCPTV_KEEP_INIT ( 75*PR_SLOWHZ) /* initial connect keep alive */ +#define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ) /* dflt time before probing */ +#define TCPTV_KEEPINTVL ( 75*PR_SLOWHZ) /* default probe interval */ +#define TCPTV_KEEPCNT 8 /* max probes before drop */ + +#define TCPTV_MIN ( 1*PR_SLOWHZ) /* minimum allowable value */ +#define TCPTV_REXMTMAX ( 12*PR_SLOWHZ) /* max allowable REXMT value */ + +#define TCP_LINGERTIME 120 /* linger at most 2 minutes */ + +#define TCP_MAXRXTSHIFT 12 /* maximum retransmits */ + + +/* + * Force a time value to be in a certain range. + */ +#define TCPT_RANGESET(tv, value, tvmin, tvmax) { \ + (tv) = (value); \ + if ((tv) < (tvmin)) \ + (tv) = (tvmin); \ + else if ((tv) > (tvmax)) \ + (tv) = (tvmax); \ +} + +extern const int tcp_backoff[]; + +struct tcpcb; + +void tcp_fasttimo(Slirp *); +void tcp_slowtimo(Slirp *); +void tcp_canceltimers(struct tcpcb *); + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h new file mode 100644 index 0000000..004193f --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcp_var.h @@ -0,0 +1,161 @@ +/* + * Copyright (c) 1982, 1986, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcp_var.h 8.3 (Berkeley) 4/10/94 + * tcp_var.h,v 1.3 1994/08/21 05:27:39 paul Exp + */ + +#ifndef _TCP_VAR_H_ +#define _TCP_VAR_H_ + +#include "tcpip.h" +#include "tcp_timer.h" + +/* + * Tcp control block, one per tcp; fields: + */ +struct tcpcb { + struct tcpiphdr *seg_next; /* sequencing queue */ + struct tcpiphdr *seg_prev; + short t_state; /* state of this connection */ + short t_timer[TCPT_NTIMERS]; /* tcp timers */ + short t_rxtshift; /* log(2) of rexmt exp. backoff */ + short t_rxtcur; /* current retransmit value */ + short t_dupacks; /* consecutive dup acks recd */ + u_short t_maxseg; /* maximum segment size */ + char t_force; /* 1 if forcing out a byte */ + u_short t_flags; +#define TF_ACKNOW 0x0001 /* ack peer immediately */ +#define TF_DELACK 0x0002 /* ack, but try to delay it */ +#define TF_NODELAY 0x0004 /* don't delay packets to coalesce */ +#define TF_NOOPT 0x0008 /* don't use tcp options */ +#define TF_SENTFIN 0x0010 /* have sent FIN */ +#define TF_REQ_SCALE 0x0020 /* have/will request window scaling */ +#define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */ +#define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */ +#define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */ +#define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */ + + struct tcpiphdr t_template; /* static skeletal packet for xmit */ + + struct socket *t_socket; /* back pointer to socket */ +/* + * The following fields are used as in the protocol specification. + * See RFC783, Dec. 1981, page 21. + */ +/* send sequence variables */ + tcp_seq snd_una; /* send unacknowledged */ + tcp_seq snd_nxt; /* send next */ + tcp_seq snd_up; /* send urgent pointer */ + tcp_seq snd_wl1; /* window update seg seq number */ + tcp_seq snd_wl2; /* window update seg ack number */ + tcp_seq iss; /* initial send sequence number */ + uint32_t snd_wnd; /* send window */ +/* receive sequence variables */ + uint32_t rcv_wnd; /* receive window */ + tcp_seq rcv_nxt; /* receive next */ + tcp_seq rcv_up; /* receive urgent pointer */ + tcp_seq irs; /* initial receive sequence number */ +/* + * Additional variables for this implementation. + */ +/* receive variables */ + tcp_seq rcv_adv; /* advertised window */ +/* retransmit variables */ + tcp_seq snd_max; /* highest sequence number sent; + * used to recognize retransmits + */ +/* congestion control (for slow start, source quench, retransmit after loss) */ + uint32_t snd_cwnd; /* congestion-controlled window */ + uint32_t snd_ssthresh; /* snd_cwnd size threshold for + * for slow start exponential to + * linear switch + */ +/* + * transmit timing stuff. See below for scale of srtt and rttvar. + * "Variance" is actually smoothed difference. + */ + short t_idle; /* inactivity time */ + short t_rtt; /* round trip time */ + tcp_seq t_rtseq; /* sequence number being timed */ + short t_srtt; /* smoothed round-trip time */ + short t_rttvar; /* variance in round-trip time */ + u_short t_rttmin; /* minimum rtt allowed */ + uint32_t max_sndwnd; /* largest window peer has offered */ + +/* out-of-band data */ + char t_oobflags; /* have some */ + char t_iobc; /* input character */ +#define TCPOOB_HAVEDATA 0x01 +#define TCPOOB_HADDATA 0x02 + short t_softerror; /* possible error not yet reported */ + +/* RFC 1323 variables */ + u_char snd_scale; /* window scaling for send window */ + u_char rcv_scale; /* window scaling for recv window */ + u_char request_r_scale; /* pending window scaling */ + u_char requested_s_scale; + uint32_t ts_recent; /* timestamp echo data */ + uint32_t ts_recent_age; /* when last updated */ + tcp_seq last_ack_sent; + +}; + +#define sototcpcb(so) ((so)->so_tcpcb) + +/* + * The smoothed round-trip time and estimated variance + * are stored as fixed point numbers scaled by the values below. + * For convenience, these scales are also used in smoothing the average + * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). + * With these scales, srtt has 3 bits to the right of the binary point, + * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the + * binary point, and is smoothed with an ALPHA of 0.75. + */ +#define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */ +#define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */ +#define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */ +#define TCP_RTTVAR_SHIFT 2 /* multiplier for rttvar; 2 bits */ + +/* + * The initial retransmission should happen at rtt + 4 * rttvar. + * Because of the way we do the smoothing, srtt and rttvar + * will each average +1/2 tick of bias. When we compute + * the retransmit timer, we want 1/2 tick of rounding and + * 1 extra tick because of +-1/2 tick uncertainty in the + * firing of the timer. The bias will give us exactly the + * 1.5 tick we need. But, because the bias is + * statistical, we have to test that we don't drop below + * the minimum feasible timer (which is 2 ticks). + * This macro assumes that the value of TCP_RTTVAR_SCALE + * is the same as the multiplier for rttvar. + */ +#define TCP_REXMTVAL(tp) \ + (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h new file mode 100644 index 0000000..7974ce3 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tcpip.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tcpip.h 8.1 (Berkeley) 6/10/93 + * tcpip.h,v 1.3 1994/08/21 05:27:40 paul Exp + */ + +#ifndef _TCPIP_H_ +#define _TCPIP_H_ + +/* + * Tcp+ip header, after ip options removed. + */ +struct tcpiphdr { + struct ipovly ti_i; /* overlaid ip structure */ + struct tcphdr ti_t; /* tcp header */ +}; +#define ti_mbuf ti_i.ih_mbuf.mptr +#define ti_x1 ti_i.ih_x1 +#define ti_pr ti_i.ih_pr +#define ti_len ti_i.ih_len +#define ti_src ti_i.ih_src +#define ti_dst ti_i.ih_dst +#define ti_sport ti_t.th_sport +#define ti_dport ti_t.th_dport +#define ti_seq ti_t.th_seq +#define ti_ack ti_t.th_ack +#define ti_x2 ti_t.th_x2 +#define ti_off ti_t.th_off +#define ti_flags ti_t.th_flags +#define ti_win ti_t.th_win +#define ti_sum ti_t.th_sum +#define ti_urp ti_t.th_urp + +#define tcpiphdr2qlink(T) ((struct qlink*)(((char*)(T)) - sizeof(struct qlink))) +#define qlink2tcpiphdr(Q) ((struct tcpiphdr*)(((char*)(Q)) + sizeof(struct qlink))) +#define tcpiphdr_next(T) qlink2tcpiphdr(tcpiphdr2qlink(T)->next) +#define tcpiphdr_prev(T) qlink2tcpiphdr(tcpiphdr2qlink(T)->prev) +#define tcpfrag_list_first(T) qlink2tcpiphdr((T)->seg_next) +#define tcpfrag_list_end(F, T) (tcpiphdr2qlink(F) == (struct qlink*)(T)) +#define tcpfrag_list_empty(T) ((T)->seg_next == (struct tcpiphdr*)(T)) + +/* + * Just a clean way to get to the first byte + * of the packet + */ +struct tcpiphdr_2 { + struct tcpiphdr dummy; + char first_char; +}; + +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h new file mode 100644 index 0000000..b9f0847 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/tftp.h @@ -0,0 +1,43 @@ +/* tftp defines */ + +#define TFTP_SESSIONS_MAX 3 + +#define TFTP_SERVER 69 + +#define TFTP_RRQ 1 +#define TFTP_WRQ 2 +#define TFTP_DATA 3 +#define TFTP_ACK 4 +#define TFTP_ERROR 5 +#define TFTP_OACK 6 + +#define TFTP_FILENAME_MAX 512 + +struct tftp_t { + struct ip ip; + struct udphdr udp; + uint16_t tp_op; + union { + struct { + uint16_t tp_block_nr; + uint8_t tp_buf[512]; + } tp_data; + struct { + uint16_t tp_error_code; + uint8_t tp_msg[512]; + } tp_error; + uint8_t tp_buf[512 + 2]; + } x; +}; + +struct tftp_session { + Slirp *slirp; + char *filename; + + struct in_addr client_ip; + uint16_t client_port; + + int timestamp; +}; + +void tftp_input(struct mbuf *m); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c new file mode 100644 index 0000000..2d04f12 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.c @@ -0,0 +1,386 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)udp_usrreq.c 8.4 (Berkeley) 1/21/94 + * udp_usrreq.c,v 1.4 1994/10/02 17:48:45 phk Exp + */ + +/* + * Changes and additions relating to SLiRP + * Copyright (c) 1995 Danny Gasparovski. + * + * Please read the file COPYRIGHT for the + * terms and conditions of the copyright. + */ + +#include "slirp.h" +#include "ip_icmp.h" + +static uint8_t udp_tos(struct socket *so); + +void +udp_init(Slirp *slirp) +{ + slirp->udb.so_next = slirp->udb.so_prev = &slirp->udb; + slirp->udp_last_so = &slirp->udb; +} +/* m->m_data points at ip packet header + * m->m_len length ip packet + * ip->ip_len length data (IPDU) + */ +void +udp_input(register struct mbuf *m, int iphlen) +{ + Slirp *slirp = m->slirp; + register struct ip *ip; + register struct udphdr *uh; + int len; + struct ip save_ip; + struct socket *so; + + DEBUG_CALL("udp_input"); + DEBUG_ARG("m = %lx", (long)m); + DEBUG_ARG("iphlen = %d", iphlen); + + /* + * Strip IP options, if any; should skip this, + * make available to user, and use on returned packets, + * but we don't yet have a way to check the checksum + * with options still present. + */ + if(iphlen > sizeof(struct ip)) { + ip_stripoptions(m, (struct mbuf *)0); + iphlen = sizeof(struct ip); + } + + /* + * Get IP and UDP header together in first mbuf. + */ + ip = mtod(m, struct ip *); + uh = (struct udphdr *)((caddr_t)ip + iphlen); + + /* + * Make mbuf data length reflect UDP length. + * If not enough data to reflect UDP length, drop. + */ + len = ntohs((uint16_t)uh->uh_ulen); + + if (ip->ip_len != len) { + if (len > ip->ip_len) { + goto bad; + } + m_adj(m, len - ip->ip_len); + ip->ip_len = len; + } + + /* + * Save a copy of the IP header in case we want restore it + * for sending an ICMP error message in response. + */ + save_ip = *ip; + save_ip.ip_len+= iphlen; /* tcp_input subtracts this */ + + /* + * Checksum extended UDP header and data. + */ + if (uh->uh_sum) { + memset(&((struct ipovly *)ip)->ih_mbuf, 0, sizeof(struct mbuf_ptr)); + ((struct ipovly *)ip)->ih_x1 = 0; + ((struct ipovly *)ip)->ih_len = uh->uh_ulen; + if(cksum(m, len + sizeof(struct ip))) { + goto bad; + } + } + + /* + * handle DHCP/BOOTP + */ + if (ntohs(uh->uh_dport) == BOOTP_SERVER) { + bootp_input(m); + goto bad; + } + + if (slirp->restricted) { + goto bad; + } + +#if 0 + /* + * handle TFTP + */ + if (ntohs(uh->uh_dport) == TFTP_SERVER) { + tftp_input(m); + goto bad; + } +#endif + + /* + * Locate pcb for datagram. + */ + so = slirp->udp_last_so; + if (so->so_lport != uh->uh_sport || + so->so_laddr.s_addr != ip->ip_src.s_addr) { + struct socket *tmp; + + for (tmp = slirp->udb.so_next; tmp != &slirp->udb; + tmp = tmp->so_next) { + if (tmp->so_lport == uh->uh_sport && + tmp->so_laddr.s_addr == ip->ip_src.s_addr) { + so = tmp; + break; + } + } + if (tmp == &slirp->udb) { + so = NULL; + } else { + slirp->udp_last_so = so; + } + } + + if (so == NULL) { + /* + * If there's no socket for this packet, + * create one + */ + so = socreate(slirp); + if (!so) { + goto bad; + } + if(udp_attach(so) == -1) { + DEBUG_MISC((dfd," udp_attach errno = %d-%s\n", + errno,strerror(errno))); + sofree(so); + goto bad; + } + + /* + * Setup fields + */ + so->so_laddr = ip->ip_src; + so->so_lport = uh->uh_sport; + + if ((so->so_iptos = udp_tos(so)) == 0) + so->so_iptos = ip->ip_tos; + + /* + * XXXXX Here, check if it's in udpexec_list, + * and if it is, do the fork_exec() etc. + */ + } + + so->so_faddr = ip->ip_dst; /* XXX */ + so->so_fport = uh->uh_dport; /* XXX */ + + iphlen += sizeof(struct udphdr); + m->m_len -= iphlen; + m->m_data += iphlen; + + /* + * Now we sendto() the packet. + */ + if(sosendto(so,m) == -1) { + m->m_len += iphlen; + m->m_data -= iphlen; + *ip=save_ip; + DEBUG_MISC((dfd,"udp tx errno = %d-%s\n",errno,strerror(errno))); + icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno)); + } + + m_free(so->so_m); /* used for ICMP if error on sorecvfrom */ + + /* restore the orig mbuf packet */ + m->m_len += iphlen; + m->m_data -= iphlen; + *ip=save_ip; + so->so_m=m; /* ICMP backup */ + + return; +bad: + m_freem(m); + return; +} + +int udp_output2(struct socket *so, struct mbuf *m, + struct sockaddr_in *saddr, struct sockaddr_in *daddr, + int iptos) +{ + register struct udpiphdr *ui; + int error = 0; + + DEBUG_CALL("udp_output"); + DEBUG_ARG("so = %lx", (long)so); + DEBUG_ARG("m = %lx", (long)m); + DEBUG_ARG("saddr = %lx", (long)saddr->sin_addr.s_addr); + DEBUG_ARG("daddr = %lx", (long)daddr->sin_addr.s_addr); + + /* + * Adjust for header + */ + m->m_data -= sizeof(struct udpiphdr); + m->m_len += sizeof(struct udpiphdr); + + /* + * Fill in mbuf with extended UDP header + * and addresses and length put into network format. + */ + ui = mtod(m, struct udpiphdr *); + memset(&ui->ui_i.ih_mbuf, 0 , sizeof(struct mbuf_ptr)); + ui->ui_x1 = 0; + ui->ui_pr = IPPROTO_UDP; + ui->ui_len = htons(m->m_len - sizeof(struct ip)); + /* XXXXX Check for from-one-location sockets, or from-any-location sockets */ + ui->ui_src = saddr->sin_addr; + ui->ui_dst = daddr->sin_addr; + ui->ui_sport = saddr->sin_port; + ui->ui_dport = daddr->sin_port; + ui->ui_ulen = ui->ui_len; + + /* + * Stuff checksum and output datagram. + */ + ui->ui_sum = 0; + if ((ui->ui_sum = cksum(m, m->m_len)) == 0) + ui->ui_sum = 0xffff; + ((struct ip *)ui)->ip_len = m->m_len; + + ((struct ip *)ui)->ip_ttl = IPDEFTTL; + ((struct ip *)ui)->ip_tos = iptos; + + error = ip_output(so, m); + + return (error); +} + +int udp_output(struct socket *so, struct mbuf *m, + struct sockaddr_in *addr) + +{ + Slirp *slirp = so->slirp; + struct sockaddr_in saddr, daddr; + + saddr = *addr; + if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) == + slirp->vnetwork_addr.s_addr) { + uint32_t inv_mask = ~slirp->vnetwork_mask.s_addr; + + if ((so->so_faddr.s_addr & inv_mask) == inv_mask) { + saddr.sin_addr = slirp->vhost_addr; + } else if (addr->sin_addr.s_addr == loopback_addr.s_addr || + so->so_faddr.s_addr != slirp->vhost_addr.s_addr) { + saddr.sin_addr = so->so_faddr; + } + } + daddr.sin_addr = so->so_laddr; + daddr.sin_port = so->so_lport; + + return udp_output2(so, m, &saddr, &daddr, so->so_iptos); +} + +int +udp_attach(struct socket *so) +{ + if((so->s = os_socket(AF_INET,SOCK_DGRAM,0)) != -1) { + so->so_expire = curtime + SO_EXPIRE; + insque(so, &so->slirp->udb); + } + return(so->s); +} + +void +udp_detach(struct socket *so) +{ + closesocket(so->s); + sofree(so); +} + +static const struct tos_t udptos[] = { + {0, 53, IPTOS_LOWDELAY, 0}, /* DNS */ + {0, 0, 0, 0} +}; + +static uint8_t +udp_tos(struct socket *so) +{ + int i = 0; + + while(udptos[i].tos) { + if ((udptos[i].fport && ntohs(so->so_fport) == udptos[i].fport) || + (udptos[i].lport && ntohs(so->so_lport) == udptos[i].lport)) { + so->so_emu = udptos[i].emu; + return udptos[i].tos; + } + i++; + } + + return 0; +} + +struct socket * +udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr, + u_int lport, int flags) +{ + struct sockaddr_in addr; + struct socket *so; + socklen_t addrlen = sizeof(struct sockaddr_in), opt = 1; + + so = socreate(slirp); + if (!so) { + return NULL; + } + so->s = os_socket(AF_INET,SOCK_DGRAM,0); + so->so_expire = curtime + SO_EXPIRE; + insque(so, &slirp->udb); + + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = haddr; + addr.sin_port = hport; + + if (bind(so->s,(struct sockaddr *)&addr, addrlen) < 0) { + udp_detach(so); + return NULL; + } + setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)); + + getsockname(so->s,(struct sockaddr *)&addr,&addrlen); + so->so_fport = addr.sin_port; + if (addr.sin_addr.s_addr == 0 || + addr.sin_addr.s_addr == loopback_addr.s_addr) { + so->so_faddr = slirp->vhost_addr; + } else { + so->so_faddr = addr.sin_addr; + } + so->so_lport = lport; + so->so_laddr.s_addr = laddr; + if (flags != SS_FACCEPTONCE) + so->so_expire = 0; + + so->so_state &= SS_PERSISTENT_MASK; + so->so_state |= SS_ISFCONNECTED | flags; + + return so; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h new file mode 100644 index 0000000..9b5c3cf --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/slirp/udp.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)udp.h 8.1 (Berkeley) 6/10/93 + * udp.h,v 1.3 1994/08/21 05:27:41 paul Exp + */ + +#ifndef _UDP_H_ +#define _UDP_H_ + +#define UDP_TTL 0x60 +#define UDP_UDPDATALEN 16192 + +/* + * Udp protocol header. + * Per RFC 768, September, 1981. + */ +struct udphdr { + uint16_t uh_sport; /* source port */ + uint16_t uh_dport; /* destination port */ + int16_t uh_ulen; /* udp length */ + uint16_t uh_sum; /* udp checksum */ +}; + +/* + * UDP kernel structures and variables. + */ +struct udpiphdr { + struct ipovly ui_i; /* overlaid ip structure */ + struct udphdr ui_u; /* udp header */ +}; +#define ui_mbuf ui_i.ih_mbuf.mptr +#define ui_x1 ui_i.ih_x1 +#define ui_pr ui_i.ih_pr +#define ui_len ui_i.ih_len +#define ui_src ui_i.ih_src +#define ui_dst ui_i.ih_dst +#define ui_sport ui_u.uh_sport +#define ui_dport ui_u.uh_dport +#define ui_ulen ui_u.uh_ulen +#define ui_sum ui_u.uh_sum + +/* + * Names for UDP sysctl objects + */ +#define UDPCTL_CHECKSUM 1 /* checksum UDP packets */ +#define UDPCTL_MAXID 2 + +struct mbuf; + +void udp_init(Slirp *); +void udp_input(register struct mbuf *, int); +int udp_output(struct socket *, struct mbuf *, struct sockaddr_in *); +int udp_attach(struct socket *); +void udp_detach(struct socket *); +struct socket * udp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int, + int); +int udp_output2(struct socket *so, struct mbuf *m, + struct sockaddr_in *saddr, struct sockaddr_in *daddr, + int iptos); +#endif diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c new file mode 100644 index 0000000..2a1aad0 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.c @@ -0,0 +1,87 @@ +/* + * SoftFP Library + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <string.h> + +#include "cutils.h" +#include "softfp.h" + +static inline int clz32(uint32_t a) +{ + int r; + if (a == 0) { + r = 32; + } else { + r = __builtin_clz(a); + } + return r; +} + +static inline int clz64(uint64_t a) +{ + int r; + if (a == 0) { + r = 64; + } else + { + r = __builtin_clzll(a); + } + return r; +} + +#ifdef HAVE_INT128 +static inline int clz128(uint128_t a) +{ + int r; + if (a == 0) { + r = 128; + } else + { + uint64_t ah, al; + ah = a >> 64; + al = a; + if (ah != 0) + r = __builtin_clzll(ah); + else + r = __builtin_clzll(al) + 64; + } + return r; +} +#endif + +#define F_SIZE 32 +#include "softfp_template.h" + +#define F_SIZE 64 +#include "softfp_template.h" + +#ifdef HAVE_INT128 + +#define F_SIZE 128 +#include "softfp_template.h" + +#endif + diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h new file mode 100644 index 0000000..974c7ec --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp.h @@ -0,0 +1,181 @@ +/* + * SoftFP Library + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef SOFTFP_H +#define SOFTFP_H + +#include <inttypes.h> +#include "cutils.h" + +typedef enum { + RM_RNE, /* Round to Nearest, ties to Even */ + RM_RTZ, /* Round towards Zero */ + RM_RDN, /* Round Down */ + RM_RUP, /* Round Up */ + RM_RMM, /* Round to Nearest, ties to Max Magnitude */ +} RoundingModeEnum; + +#define FFLAG_INVALID_OP (1 << 4) +#define FFLAG_DIVIDE_ZERO (1 << 3) +#define FFLAG_OVERFLOW (1 << 2) +#define FFLAG_UNDERFLOW (1 << 1) +#define FFLAG_INEXACT (1 << 0) + +#define FCLASS_NINF (1 << 0) +#define FCLASS_NNORMAL (1 << 1) +#define FCLASS_NSUBNORMAL (1 << 2) +#define FCLASS_NZERO (1 << 3) +#define FCLASS_PZERO (1 << 4) +#define FCLASS_PSUBNORMAL (1 << 5) +#define FCLASS_PNORMAL (1 << 6) +#define FCLASS_PINF (1 << 7) +#define FCLASS_SNAN (1 << 8) +#define FCLASS_QNAN (1 << 9) + +typedef enum { + FMINMAX_PROP, /* min(1, qNaN/sNaN) -> qNaN */ + FMINMAX_IEEE754_2008, /* min(1, qNaN) -> 1, min(1, sNaN) -> qNaN */ + FMINMAX_IEEE754_201X, /* min(1, qNaN/sNaN) -> 1 */ +} SoftFPMinMaxTypeEnum; + +typedef uint32_t sfloat32; +typedef uint64_t sfloat64; +#ifdef HAVE_INT128 +typedef uint128_t sfloat128; +#endif + +/* 32 bit floats */ + +#define FSIGN_MASK32 (1 << 31) + +sfloat32 add_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 sub_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 mul_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 div_sf32(sfloat32 a, sfloat32 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 sqrt_sf32(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 fma_sf32(sfloat32 a, sfloat32 b, sfloat32 c, RoundingModeEnum rm, uint32_t *pfflags); + +sfloat32 min_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type); +sfloat32 max_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type); +int eq_quiet_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags); +int le_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags); +int lt_sf32(sfloat32 a, sfloat32 b, uint32_t *pfflags); +uint32_t fclass_sf32(sfloat32 a); + +sfloat64 cvt_sf32_sf64(sfloat32 a, uint32_t *pfflags); +sfloat32 cvt_sf64_sf32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +int32_t cvt_sf32_i32(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +uint32_t cvt_sf32_u32(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +int64_t cvt_sf32_i64(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +uint64_t cvt_sf32_u64(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +#ifdef HAVE_INT128 +int128_t cvt_sf32_i128(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +uint128_t cvt_sf32_u128(sfloat32 a, RoundingModeEnum rm, uint32_t *pfflags); +#endif +sfloat32 cvt_i32_sf32(int32_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 cvt_u32_sf32(uint32_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 cvt_i64_sf32(int64_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 cvt_u64_sf32(uint64_t a, RoundingModeEnum rm, uint32_t *pfflags); +#ifdef HAVE_INT128 +sfloat32 cvt_i128_sf32(int128_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat32 cvt_u128_sf32(uint128_t a, RoundingModeEnum rm, uint32_t *pfflags); +#endif + +/* 64 bit floats */ + +#define FSIGN_MASK64 ((uint64_t)1 << 63) + +sfloat64 add_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 sub_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 mul_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 div_sf64(sfloat64 a, sfloat64 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 sqrt_sf64(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 fma_sf64(sfloat64 a, sfloat64 b, sfloat64 c, RoundingModeEnum rm, uint32_t *pfflags); + +sfloat64 min_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type); +sfloat64 max_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type); +int eq_quiet_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags); +int le_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags); +int lt_sf64(sfloat64 a, sfloat64 b, uint32_t *pfflags); +uint32_t fclass_sf64(sfloat64 a); + +sfloat64 cvt_sf32_sf64(sfloat32 a, uint32_t *pfflags); +sfloat32 cvt_sf64_sf32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +int32_t cvt_sf64_i32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +uint32_t cvt_sf64_u32(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +int64_t cvt_sf64_i64(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +uint64_t cvt_sf64_u64(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +#ifdef HAVE_INT128 +int128_t cvt_sf64_i128(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +uint128_t cvt_sf64_u128(sfloat64 a, RoundingModeEnum rm, uint32_t *pfflags); +#endif +sfloat64 cvt_i32_sf64(int32_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 cvt_u32_sf64(uint32_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 cvt_i64_sf64(int64_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 cvt_u64_sf64(uint64_t a, RoundingModeEnum rm, uint32_t *pfflags); +#ifdef HAVE_INT128 +sfloat64 cvt_i128_sf64(int128_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat64 cvt_u128_sf64(uint128_t a, RoundingModeEnum rm, uint32_t *pfflags); +#endif + +/* 128 bit floats */ + +#ifdef HAVE_INT128 + +#define FSIGN_MASK128 ((uint128_t)1 << 127) + +sfloat128 add_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 sub_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 mul_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 div_sf128(sfloat128 a, sfloat128 b, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 sqrt_sf128(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 fma_sf128(sfloat128 a, sfloat128 b, sfloat128 c, RoundingModeEnum rm, uint32_t *pfflags); + +sfloat128 min_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type); +sfloat128 max_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type); +int eq_quiet_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags); +int le_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags); +int lt_sf128(sfloat128 a, sfloat128 b, uint32_t *pfflags); +uint32_t fclass_sf128(sfloat128 a); + +sfloat128 cvt_sf32_sf128(sfloat32 a, uint32_t *pfflags); +sfloat32 cvt_sf128_sf32(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_sf64_sf128(sfloat64 a, uint32_t *pfflags); +sfloat64 cvt_sf128_sf64(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); + +int32_t cvt_sf128_i32(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +uint32_t cvt_sf128_u32(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +int64_t cvt_sf128_i64(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +uint64_t cvt_sf128_u64(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +int128_t cvt_sf128_i128(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +uint128_t cvt_sf128_u128(sfloat128 a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_i32_sf128(int32_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_u32_sf128(uint32_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_i64_sf128(int64_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_u64_sf128(uint64_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_i128_sf128(int128_t a, RoundingModeEnum rm, uint32_t *pfflags); +sfloat128 cvt_u128_sf128(uint128_t a, RoundingModeEnum rm, uint32_t *pfflags); + +#endif + +#endif /* SOFTFP_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h new file mode 100644 index 0000000..88dbf66 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template.h @@ -0,0 +1,1129 @@ +/* + * SoftFP Library + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#if F_SIZE == 32 +#define F_UINT uint32_t +#define F_ULONG uint64_t +#define MANT_SIZE 23 +#define EXP_SIZE 8 +#elif F_SIZE == 64 +#define F_UHALF uint32_t +#define F_UINT uint64_t +#ifdef HAVE_INT128 +#define F_ULONG uint128_t +#endif +#define MANT_SIZE 52 +#define EXP_SIZE 11 +#elif F_SIZE == 128 +#define F_UHALF uint64_t +#define F_UINT uint128_t +#define MANT_SIZE 112 +#define EXP_SIZE 15 +#else +#error unsupported F_SIZE +#endif + +#define EXP_MASK ((1 << EXP_SIZE) - 1) +#define MANT_MASK (((F_UINT)1 << MANT_SIZE) - 1) +#define SIGN_MASK ((F_UINT)1 << (F_SIZE - 1)) +#define IMANT_SIZE (F_SIZE - 2) /* internal mantissa size */ +#define RND_SIZE (IMANT_SIZE - MANT_SIZE) +#define QNAN_MASK ((F_UINT)1 << (MANT_SIZE - 1)) + +/* quiet NaN */ +#define F_QNAN glue(F_QNAN, F_SIZE) +#define clz glue(clz, F_SIZE) +#define pack_sf glue(pack_sf, F_SIZE) +#define unpack_sf glue(unpack_sf, F_SIZE) +#define rshift_rnd glue(rshift_rnd, F_SIZE) +#define round_pack_sf glue(roundpack_sf, F_SIZE) +#define normalize_sf glue(normalize_sf, F_SIZE) +#define normalize2_sf glue(normalize2_sf, F_SIZE) +#define issignan_sf glue(issignan_sf, F_SIZE) +#define isnan_sf glue(isnan_sf, F_SIZE) +#define add_sf glue(add_sf, F_SIZE) +#define mul_sf glue(mul_sf, F_SIZE) +#define fma_sf glue(fma_sf, F_SIZE) +#define div_sf glue(div_sf, F_SIZE) +#define sqrt_sf glue(sqrt_sf, F_SIZE) +#define normalize_subnormal_sf glue(normalize_subnormal_sf, F_SIZE) +#define divrem_u glue(divrem_u, F_SIZE) +#define sqrtrem_u glue(sqrtrem_u, F_SIZE) +#define mul_u glue(mul_u, F_SIZE) +#define cvt_sf32_sf glue(cvt_sf32_sf, F_SIZE) +#define cvt_sf64_sf glue(cvt_sf64_sf, F_SIZE) + +static const F_UINT F_QNAN = (((F_UINT)EXP_MASK << MANT_SIZE) | ((F_UINT)1 << (MANT_SIZE - 1))); + +static inline F_UINT pack_sf(uint32_t a_sign, uint32_t a_exp, F_UINT a_mant) +{ + return ((F_UINT)a_sign << (F_SIZE - 1)) | + ((F_UINT)a_exp << MANT_SIZE) | + (a_mant & MANT_MASK); +} + +static inline F_UINT unpack_sf(uint32_t *pa_sign, int32_t *pa_exp, + F_UINT a) +{ + *pa_sign = a >> (F_SIZE - 1); + *pa_exp = (a >> MANT_SIZE) & EXP_MASK; + return a & MANT_MASK; +} + +static F_UINT rshift_rnd(F_UINT a, int d) +{ + F_UINT mask; + if (d != 0) { + if (d >= F_SIZE) { + a = (a != 0); + } else { + mask = ((F_UINT)1 << d) - 1; + a = (a >> d) | ((a & mask) != 0); + } + } + return a; +} + +/* a_mant is considered to have its MSB at F_SIZE - 2 bits */ +static F_UINT round_pack_sf(uint32_t a_sign, int a_exp, F_UINT a_mant, + RoundingModeEnum rm, uint32_t *pfflags) +{ + int diff; + uint32_t addend, rnd_bits; + + switch(rm) { + case RM_RNE: + case RM_RMM: + addend = (1 << (RND_SIZE - 1)); + break; + case RM_RTZ: + addend = 0; + break; + default: + case RM_RDN: + case RM_RUP: + // printf("s=%d rm=%d m=%x\n", a_sign, rm, a_mant); + if (a_sign ^ (rm & 1)) + addend = (1 << RND_SIZE) - 1; + else + addend = 0; + break; + } + + /* potentially subnormal */ + if (a_exp <= 0) { + BOOL is_subnormal; + /* Note: we set the underflow flag if the rounded result + is subnormal and inexact */ + is_subnormal = (a_exp < 0 || + (a_mant + addend) < ((F_UINT)1 << (F_SIZE - 1))); + diff = 1 - a_exp; + a_mant = rshift_rnd(a_mant, diff); + rnd_bits = a_mant & ((1 << RND_SIZE ) - 1); + if (is_subnormal && rnd_bits != 0) { + *pfflags |= FFLAG_UNDERFLOW; + } + a_exp = 1; + } else { + rnd_bits = a_mant & ((1 << RND_SIZE ) - 1); + } + if (rnd_bits != 0) + *pfflags |= FFLAG_INEXACT; + a_mant = (a_mant + addend) >> RND_SIZE; + /* half way: select even result */ + if (rm == RM_RNE && rnd_bits == (1 << (RND_SIZE - 1))) + a_mant &= ~1; + /* Note the rounding adds at least 1, so this is the maximum + value */ + a_exp += a_mant >> (MANT_SIZE + 1); + if (a_mant <= MANT_MASK) { + /* denormalized or zero */ + a_exp = 0; + } else if (a_exp >= EXP_MASK) { + /* overflow */ + if (addend == 0) { + a_exp = EXP_MASK - 1; + a_mant = MANT_MASK; + } else { + /* infinity */ + a_exp = EXP_MASK; + a_mant = 0; + } + *pfflags |= FFLAG_OVERFLOW | FFLAG_INEXACT; + } + return pack_sf(a_sign, a_exp, a_mant); +} + +/* a_mant is considered to have at most F_SIZE - 1 bits */ +static F_UINT normalize_sf(uint32_t a_sign, int a_exp, F_UINT a_mant, + RoundingModeEnum rm, uint32_t *pfflags) +{ + int shift; + shift = clz(a_mant) - (F_SIZE - 1 - IMANT_SIZE); + assert(shift >= 0); + a_exp -= shift; + a_mant <<= shift; + return round_pack_sf(a_sign, a_exp, a_mant, rm, pfflags); +} + +/* same as normalize_sf() but with a double word mantissa. a_mant1 is + considered to have at most F_SIZE - 1 bits */ +static F_UINT normalize2_sf(uint32_t a_sign, int a_exp, F_UINT a_mant1, F_UINT a_mant0, + RoundingModeEnum rm, uint32_t *pfflags) +{ + int l, shift; + if (a_mant1 == 0) { + l = F_SIZE + clz(a_mant0); + } else { + l = clz(a_mant1); + } + shift = l - (F_SIZE - 1 - IMANT_SIZE); + assert(shift >= 0); + a_exp -= shift; + if (shift == 0) { + a_mant1 |= (a_mant0 != 0); + } else if (shift < F_SIZE) { + a_mant1 = (a_mant1 << shift) | (a_mant0 >> (F_SIZE - shift)); + a_mant0 <<= shift; + a_mant1 |= (a_mant0 != 0); + } else { + a_mant1 = a_mant0 << (shift - F_SIZE); + } + return round_pack_sf(a_sign, a_exp, a_mant1, rm, pfflags); +} + +BOOL issignan_sf(F_UINT a) +{ + uint32_t a_exp1; + F_UINT a_mant; + a_exp1 = (a >> (MANT_SIZE - 1)) & ((1 << (EXP_SIZE + 1)) - 1); + a_mant = a & MANT_MASK; + return (a_exp1 == (2 * EXP_MASK) && a_mant != 0); +} + +BOOL isnan_sf(F_UINT a) +{ + uint32_t a_exp; + F_UINT a_mant; + a_exp = (a >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + return (a_exp == EXP_MASK && a_mant != 0); +} + + +F_UINT add_sf(F_UINT a, F_UINT b, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign, b_sign, a_exp, b_exp; + F_UINT tmp, a_mant, b_mant; + + /* swap so that abs(a) >= abs(b) */ + if ((a & ~SIGN_MASK) < (b & ~SIGN_MASK)) { + tmp = a; + a = b; + b = tmp; + } + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + a_exp = (a >> MANT_SIZE) & EXP_MASK; + b_exp = (b >> MANT_SIZE) & EXP_MASK; + a_mant = (a & MANT_MASK) << 3; + b_mant = (b & MANT_MASK) << 3; + if (unlikely(a_exp == EXP_MASK)) { + if (a_mant != 0) { + /* NaN result */ + if (!(a_mant & (QNAN_MASK << 3)) || issignan_sf(b)) + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } else if (b_exp == EXP_MASK && a_sign != b_sign) { + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } else { + /* infinity */ + return a; + } + } + if (a_exp == 0) { + a_exp = 1; + } else { + a_mant |= (F_UINT)1 << (MANT_SIZE + 3); + } + if (b_exp == 0) { + b_exp = 1; + } else { + b_mant |= (F_UINT)1 << (MANT_SIZE + 3); + } + b_mant = rshift_rnd(b_mant, a_exp - b_exp); + if (a_sign == b_sign) { + /* same signs : add the absolute values */ + a_mant += b_mant; + } else { + /* different signs : subtract the absolute values */ + a_mant -= b_mant; + if (a_mant == 0) { + /* zero result : the sign needs a specific handling */ + a_sign = (rm == RM_RDN); + } + } + a_exp += (RND_SIZE - 3); + return normalize_sf(a_sign, a_exp, a_mant, rm, pfflags); +} + +F_UINT glue(sub_sf, F_SIZE)(F_UINT a, F_UINT b, RoundingModeEnum rm, + uint32_t *pfflags) +{ + return add_sf(a, b ^ SIGN_MASK, rm, pfflags); +} + +static inline F_UINT normalize_subnormal_sf(int32_t *pa_exp, F_UINT a_mant) +{ + int shift; + shift = MANT_SIZE - ((F_SIZE - 1 - clz(a_mant))); + *pa_exp = 1 - shift; + return a_mant << shift; +} + +#ifdef F_ULONG + +static F_UINT mul_u(F_UINT *plow, F_UINT a, F_UINT b) +{ + F_ULONG r; + r = (F_ULONG)a * (F_ULONG)b; + *plow = r; + return r >> F_SIZE; +} + +#else + +#define FH_SIZE (F_SIZE / 2) + +static F_UINT mul_u(F_UINT *plow, F_UINT a, F_UINT b) +{ + F_UHALF a0, a1, b0, b1, r0, r1, r2, r3; + F_UINT r00, r01, r10, r11, c; + a0 = a; + a1 = a >> FH_SIZE; + b0 = b; + b1 = b >> FH_SIZE; + + r00 = (F_UINT)a0 * (F_UINT)b0; + r01 = (F_UINT)a0 * (F_UINT)b1; + r10 = (F_UINT)a1 * (F_UINT)b0; + r11 = (F_UINT)a1 * (F_UINT)b1; + + r0 = r00; + c = (r00 >> FH_SIZE) + (F_UHALF)r01 + (F_UHALF)r10; + r1 = c; + c = (c >> FH_SIZE) + (r01 >> FH_SIZE) + (r10 >> FH_SIZE) + (F_UHALF)r11; + r2 = c; + r3 = (c >> FH_SIZE) + (r11 >> FH_SIZE); + + *plow = ((F_UINT)r1 << FH_SIZE) | r0; + return ((F_UINT)r3 << FH_SIZE) | r2; +} + +#undef FH_SIZE + +#endif + +F_UINT mul_sf(F_UINT a, F_UINT b, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign, b_sign, r_sign; + int32_t a_exp, b_exp, r_exp; + F_UINT a_mant, b_mant, r_mant, r_mant_low; + + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + r_sign = a_sign ^ b_sign; + a_exp = (a >> MANT_SIZE) & EXP_MASK; + b_exp = (b >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + b_mant = b & MANT_MASK; + if (a_exp == EXP_MASK || b_exp == EXP_MASK) { + if (isnan_sf(a) || isnan_sf(b)) { + if (issignan_sf(a) || issignan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else { + /* infinity */ + if ((a_exp == EXP_MASK && (b_exp == 0 && b_mant == 0)) || + (b_exp == EXP_MASK && (a_exp == 0 && a_mant == 0))) { + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } else { + return pack_sf(r_sign, EXP_MASK, 0); + } + } + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf(r_sign, 0, 0); /* zero */ + a_mant = normalize_subnormal_sf(&a_exp, a_mant); + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + if (b_exp == 0) { + if (b_mant == 0) + return pack_sf(r_sign, 0, 0); /* zero */ + b_mant = normalize_subnormal_sf(&b_exp, b_mant); + } else { + b_mant |= (F_UINT)1 << MANT_SIZE; + } + r_exp = a_exp + b_exp - (1 << (EXP_SIZE - 1)) + 2; + + r_mant = mul_u(&r_mant_low,a_mant << RND_SIZE, b_mant << (RND_SIZE + 1)); + r_mant |= (r_mant_low != 0); + return normalize_sf(r_sign, r_exp, r_mant, rm, pfflags); +} + +/* fused multiply and add */ +F_UINT fma_sf(F_UINT a, F_UINT b, F_UINT c, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign, b_sign, c_sign, r_sign; + int32_t a_exp, b_exp, c_exp, r_exp, shift; + F_UINT a_mant, b_mant, c_mant, r_mant1, r_mant0, c_mant1, c_mant0, mask; + + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + c_sign = c >> (F_SIZE - 1); + r_sign = a_sign ^ b_sign; + a_exp = (a >> MANT_SIZE) & EXP_MASK; + b_exp = (b >> MANT_SIZE) & EXP_MASK; + c_exp = (c >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + b_mant = b & MANT_MASK; + c_mant = c & MANT_MASK; + if (a_exp == EXP_MASK || b_exp == EXP_MASK || c_exp == EXP_MASK) { + if (isnan_sf(a) || isnan_sf(b) || isnan_sf(c)) { + if (issignan_sf(a) || issignan_sf(b) || issignan_sf(c)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else { + /* infinities */ + if ((a_exp == EXP_MASK && (b_exp == 0 && b_mant == 0)) || + (b_exp == EXP_MASK && (a_exp == 0 && a_mant == 0)) || + ((a_exp == EXP_MASK || b_exp == EXP_MASK) && + (c_exp == EXP_MASK && r_sign != c_sign))) { + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } else if (c_exp == EXP_MASK) { + return pack_sf(c_sign, EXP_MASK, 0); + } else { + return pack_sf(r_sign, EXP_MASK, 0); + } + } + } + if (a_exp == 0) { + if (a_mant == 0) + goto mul_zero; + a_mant = normalize_subnormal_sf(&a_exp, a_mant); + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + if (b_exp == 0) { + if (b_mant == 0) { + mul_zero: + if (c_exp == 0 && c_mant == 0) { + if (c_sign != r_sign) + r_sign = (rm == RM_RDN); + return pack_sf(r_sign, 0, 0); + } else { + return c; + } + } + b_mant = normalize_subnormal_sf(&b_exp, b_mant); + } else { + b_mant |= (F_UINT)1 << MANT_SIZE; + } + /* multiply */ + r_exp = a_exp + b_exp - (1 << (EXP_SIZE - 1)) + 3; + + r_mant1 = mul_u(&r_mant0, a_mant << RND_SIZE, b_mant << RND_SIZE); + /* normalize to F_SIZE - 3 */ + if (r_mant1 < ((F_UINT)1 << (F_SIZE - 3))) { + r_mant1 = (r_mant1 << 1) | (r_mant0 >> (F_SIZE - 1)); + r_mant0 <<= 1; + r_exp--; + } + + /* add */ + if (c_exp == 0) { + if (c_mant == 0) { + /* add zero */ + r_mant1 |= (r_mant0 != 0); + return normalize_sf(r_sign, r_exp, r_mant1, rm, pfflags); + } + c_mant = normalize_subnormal_sf(&c_exp, c_mant); + } else { + c_mant |= (F_UINT)1 << MANT_SIZE; + } + c_exp++; + c_mant1 = c_mant << (RND_SIZE - 1); + c_mant0 = 0; + + // printf("r_s=%d r_exp=%d r_mant=%08x %08x\n", r_sign, r_exp, (uint32_t)r_mant1, (uint32_t)r_mant0); + // printf("c_s=%d c_exp=%d c_mant=%08x %08x\n", c_sign, c_exp, (uint32_t)c_mant1, (uint32_t)c_mant0); + + /* ensure that abs(r) >= abs(c) */ + if (!(r_exp > c_exp || (r_exp == c_exp && r_mant1 >= c_mant1))) { + F_UINT tmp; + int32_t c_tmp; + /* swap */ + tmp = r_mant1; r_mant1 = c_mant1; c_mant1 = tmp; + tmp = r_mant0; r_mant0 = c_mant0; c_mant0 = tmp; + c_tmp = r_exp; r_exp = c_exp; c_exp = c_tmp; + c_tmp = r_sign; r_sign = c_sign; c_sign = c_tmp; + } + /* right shift c_mant */ + shift = r_exp - c_exp; + if (shift >= 2 * F_SIZE) { + c_mant0 = (c_mant0 | c_mant1) != 0; + c_mant1 = 0; + } else if (shift >= F_SIZE + 1) { + c_mant0 = rshift_rnd(c_mant1, shift - F_SIZE); + c_mant1 = 0; + } else if (shift == F_SIZE) { + c_mant0 = c_mant1 | (c_mant0 != 0); + c_mant1 = 0; + } else if (shift != 0) { + mask = ((F_UINT)1 << shift) - 1; + c_mant0 = (c_mant1 << (F_SIZE - shift)) | (c_mant0 >> shift) | ((c_mant0 & mask) != 0); + c_mant1 = c_mant1 >> shift; + } + // printf(" r_mant=%08x %08x\n", (uint32_t)r_mant1, (uint32_t)r_mant0); + // printf(" c_mant=%08x %08x\n", (uint32_t)c_mant1, (uint32_t)c_mant0); + /* add or subtract */ + if (r_sign == c_sign) { + r_mant0 += c_mant0; + r_mant1 += c_mant1 + (r_mant0 < c_mant0); + } else { + F_UINT tmp; + tmp = r_mant0; + r_mant0 -= c_mant0; + r_mant1 = r_mant1 - c_mant1 - (r_mant0 > tmp); + if ((r_mant0 | r_mant1) == 0) { + /* zero result : the sign needs a specific handling */ + r_sign = (rm == RM_RDN); + } + } +#if 0 + // printf(" r1_mant=%08x %08x\n", (uint32_t)r_mant1, (uint32_t)r_mant0); + /* normalize */ + if (r_mant1 == 0) { + r_mant1 = r_mant0; + r_exp -= F_SIZE; + } else { + shift = clz(r_mant1) - (F_SIZE - 1 - IMANT_SIZE); + if (shift != 0) { + r_mant1 = (r_mant1 << shift) | (r_mant0 >> (F_SIZE - shift)); + r_mant0 <<= shift; + r_exp -= shift; + } + r_mant1 |= (r_mant0 != 0); + } + return normalize_sf(r_sign, r_exp, r_mant1, rm, pfflags); +#else + return normalize2_sf(r_sign, r_exp, r_mant1, r_mant0, rm, pfflags); +#endif +} + +#ifdef F_ULONG + +static F_UINT divrem_u(F_UINT *pr, F_UINT ah, F_UINT al, F_UINT b) +{ + F_ULONG a; + a = ((F_ULONG)ah << F_SIZE) | al; + *pr = a % b; + return a / b; +} + +#else + +/* XXX: optimize */ +static F_UINT divrem_u(F_UINT *pr, F_UINT a1, F_UINT a0, F_UINT b) +{ + int i, qb, ab; + + assert(a1 < b); + for(i = 0; i < F_SIZE; i++) { + ab = a1 >> (F_SIZE - 1); + a1 = (a1 << 1) | (a0 >> (F_SIZE - 1)); + if (ab || a1 >= b) { + a1 -= b; + qb = 1; + } else { + qb = 0; + } + a0 = (a0 << 1) | qb; + } + *pr = a1; + return a0; +} + +#endif + +F_UINT div_sf(F_UINT a, F_UINT b, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign, b_sign, r_sign; + int32_t a_exp, b_exp, r_exp; + F_UINT a_mant, b_mant, r_mant, r; + + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + r_sign = a_sign ^ b_sign; + a_exp = (a >> MANT_SIZE) & EXP_MASK; + b_exp = (b >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + b_mant = b & MANT_MASK; + if (a_exp == EXP_MASK) { + if (a_mant != 0 || isnan_sf(b)) { + if (issignan_sf(a) || issignan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else if (b_exp == EXP_MASK) { + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } else { + return pack_sf(r_sign, EXP_MASK, 0); + } + } else if (b_exp == EXP_MASK) { + if (b_mant != 0) { + if (issignan_sf(a) || issignan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else { + return pack_sf(r_sign, 0, 0); + } + } + + if (b_exp == 0) { + if (b_mant == 0) { + /* zero */ + if (a_exp == 0 && a_mant == 0) { + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } else { + *pfflags |= FFLAG_DIVIDE_ZERO; + return pack_sf(r_sign, EXP_MASK, 0); + } + } + b_mant = normalize_subnormal_sf(&b_exp, b_mant); + } else { + b_mant |= (F_UINT)1 << MANT_SIZE; + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf(r_sign, 0, 0); /* zero */ + a_mant = normalize_subnormal_sf(&a_exp, a_mant); + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + r_exp = a_exp - b_exp + (1 << (EXP_SIZE - 1)) - 1; + r_mant = divrem_u(&r, a_mant, 0, b_mant << 2); + if (r != 0) + r_mant |= 1; + return normalize_sf(r_sign, r_exp, r_mant, rm, pfflags); +} + +#ifdef F_ULONG + +/* compute sqrt(a) with a = ah*2^F_SIZE+al and a < 2^(F_SIZE - 2) + return true if not exact square. */ +static int sqrtrem_u(F_UINT *pr, F_UINT ah, F_UINT al) +{ + F_ULONG a, u, s; + int l, inexact; + + /* 2^l >= a */ + if (ah != 0) { + l = 2 * F_SIZE - clz(ah - 1); + } else { + if (al == 0) { + *pr = 0; + return 0; + } + l = F_SIZE - clz(al - 1); + } + a = ((F_ULONG)ah << F_SIZE) | al; + u = (F_ULONG)1 << ((l + 1) / 2); + for(;;) { + s = u; + u = ((a / s) + s) / 2; + if (u >= s) + break; + } + inexact = (a - s * s) != 0; + *pr = s; + return inexact; +} + +#else + +static int sqrtrem_u(F_UINT *pr, F_UINT a1, F_UINT a0) +{ + int l, inexact; + F_UINT u, s, r, q, sq0, sq1; + + /* 2^l >= a */ + if (a1 != 0) { + l = 2 * F_SIZE - clz(a1 - 1); + } else { + if (a0 == 0) { + *pr = 0; + return 0; + } + l = F_SIZE - clz(a0 - 1); + } + u = (F_UINT)1 << ((l + 1) / 2); + for(;;) { + s = u; + q = divrem_u(&r, a1, a0, s); + u = (q + s) / 2; + if (u >= s) + break; + } + sq1 = mul_u(&sq0, s, s); + inexact = (sq0 != a0 || sq1 != a1); + *pr = s; + return inexact; +} + +#endif + +F_UINT sqrt_sf(F_UINT a, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + + a_sign = a >> (F_SIZE - 1); + a_exp = (a >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + if (a_exp == EXP_MASK) { + if (a_mant != 0) { + if (issignan_sf(a)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else if (a_sign) { + goto neg_error; + } else { + return a; /* +infinity */ + } + } + if (a_sign) { + if (a_exp == 0 && a_mant == 0) + return a; /* -zero */ + neg_error: + *pfflags |= FFLAG_INVALID_OP; + return F_QNAN; + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf(0, 0, 0); /* zero */ + a_mant = normalize_subnormal_sf(&a_exp, a_mant); + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + a_exp -= EXP_MASK / 2; + /* simpler to handle an even exponent */ + if (a_exp & 1) { + a_exp--; + a_mant <<= 1; + } + a_exp = (a_exp >> 1) + EXP_MASK / 2; + a_mant <<= (F_SIZE - 4 - MANT_SIZE); + if (sqrtrem_u(&a_mant, a_mant, 0)) + a_mant |= 1; + return normalize_sf(a_sign, a_exp, a_mant, rm, pfflags); +} + +/* comparisons */ + +static F_UINT glue(min_max_nan_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags, SoftFPMinMaxTypeEnum minmax_type) +{ + if (issignan_sf(a) || issignan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + if (minmax_type == FMINMAX_IEEE754_2008) + return F_QNAN; + } + if (minmax_type == FMINMAX_PROP) { + return F_QNAN; + } else { + if (isnan_sf(a)) { + if (isnan_sf(b)) + return F_QNAN; + else + return b; + } else { + return a; + } + } +} + +F_UINT glue(min_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags, + SoftFPMinMaxTypeEnum minmax_type) +{ + uint32_t a_sign, b_sign; + + if (isnan_sf(a) || isnan_sf(b)) { + return glue(min_max_nan_sf, F_SIZE)(a, b, pfflags, minmax_type); + } + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + + if (a_sign != b_sign) { + if (a_sign) + return a; + else + return b; + } else { + if ((a < b) ^ a_sign) + return a; + else + return b; + } +} + +F_UINT glue(max_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags, + SoftFPMinMaxTypeEnum minmax_type) +{ + uint32_t a_sign, b_sign; + + if (isnan_sf(a) || isnan_sf(b)) { + return glue(min_max_nan_sf, F_SIZE)(a, b, pfflags, minmax_type); + } + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + + if (a_sign != b_sign) { + if (a_sign) + return b; + else + return a; + } else { + if ((a < b) ^ a_sign) + return b; + else + return a; + } +} + +int glue(eq_quiet_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags) +{ + if (isnan_sf(a) || isnan_sf(b)) { + if (issignan_sf(a) || issignan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + } + return 0; + } + + if ((F_UINT)((a | b) << 1) == 0) + return 1; /* zero case */ + return (a == b); +} + +int glue(le_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags) +{ + uint32_t a_sign, b_sign; + + if (isnan_sf(a) || isnan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + return 0; + } + + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + if (a_sign != b_sign) { + return (a_sign || ((F_UINT)((a | b) << 1) == 0)); + } else { + if (a_sign) { + return (a >= b); + } else { + return (a <= b); + } + } +} + +int glue(lt_sf, F_SIZE)(F_UINT a, F_UINT b, uint32_t *pfflags) +{ + uint32_t a_sign, b_sign; + + if (isnan_sf(a) || isnan_sf(b)) { + *pfflags |= FFLAG_INVALID_OP; + return 0; + } + + a_sign = a >> (F_SIZE - 1); + b_sign = b >> (F_SIZE - 1); + if (a_sign != b_sign) { + return (a_sign && ((F_UINT)((a | b) << 1) != 0)); + } else { + if (a_sign) { + return (a > b); + } else { + return (a < b); + } + } +} + +uint32_t glue(fclass_sf, F_SIZE)(F_UINT a) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + uint32_t ret; + + a_sign = a >> (F_SIZE - 1); + a_exp = (a >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + if (a_exp == EXP_MASK) { + if (a_mant != 0) { + if (a_mant & QNAN_MASK) + ret = FCLASS_QNAN; + else + ret = FCLASS_SNAN; + } else { + if (a_sign) + ret = FCLASS_NINF; + else + ret = FCLASS_PINF; + } + } else if (a_exp == 0) { + if (a_mant == 0) { + if (a_sign) + ret = FCLASS_NZERO; + else + ret = FCLASS_PZERO; + } else { + if (a_sign) + ret = FCLASS_NSUBNORMAL; + else + ret = FCLASS_PSUBNORMAL; + } + } else { + if (a_sign) + ret = FCLASS_NNORMAL; + else + ret = FCLASS_PNORMAL; + } + return ret; +} + +/* conversions between floats */ + +#if F_SIZE >= 64 + +F_UINT cvt_sf32_sf(uint32_t a, uint32_t *pfflags) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + + a_mant = unpack_sf32(&a_sign, &a_exp, a); + if (a_exp == 0xff) { + if (a_mant != 0) { + /* NaN */ + if (issignan_sf32(a)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else { + /* infinity */ + return pack_sf(a_sign, EXP_MASK, 0); + } + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf(a_sign, 0, 0); /* zero */ + a_mant = normalize_subnormal_sf32(&a_exp, a_mant); + } + /* convert the exponent value */ + a_exp = a_exp - 0x7f + (EXP_MASK / 2); + /* shift the mantissa */ + a_mant <<= (MANT_SIZE - 23); + /* We assume the target float is large enough to that no + normalization is necessary */ + return pack_sf(a_sign, a_exp, a_mant); +} + +uint32_t glue(glue(cvt_sf, F_SIZE), _sf32)(F_UINT a, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + + a_mant = unpack_sf(&a_sign, &a_exp, a); + if (a_exp == EXP_MASK) { + if (a_mant != 0) { + /* NaN */ + if (issignan_sf(a)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN32; + } else { + /* infinity */ + return pack_sf32(a_sign, 0xff, 0); + } + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf32(a_sign, 0, 0); /* zero */ + normalize_subnormal_sf(&a_exp, a_mant); + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + /* convert the exponent value */ + a_exp = a_exp - (EXP_MASK / 2) + 0x7f; + /* shift the mantissa */ + a_mant = rshift_rnd(a_mant, MANT_SIZE - (32 - 2)); + return normalize_sf32(a_sign, a_exp, a_mant, rm, pfflags); +} + +#endif + +#if F_SIZE >= 128 + +F_UINT cvt_sf64_sf(uint64_t a, uint32_t *pfflags) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + + a_mant = unpack_sf64(&a_sign, &a_exp, a); + + if (a_exp == 0x7ff) { + if (a_mant != 0) { + /* NaN */ + if (issignan_sf64(a)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN; + } else { + /* infinity */ + return pack_sf(a_sign, EXP_MASK, 0); + } + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf(a_sign, 0, 0); /* zero */ + a_mant = normalize_subnormal_sf64(&a_exp, a_mant); + } + /* convert the exponent value */ + a_exp = a_exp - 0x3ff + (EXP_MASK / 2); + /* shift the mantissa */ + a_mant <<= (MANT_SIZE - 52); + return pack_sf(a_sign, a_exp, a_mant); +} + +uint64_t glue(glue(cvt_sf, F_SIZE), _sf64)(F_UINT a, RoundingModeEnum rm, + uint32_t *pfflags) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + + a_mant = unpack_sf(&a_sign, &a_exp, a); + if (a_exp == EXP_MASK) { + if (a_mant != 0) { + /* NaN */ + if (issignan_sf(a)) { + *pfflags |= FFLAG_INVALID_OP; + } + return F_QNAN64; + } else { + /* infinity */ + return pack_sf64(a_sign, 0x7ff, 0); + } + } + if (a_exp == 0) { + if (a_mant == 0) + return pack_sf64(a_sign, 0, 0); /* zero */ + normalize_subnormal_sf(&a_exp, a_mant); + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + /* convert the exponent value */ + a_exp = a_exp - (EXP_MASK / 2) + 0x3ff; + /* shift the mantissa */ + a_mant = rshift_rnd(a_mant, MANT_SIZE - (64 - 2)); + return normalize_sf64(a_sign, a_exp, a_mant, rm, pfflags); +} + +#endif + +#undef clz + +#define ICVT_SIZE 32 +#include "softfp_template_icvt.h" + +#define ICVT_SIZE 64 +#include "softfp_template_icvt.h" + +#ifdef HAVE_INT128 +#define ICVT_SIZE 128 +#include "softfp_template_icvt.h" +#endif + +#undef F_SIZE +#undef F_UINT +#undef F_ULONG +#undef F_UHALF +#undef MANT_SIZE +#undef EXP_SIZE +#undef EXP_MASK +#undef MANT_MASK +#undef SIGN_MASK +#undef IMANT_SIZE +#undef RND_SIZE +#undef QNAN_MASK +#undef F_QNAN + +#undef pack_sf +#undef unpack_sf +#undef rshift_rnd +#undef round_pack_sf +#undef normalize_sf +#undef normalize2_sf +#undef issignan_sf +#undef isnan_sf +#undef add_sf +#undef mul_sf +#undef fma_sf +#undef div_sf +#undef sqrt_sf +#undef normalize_subnormal_sf +#undef divrem_u +#undef sqrtrem_u +#undef mul_u +#undef cvt_sf32_sf +#undef cvt_sf64_sf diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h new file mode 100644 index 0000000..9360ac1 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/softfp_template_icvt.h @@ -0,0 +1,171 @@ +/* + * SoftFP Library + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#if ICVT_SIZE == 32 +#define ICVT_UINT uint32_t +#define ICVT_INT int32_t +#elif ICVT_SIZE == 64 +#define ICVT_UINT uint64_t +#define ICVT_INT int64_t +#elif ICVT_SIZE == 128 +#define ICVT_UINT uint128_t +#define ICVT_INT int128_t +#else +#error unsupported icvt +#endif + +/* conversions between float and integers */ +static ICVT_INT glue(glue(glue(internal_cvt_sf, F_SIZE), _i), ICVT_SIZE)(F_UINT a, RoundingModeEnum rm, + uint32_t *pfflags, BOOL is_unsigned) +{ + uint32_t a_sign, addend, rnd_bits; + int32_t a_exp; + F_UINT a_mant; + ICVT_UINT r, r_max; + + a_sign = a >> (F_SIZE - 1); + a_exp = (a >> MANT_SIZE) & EXP_MASK; + a_mant = a & MANT_MASK; + if (a_exp == EXP_MASK && a_mant != 0) + a_sign = 0; /* NaN is like +infinity */ + if (a_exp == 0) { + a_exp = 1; + } else { + a_mant |= (F_UINT)1 << MANT_SIZE; + } + a_mant <<= RND_SIZE; + a_exp = a_exp - (EXP_MASK / 2) - MANT_SIZE; + + if (is_unsigned) + r_max = (ICVT_UINT)a_sign - 1; + else + r_max = ((ICVT_UINT)1 << (ICVT_SIZE - 1)) - (ICVT_UINT)(a_sign ^ 1); + if (a_exp >= 0) { + if (a_exp <= (ICVT_SIZE - 1 - MANT_SIZE)) { + r = (ICVT_UINT)(a_mant >> RND_SIZE) << a_exp; + if (r > r_max) + goto overflow; + } else { + overflow: + *pfflags |= FFLAG_INVALID_OP; + return r_max; + } + } else { + a_mant = rshift_rnd(a_mant, -a_exp); + + switch(rm) { + case RM_RNE: + case RM_RMM: + addend = (1 << (RND_SIZE - 1)); + break; + case RM_RTZ: + addend = 0; + break; + default: + case RM_RDN: + case RM_RUP: + if (a_sign ^ (rm & 1)) + addend = (1 << RND_SIZE) - 1; + else + addend = 0; + break; + } + + rnd_bits = a_mant & ((1 << RND_SIZE ) - 1); + a_mant = (a_mant + addend) >> RND_SIZE; + /* half way: select even result */ + if (rm == RM_RNE && rnd_bits == (1 << (RND_SIZE - 1))) + a_mant &= ~1; + if (a_mant > r_max) + goto overflow; + r = a_mant; + if (rnd_bits != 0) + *pfflags |= FFLAG_INEXACT; + } + if (a_sign) + r = -r; + return r; +} + +ICVT_INT glue(glue(glue(cvt_sf, F_SIZE), _i), ICVT_SIZE)(F_UINT a, RoundingModeEnum rm, + uint32_t *pfflags) +{ + return glue(glue(glue(internal_cvt_sf, F_SIZE), _i), ICVT_SIZE)(a, rm, + pfflags, FALSE); +} + +ICVT_UINT glue(glue(glue(cvt_sf, F_SIZE), _u), ICVT_SIZE)(F_UINT a, RoundingModeEnum rm, + uint32_t *pfflags) +{ + return glue(glue(glue(internal_cvt_sf, F_SIZE), _i), ICVT_SIZE) (a, rm, + pfflags, TRUE); +} + +/* conversions between float and integers */ +static F_UINT glue(glue(glue(internal_cvt_i, ICVT_SIZE), _sf), F_SIZE)(ICVT_INT a, + RoundingModeEnum rm, + uint32_t *pfflags, + BOOL is_unsigned) +{ + uint32_t a_sign; + int32_t a_exp; + F_UINT a_mant; + ICVT_UINT r, mask; + int l; + + if (!is_unsigned && a < 0) { + a_sign = 1; + r = -(ICVT_UINT)a; + } else { + a_sign = 0; + r = a; + } + a_exp = (EXP_MASK / 2) + F_SIZE - 2; + /* need to reduce range before generic float normalization */ + l = ICVT_SIZE - glue(clz, ICVT_SIZE)(r) - (F_SIZE - 1); + if (l > 0) { + mask = r & (((ICVT_UINT)1 << l) - 1); + r = (r >> l) | ((r & mask) != 0); + a_exp += l; + } + a_mant = r; + return normalize_sf(a_sign, a_exp, a_mant, rm, pfflags); +} + +F_UINT glue(glue(glue(cvt_i, ICVT_SIZE), _sf), F_SIZE)(ICVT_INT a, + RoundingModeEnum rm, + uint32_t *pfflags) +{ + return glue(glue(glue(internal_cvt_i, ICVT_SIZE), _sf), F_SIZE)(a, rm, pfflags, FALSE); +} + +F_UINT glue(glue(glue(cvt_u, ICVT_SIZE), _sf), F_SIZE)(ICVT_UINT a, + RoundingModeEnum rm, + uint32_t *pfflags) +{ + return glue(glue(glue(internal_cvt_i, ICVT_SIZE), _sf), F_SIZE)(a, rm, pfflags, TRUE); +} + +#undef ICVT_SIZE +#undef ICVT_INT +#undef ICVT_UINT diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg Binary files differnew file mode 100755 index 0000000..8c2f617 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c new file mode 100644 index 0000000..3271290 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.c @@ -0,0 +1,102 @@ +/* + * Disk image splitter + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <inttypes.h> +#include <string.h> +#include <ctype.h> +#include <getopt.h> + +int main(int argc, char **argv) +{ + int blocksize, ret, i; + const char *infilename, *outpath; + FILE *f, *fo; + char buf1[1024]; + uint8_t *buf; + + if ((optind + 1) >= argc) { + printf("splitimg version " CONFIG_VERSION ", Copyright (c) 2011-2016 Fabrice Bellard\n" + "usage: splitimg infile outpath [blocksize]\n" + "Create a multi-file disk image for the RISCVEMU HTTP block device\n" + "\n" + "outpath must be a directory\n" + "blocksize is the block size in KB\n"); + exit(1); + } + + infilename = argv[optind++]; + outpath = argv[optind++]; + blocksize = 256; + if (optind < argc) + blocksize = strtol(argv[optind++], NULL, 0); + + blocksize *= 1024; + + buf = malloc(blocksize); + + f = fopen(infilename, "rb"); + if (!f) { + perror(infilename); + exit(1); + } + i = 0; + for(;;) { + ret = fread(buf, 1, blocksize, f); + if (ret < 0) { + perror("fread"); + exit(1); + } + if (ret == 0) + break; + if (ret < blocksize) { + printf("warning: last block is not full\n"); + memset(buf + ret, 0, blocksize - ret); + } + snprintf(buf1, sizeof(buf1), "%s/blk%09u.bin", outpath, i); + fo = fopen(buf1, "wb"); + if (!fo) { + perror(buf1); + exit(1); + } + fwrite(buf, 1, blocksize, fo); + fclose(fo); + i++; + } + fclose(f); + printf("%d blocks\n", i); + + snprintf(buf1, sizeof(buf1), "%s/blk.txt", outpath); + fo = fopen(buf1, "wb"); + if (!fo) { + perror(buf1); + exit(1); + } + fprintf(fo, "{\n"); + fprintf(fo, " block_size: %d,\n", blocksize / 1024); + fprintf(fo, " n_block: %d,\n", i); + fprintf(fo, "}\n"); + fclose(fo); + return 0; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d new file mode 100644 index 0000000..dddfe8d --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.d @@ -0,0 +1 @@ +splitimg.o: splitimg.c diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.o b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.o Binary files differnew file mode 100644 index 0000000..5b15ee4 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/splitimg.o diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/temu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/temu.c new file mode 100644 index 0000000..7c07f3b --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/temu.c @@ -0,0 +1,835 @@ +/* + * TinyEMU + * + * Copyright (c) 2016-2018 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <getopt.h> +#ifndef _WIN32 +#include <termios.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <linux/if_tun.h> +#endif +#include <sys/stat.h> +#include <signal.h> + +#include "cutils.h" +#include "iomem.h" +#include "virtio.h" +#include "machine.h" +#ifdef CONFIG_FS_NET +#include "fs_utils.h" +#include "fs_wget.h" +#endif +#ifdef CONFIG_SLIRP +#include "slirp/libslirp.h" +#endif + +#ifndef _WIN32 + +typedef struct { + int stdin_fd; + int console_esc_state; + BOOL resize_pending; +} STDIODevice; + +static struct termios oldtty; +static int old_fd0_flags; +static STDIODevice *global_stdio_device; + +static void term_exit(void) +{ + tcsetattr (0, TCSANOW, &oldtty); + fcntl(0, F_SETFL, old_fd0_flags); +} + +static void term_init(BOOL allow_ctrlc) +{ + struct termios tty; + + memset(&tty, 0, sizeof(tty)); + tcgetattr (0, &tty); + oldtty = tty; + old_fd0_flags = fcntl(0, F_GETFL); + + tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP + |INLCR|IGNCR|ICRNL|IXON); + tty.c_oflag |= OPOST; + tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN); + if (!allow_ctrlc) + tty.c_lflag &= ~ISIG; + tty.c_cflag &= ~(CSIZE|PARENB); + tty.c_cflag |= CS8; + tty.c_cc[VMIN] = 1; + tty.c_cc[VTIME] = 0; + + tcsetattr (0, TCSANOW, &tty); + + atexit(term_exit); +} + +static void console_write(void *opaque, const uint8_t *buf, int len) +{ + fwrite(buf, 1, len, stdout); + fflush(stdout); +} + +static int console_read(void *opaque, uint8_t *buf, int len) +{ + STDIODevice *s = opaque; + int ret, i, j; + uint8_t ch; + + if (len <= 0) + return 0; + + ret = read(s->stdin_fd, buf, len); + if (ret < 0) + return 0; + if (ret == 0) { + /* EOF */ + exit(1); + } + + j = 0; + for(i = 0; i < ret; i++) { + ch = buf[i]; + if (s->console_esc_state) { + s->console_esc_state = 0; + switch(ch) { + case 'x': + printf("Terminated\n"); + exit(0); + case 'h': + printf("\n" + "C-a h print this help\n" + "C-a x exit emulator\n" + "C-a C-a send C-a\n" + ); + break; + case 1: + goto output_char; + default: + break; + } + } else { + if (ch == 1) { + s->console_esc_state = 1; + } else { + output_char: + buf[j++] = ch; + } + } + } + return j; +} + +static void term_resize_handler(int sig) +{ + if (global_stdio_device) + global_stdio_device->resize_pending = TRUE; +} + +static void console_get_size(STDIODevice *s, int *pw, int *ph) +{ + struct winsize ws; + int width, height; + /* default values */ + width = 80; + height = 25; + if (ioctl(s->stdin_fd, TIOCGWINSZ, &ws) == 0 && + ws.ws_col >= 4 && ws.ws_row >= 4) { + width = ws.ws_col; + height = ws.ws_row; + } + *pw = width; + *ph = height; +} + +CharacterDevice *console_init(BOOL allow_ctrlc) +{ + CharacterDevice *dev; + STDIODevice *s; + struct sigaction sig; + + term_init(allow_ctrlc); + + dev = mallocz(sizeof(*dev)); + s = mallocz(sizeof(*s)); + s->stdin_fd = 0; + /* Note: the glibc does not properly tests the return value of + write() in printf, so some messages on stdout may be lost */ + fcntl(s->stdin_fd, F_SETFL, O_NONBLOCK); + + s->resize_pending = TRUE; + global_stdio_device = s; + + /* use a signal to get the host terminal resize events */ + sig.sa_handler = term_resize_handler; + sigemptyset(&sig.sa_mask); + sig.sa_flags = 0; + sigaction(SIGWINCH, &sig, NULL); + + dev->opaque = s; + dev->write_data = console_write; + dev->read_data = console_read; + return dev; +} + +#endif /* !_WIN32 */ + +typedef enum { + BF_MODE_RO, + BF_MODE_RW, + BF_MODE_SNAPSHOT, +} BlockDeviceModeEnum; + +#define SECTOR_SIZE 512 + +typedef struct BlockDeviceFile { + FILE *f; + int64_t nb_sectors; + BlockDeviceModeEnum mode; + uint8_t **sector_table; +} BlockDeviceFile; + +static int64_t bf_get_sector_count(BlockDevice *bs) +{ + BlockDeviceFile *bf = bs->opaque; + return bf->nb_sectors; +} + +//#define DUMP_BLOCK_READ + +static int bf_read_async(BlockDevice *bs, + uint64_t sector_num, uint8_t *buf, int n, + BlockDeviceCompletionFunc *cb, void *opaque) +{ + BlockDeviceFile *bf = bs->opaque; + // printf("bf_read_async: sector_num=%" PRId64 " n=%d\n", sector_num, n); +#ifdef DUMP_BLOCK_READ + { + static FILE *f; + if (!f) + f = fopen("/tmp/read_sect.txt", "wb"); + fprintf(f, "%" PRId64 " %d\n", sector_num, n); + } +#endif + if (!bf->f) + return -1; + if (bf->mode == BF_MODE_SNAPSHOT) { + int i; + for(i = 0; i < n; i++) { + if (!bf->sector_table[sector_num]) { + fseek(bf->f, sector_num * SECTOR_SIZE, SEEK_SET); + fread(buf, 1, SECTOR_SIZE, bf->f); + } else { + memcpy(buf, bf->sector_table[sector_num], SECTOR_SIZE); + } + sector_num++; + buf += SECTOR_SIZE; + } + } else { + fseek(bf->f, sector_num * SECTOR_SIZE, SEEK_SET); + fread(buf, 1, n * SECTOR_SIZE, bf->f); + } + /* synchronous read */ + return 0; +} + +static int bf_write_async(BlockDevice *bs, + uint64_t sector_num, const uint8_t *buf, int n, + BlockDeviceCompletionFunc *cb, void *opaque) +{ + BlockDeviceFile *bf = bs->opaque; + int ret; + + switch(bf->mode) { + case BF_MODE_RO: + ret = -1; /* error */ + break; + case BF_MODE_RW: + fseek(bf->f, sector_num * SECTOR_SIZE, SEEK_SET); + fwrite(buf, 1, n * SECTOR_SIZE, bf->f); + ret = 0; + break; + case BF_MODE_SNAPSHOT: + { + int i; + if ((sector_num + n) > bf->nb_sectors) + return -1; + for(i = 0; i < n; i++) { + if (!bf->sector_table[sector_num]) { + bf->sector_table[sector_num] = malloc(SECTOR_SIZE); + } + memcpy(bf->sector_table[sector_num], buf, SECTOR_SIZE); + sector_num++; + buf += SECTOR_SIZE; + } + ret = 0; + } + break; + default: + abort(); + } + + return ret; +} + +static BlockDevice *block_device_init(const char *filename, + BlockDeviceModeEnum mode) +{ + BlockDevice *bs; + BlockDeviceFile *bf; + int64_t file_size; + FILE *f; + const char *mode_str; + + if (mode == BF_MODE_RW) { + mode_str = "r+b"; + } else { + mode_str = "rb"; + } + + f = fopen(filename, mode_str); + if (!f) { + perror(filename); + exit(1); + } + fseek(f, 0, SEEK_END); + file_size = ftello(f); + + bs = mallocz(sizeof(*bs)); + bf = mallocz(sizeof(*bf)); + + bf->mode = mode; + bf->nb_sectors = file_size / 512; + bf->f = f; + + if (mode == BF_MODE_SNAPSHOT) { + bf->sector_table = mallocz(sizeof(bf->sector_table[0]) * + bf->nb_sectors); + } + + bs->opaque = bf; + bs->get_sector_count = bf_get_sector_count; + bs->read_async = bf_read_async; + bs->write_async = bf_write_async; + return bs; +} + +#ifndef _WIN32 + +typedef struct { + int fd; + BOOL select_filled; +} TunState; + +static void tun_write_packet(EthernetDevice *net, + const uint8_t *buf, int len) +{ + TunState *s = net->opaque; + write(s->fd, buf, len); +} + +static void tun_select_fill(EthernetDevice *net, int *pfd_max, + fd_set *rfds, fd_set *wfds, fd_set *efds, + int *pdelay) +{ + TunState *s = net->opaque; + int net_fd = s->fd; + + s->select_filled = net->device_can_write_packet(net); + if (s->select_filled) { + FD_SET(net_fd, rfds); + *pfd_max = max_int(*pfd_max, net_fd); + } +} + +static void tun_select_poll(EthernetDevice *net, + fd_set *rfds, fd_set *wfds, fd_set *efds, + int select_ret) +{ + TunState *s = net->opaque; + int net_fd = s->fd; + uint8_t buf[2048]; + int ret; + + if (select_ret <= 0) + return; + if (s->select_filled && FD_ISSET(net_fd, rfds)) { + ret = read(net_fd, buf, sizeof(buf)); + if (ret > 0) + net->device_write_packet(net, buf, ret); + } + +} + +/* configure with: +# bridge configuration (connect tap0 to bridge interface br0) + ip link add br0 type bridge + ip tuntap add dev tap0 mode tap [user x] [group x] + ip link set tap0 master br0 + ip link set dev br0 up + ip link set dev tap0 up + +# NAT configuration (eth1 is the interface connected to internet) + ifconfig br0 192.168.3.1 + echo 1 > /proc/sys/net/ipv4/ip_forward + iptables -D FORWARD 1 + iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE + + In the VM: + ifconfig eth0 192.168.3.2 + route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.3.1 +*/ +static EthernetDevice *tun_open(const char *ifname) +{ + struct ifreq ifr; + int fd, ret; + EthernetDevice *net; + TunState *s; + + fd = open("/dev/net/tun", O_RDWR); + if (fd < 0) { + fprintf(stderr, "Error: could not open /dev/net/tun\n"); + return NULL; + } + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TAP | IFF_NO_PI; + pstrcpy(ifr.ifr_name, sizeof(ifr.ifr_name), ifname); + ret = ioctl(fd, TUNSETIFF, (void *) &ifr); + if (ret != 0) { + fprintf(stderr, "Error: could not configure /dev/net/tun\n"); + close(fd); + return NULL; + } + fcntl(fd, F_SETFL, O_NONBLOCK); + + net = mallocz(sizeof(*net)); + net->mac_addr[0] = 0x02; + net->mac_addr[1] = 0x00; + net->mac_addr[2] = 0x00; + net->mac_addr[3] = 0x00; + net->mac_addr[4] = 0x00; + net->mac_addr[5] = 0x01; + s = mallocz(sizeof(*s)); + s->fd = fd; + net->opaque = s; + net->write_packet = tun_write_packet; + net->select_fill = tun_select_fill; + net->select_poll = tun_select_poll; + return net; +} + +#endif /* !_WIN32 */ + +#ifdef CONFIG_SLIRP + +/*******************************************************/ +/* slirp */ + +static Slirp *slirp_state; + +static void slirp_write_packet(EthernetDevice *net, + const uint8_t *buf, int len) +{ + Slirp *slirp_state = net->opaque; + slirp_input(slirp_state, buf, len); +} + +int slirp_can_output(void *opaque) +{ + EthernetDevice *net = opaque; + return net->device_can_write_packet(net); +} + +void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len) +{ + EthernetDevice *net = opaque; + return net->device_write_packet(net, pkt, pkt_len); +} + +static void slirp_select_fill1(EthernetDevice *net, int *pfd_max, + fd_set *rfds, fd_set *wfds, fd_set *efds, + int *pdelay) +{ + Slirp *slirp_state = net->opaque; + slirp_select_fill(slirp_state, pfd_max, rfds, wfds, efds); +} + +static void slirp_select_poll1(EthernetDevice *net, + fd_set *rfds, fd_set *wfds, fd_set *efds, + int select_ret) +{ + Slirp *slirp_state = net->opaque; + slirp_select_poll(slirp_state, rfds, wfds, efds, (select_ret <= 0)); +} + +static EthernetDevice *slirp_open(void) +{ + EthernetDevice *net; + struct in_addr net_addr = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */ + struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */ + struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */ + struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */ + struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */ + const char *bootfile = NULL; + const char *vhostname = NULL; + int restricted = 0; + + if (slirp_state) { + fprintf(stderr, "Only a single slirp instance is allowed\n"); + return NULL; + } + net = mallocz(sizeof(*net)); + + slirp_state = slirp_init(restricted, net_addr, mask, host, vhostname, + "", bootfile, dhcp, dns, net); + + net->mac_addr[0] = 0x02; + net->mac_addr[1] = 0x00; + net->mac_addr[2] = 0x00; + net->mac_addr[3] = 0x00; + net->mac_addr[4] = 0x00; + net->mac_addr[5] = 0x01; + net->opaque = slirp_state; + net->write_packet = slirp_write_packet; + net->select_fill = slirp_select_fill1; + net->select_poll = slirp_select_poll1; + + return net; +} + +#endif /* CONFIG_SLIRP */ + +#define MAX_EXEC_CYCLE 500000 +#define MAX_SLEEP_TIME 10 /* in ms */ + +void virt_machine_run(VirtMachine *m) +{ + fd_set rfds, wfds, efds; + int fd_max, ret, delay; + struct timeval tv; +#ifndef _WIN32 + int stdin_fd; +#endif + + delay = virt_machine_get_sleep_duration(m, MAX_SLEEP_TIME); + + /* wait for an event */ + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + fd_max = -1; +#ifndef _WIN32 + if (m->console_dev && virtio_console_can_write_data(m->console_dev)) { + STDIODevice *s = m->console->opaque; + stdin_fd = s->stdin_fd; + FD_SET(stdin_fd, &rfds); + fd_max = stdin_fd; + + if (s->resize_pending) { + int width, height; + console_get_size(s, &width, &height); + virtio_console_resize_event(m->console_dev, width, height); + s->resize_pending = FALSE; + } + } +#endif + if (m->net) { + m->net->select_fill(m->net, &fd_max, &rfds, &wfds, &efds, &delay); + } +#ifdef CONFIG_FS_NET + fs_net_set_fdset(&fd_max, &rfds, &wfds, &efds, &delay); +#endif + tv.tv_sec = delay / 1000; + tv.tv_usec = (delay % 1000) * 1000; + ret = select(fd_max + 1, &rfds, &wfds, &efds, &tv); + if (m->net) { + m->net->select_poll(m->net, &rfds, &wfds, &efds, ret); + } + if (ret > 0) { +#ifndef _WIN32 + if (m->console_dev && FD_ISSET(stdin_fd, &rfds)) { + uint8_t buf[128]; + int ret, len; + len = virtio_console_get_write_len(m->console_dev); + len = min_int(len, sizeof(buf)); + ret = m->console->read_data(m->console->opaque, buf, len); + if (ret > 0) { + virtio_console_write_data(m->console_dev, buf, ret); + } + } +#endif + } + +#ifdef CONFIG_SDL + sdl_refresh(m); +#endif + + virt_machine_interp(m, MAX_EXEC_CYCLE); +} + +/*******************************************************/ + +static struct option options[] = { + { "help", no_argument, NULL, 'h' }, + { "ctrlc", no_argument }, + { "rw", no_argument }, + { "ro", no_argument }, + { "append", required_argument }, + { "no-accel", no_argument }, + { "build-preload", required_argument }, + { NULL }, +}; + +void help(void) +{ + printf("temu version " CONFIG_VERSION ", Copyright (c) 2016-2018 Fabrice Bellard\n" + "usage: riscvemu [options] config_file\n" + "options are:\n" + "-m ram_size set the RAM size in MB\n" + "-rw allow write access to the disk image (default=snapshot)\n" + "-ctrlc the C-c key stops the emulator instead of being sent to the\n" + " emulated software\n" + "-append cmdline append cmdline to the kernel command line\n" + "-no-accel disable VM acceleration (KVM, x86 machine only)\n" + "\n" + "Console keys:\n" + "Press C-a x to exit the emulator, C-a h to get some help.\n"); + exit(1); +} + +#ifdef CONFIG_FS_NET +static BOOL net_completed; + +static void net_start_cb(void *arg) +{ + net_completed = TRUE; +} + +static BOOL net_poll_cb(void *arg) +{ + return net_completed; +} + +#endif + +int main(int argc, char **argv) +{ + VirtMachine *s; + const char *path, *cmdline, *build_preload_file; + int c, option_index, i, ram_size, accel_enable; + BOOL allow_ctrlc; + BlockDeviceModeEnum drive_mode; + VirtMachineParams p_s, *p = &p_s; + + ram_size = -1; + allow_ctrlc = FALSE; + (void)allow_ctrlc; + drive_mode = BF_MODE_SNAPSHOT; + accel_enable = -1; + cmdline = NULL; + build_preload_file = NULL; + for(;;) { + c = getopt_long_only(argc, argv, "hm:", options, &option_index); + if (c == -1) + break; + switch(c) { + case 0: + switch(option_index) { + case 1: /* ctrlc */ + allow_ctrlc = TRUE; + break; + case 2: /* rw */ + drive_mode = BF_MODE_RW; + break; + case 3: /* ro */ + drive_mode = BF_MODE_RO; + break; + case 4: /* append */ + cmdline = optarg; + break; + case 5: /* no-accel */ + accel_enable = FALSE; + break; + case 6: /* build-preload */ + build_preload_file = optarg; + break; + default: + fprintf(stderr, "unknown option index: %d\n", option_index); + exit(1); + } + break; + case 'h': + help(); + break; + case 'm': + ram_size = strtoul(optarg, NULL, 0); + break; + default: + exit(1); + } + } + + if (optind >= argc) { + help(); + } + + path = argv[optind++]; + + virt_machine_set_defaults(p); +#ifdef CONFIG_FS_NET + fs_wget_init(); +#endif + virt_machine_load_config_file(p, path, NULL, NULL); +#ifdef CONFIG_FS_NET + fs_net_event_loop(NULL, NULL); +#endif + + /* override some config parameters */ + + if (ram_size > 0) { + p->ram_size = (uint64_t)ram_size << 20; + } + if (accel_enable != -1) + p->accel_enable = accel_enable; + if (cmdline) { + vm_add_cmdline(p, cmdline); + } + + /* open the files & devices */ + for(i = 0; i < p->drive_count; i++) { + BlockDevice *drive; + char *fname; + fname = get_file_path(p->cfg_filename, p->tab_drive[i].filename); +#ifdef CONFIG_FS_NET + if (is_url(fname)) { + net_completed = FALSE; + drive = block_device_init_http(fname, 128 * 1024, + net_start_cb, NULL); + /* wait until the drive is initialized */ + fs_net_event_loop(net_poll_cb, NULL); + } else +#endif + { + drive = block_device_init(fname, drive_mode); + } + free(fname); + p->tab_drive[i].block_dev = drive; + } + + for(i = 0; i < p->fs_count; i++) { + FSDevice *fs; + const char *path; + path = p->tab_fs[i].filename; +#ifdef CONFIG_FS_NET + if (is_url(path)) { + fs = fs_net_init(path, NULL, NULL); + if (!fs) + exit(1); + if (build_preload_file) + fs_dump_cache_load(fs, build_preload_file); + fs_net_event_loop(NULL, NULL); + } else +#endif + { +#ifdef _WIN32 + fprintf(stderr, "Filesystem access not supported yet\n"); + exit(1); +#else + char *fname; + fname = get_file_path(p->cfg_filename, path); + fs = fs_disk_init(fname); + if (!fs) { + fprintf(stderr, "%s: must be a directory\n", fname); + exit(1); + } + free(fname); +#endif + } + p->tab_fs[i].fs_dev = fs; + } + + for(i = 0; i < p->eth_count; i++) { +#ifdef CONFIG_SLIRP + if (!strcmp(p->tab_eth[i].driver, "user")) { + p->tab_eth[i].net = slirp_open(); + if (!p->tab_eth[i].net) + exit(1); + } else +#endif +#ifndef _WIN32 + if (!strcmp(p->tab_eth[i].driver, "tap")) { + p->tab_eth[i].net = tun_open(p->tab_eth[i].ifname); + if (!p->tab_eth[i].net) + exit(1); + } else +#endif + { + fprintf(stderr, "Unsupported network driver '%s'\n", + p->tab_eth[i].driver); + exit(1); + } + } + +#ifdef CONFIG_SDL + if (p->display_device) { + sdl_init(p->width, p->height); + } else +#endif + { +#ifdef _WIN32 + fprintf(stderr, "Console not supported yet\n"); + exit(1); +#else + p->console = console_init(allow_ctrlc); +#endif + } + p->rtc_real_time = TRUE; + + s = virt_machine_init(p); + if (!s) + exit(1); + + virt_machine_free_config(p); + + if (s->net) { + s->net->device_set_carrier(s->net, TRUE); + } + + for(;;) { + virt_machine_run(s); + } + virt_machine_end(s); + return 0; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/vga.c b/jslinux-2019-12-21/tinyemu-2019-12-21/vga.c new file mode 100644 index 0000000..908a320 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/vga.c @@ -0,0 +1,804 @@ +/* + * Dummy VGA device + * + * Copyright (c) 2003-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "iomem.h" +#include "virtio.h" +#include "machine.h" + +//#define DEBUG_VBE + +#define MSR_COLOR_EMULATION 0x01 +#define MSR_PAGE_SELECT 0x20 + +#define ST01_V_RETRACE 0x08 +#define ST01_DISP_ENABLE 0x01 + +#define VBE_DISPI_INDEX_ID 0x0 +#define VBE_DISPI_INDEX_XRES 0x1 +#define VBE_DISPI_INDEX_YRES 0x2 +#define VBE_DISPI_INDEX_BPP 0x3 +#define VBE_DISPI_INDEX_ENABLE 0x4 +#define VBE_DISPI_INDEX_BANK 0x5 +#define VBE_DISPI_INDEX_VIRT_WIDTH 0x6 +#define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7 +#define VBE_DISPI_INDEX_X_OFFSET 0x8 +#define VBE_DISPI_INDEX_Y_OFFSET 0x9 +#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa +#define VBE_DISPI_INDEX_NB 0xb + +#define VBE_DISPI_ID0 0xB0C0 +#define VBE_DISPI_ID1 0xB0C1 +#define VBE_DISPI_ID2 0xB0C2 +#define VBE_DISPI_ID3 0xB0C3 +#define VBE_DISPI_ID4 0xB0C4 +#define VBE_DISPI_ID5 0xB0C5 + +#define VBE_DISPI_DISABLED 0x00 +#define VBE_DISPI_ENABLED 0x01 +#define VBE_DISPI_GETCAPS 0x02 +#define VBE_DISPI_8BIT_DAC 0x20 +#define VBE_DISPI_LFB_ENABLED 0x40 +#define VBE_DISPI_NOCLEARMEM 0x80 + +#define FB_ALLOC_ALIGN (1 << 20) + +#define MAX_TEXT_WIDTH 132 +#define MAX_TEXT_HEIGHT 60 + +struct VGAState { + FBDevice *fb_dev; + int fb_page_count; + PhysMemoryRange *mem_range; + PhysMemoryRange *mem_range2; + PCIDevice *pci_dev; + PhysMemoryRange *rom_range; + + uint8_t *vga_ram; /* 128K at 0xa0000 */ + + uint8_t sr_index; + uint8_t sr[8]; + uint8_t gr_index; + uint8_t gr[16]; + uint8_t ar_index; + uint8_t ar[21]; + int ar_flip_flop; + uint8_t cr_index; + uint8_t cr[256]; /* CRT registers */ + uint8_t msr; /* Misc Output Register */ + uint8_t fcr; /* Feature Control Register */ + uint8_t st00; /* status 0 */ + uint8_t st01; /* status 1 */ + uint8_t dac_state; + uint8_t dac_sub_index; + uint8_t dac_read_index; + uint8_t dac_write_index; + uint8_t dac_cache[3]; /* used when writing */ + uint8_t palette[768]; + + /* text mode state */ + uint32_t last_palette[16]; + uint16_t last_ch_attr[MAX_TEXT_WIDTH * MAX_TEXT_HEIGHT]; + uint32_t last_width; + uint32_t last_height; + uint16_t last_line_offset; + uint16_t last_start_addr; + uint16_t last_cursor_offset; + uint8_t last_cursor_start; + uint8_t last_cursor_end; + + /* VBE extension */ + uint16_t vbe_index; + uint16_t vbe_regs[VBE_DISPI_INDEX_NB]; +}; + +static void vga_draw_glyph8(uint8_t *d, int linesize, + const uint8_t *font_ptr, int h, + uint32_t fgcol, uint32_t bgcol) +{ + uint32_t font_data, xorcol; + + xorcol = bgcol ^ fgcol; + do { + font_data = font_ptr[0]; + ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol; + ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[2] = (-((font_data >> 5) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[3] = (-((font_data >> 4) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[4] = (-((font_data >> 3) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[5] = (-((font_data >> 2) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[6] = (-((font_data >> 1) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[7] = (-((font_data >> 0) & 1) & xorcol) ^ bgcol; + font_ptr++; + d += linesize; + } while (--h); +} + +static void vga_draw_glyph9(uint8_t *d, int linesize, + const uint8_t *font_ptr, int h, + uint32_t fgcol, uint32_t bgcol, + int dup9) +{ + uint32_t font_data, xorcol, v; + + xorcol = bgcol ^ fgcol; + do { + font_data = font_ptr[0]; + ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol; + ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[2] = (-((font_data >> 5) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[3] = (-((font_data >> 4) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[4] = (-((font_data >> 3) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[5] = (-((font_data >> 2) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[6] = (-((font_data >> 1) & 1) & xorcol) ^ bgcol; + v = (-((font_data >> 0) & 1) & xorcol) ^ bgcol; + ((uint32_t *)d)[7] = v; + if (dup9) + ((uint32_t *)d)[8] = v; + else + ((uint32_t *)d)[8] = bgcol; + font_ptr++; + d += linesize; + } while (--h); +} + +static const uint8_t cursor_glyph[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; + +static inline int c6_to_8(int v) +{ + int b; + v &= 0x3f; + b = v & 1; + return (v << 2) | (b << 1) | b; +} + +static int update_palette16(VGAState *s, uint32_t *palette) +{ + int full_update, i; + uint32_t v, col; + + full_update = 0; + for(i = 0; i < 16; i++) { + v = s->ar[i]; + if (s->ar[0x10] & 0x80) + v = ((s->ar[0x14] & 0xf) << 4) | (v & 0xf); + else + v = ((s->ar[0x14] & 0xc) << 4) | (v & 0x3f); + v = v * 3; + col = (c6_to_8(s->palette[v]) << 16) | + (c6_to_8(s->palette[v + 1]) << 8) | + c6_to_8(s->palette[v + 2]); + if (col != palette[i]) { + full_update = 1; + palette[i] = col; + } + } + return full_update; +} + +/* the text refresh is just for debugging and initial boot message, so + it is very incomplete */ +static void vga_text_refresh(VGAState *s, + SimpleFBDrawFunc *redraw_func, void *opaque) +{ + FBDevice *fb_dev = s->fb_dev; + int width, height, cwidth, cheight, cy, cx, x1, y1, width1, height1; + int cx_min, cx_max, dup9; + uint32_t ch_attr, line_offset, start_addr, ch_addr, ch_addr1, ch, cattr; + uint8_t *vga_ram, *font_ptr, *dst; + uint32_t fgcol, bgcol, cursor_offset, cursor_start, cursor_end; + BOOL full_update; + + full_update = update_palette16(s, s->last_palette); + + vga_ram = s->vga_ram; + + line_offset = s->cr[0x13]; + line_offset <<= 3; + line_offset >>= 1; + + start_addr = s->cr[0x0d] | (s->cr[0x0c] << 8); + + cheight = (s->cr[9] & 0x1f) + 1; + cwidth = 8; + if (!(s->sr[1] & 0x01)) + cwidth++; + + width = (s->cr[0x01] + 1); + height = s->cr[0x12] | + ((s->cr[0x07] & 0x02) << 7) | + ((s->cr[0x07] & 0x40) << 3); + height = (height + 1) / cheight; + + width1 = width * cwidth; + height1 = height * cheight; + if (fb_dev->width < width1 || fb_dev->height < height1 || + width > MAX_TEXT_WIDTH || height > MAX_TEXT_HEIGHT) + return; /* not enough space */ + if (s->last_line_offset != line_offset || + s->last_start_addr != start_addr || + s->last_width != width || + s->last_height != height) { + s->last_line_offset = line_offset; + s->last_start_addr = start_addr; + s->last_width = width; + s->last_height = height; + full_update = TRUE; + } + + /* update cursor position */ + cursor_offset = ((s->cr[0x0e] << 8) | s->cr[0x0f]) - start_addr; + cursor_start = s->cr[0xa]; + cursor_end = s->cr[0xb]; + if (cursor_offset != s->last_cursor_offset || + cursor_start != s->last_cursor_start || + cursor_end != s->last_cursor_end) { + /* force refresh of characters with the cursor */ + if (s->last_cursor_offset < MAX_TEXT_WIDTH * MAX_TEXT_HEIGHT) + s->last_ch_attr[s->last_cursor_offset] = -1; + if (cursor_offset < MAX_TEXT_WIDTH * MAX_TEXT_HEIGHT) + s->last_ch_attr[cursor_offset] = -1; + s->last_cursor_offset = cursor_offset; + s->last_cursor_start = cursor_start; + s->last_cursor_end = cursor_end; + } + + ch_addr1 = 0x18000 + (start_addr * 2); + cursor_offset = 0x18000 + (start_addr + cursor_offset) * 2; + + x1 = (fb_dev->width - width1) / 2; + y1 = (fb_dev->height - height1) / 2; +#if 0 + printf("text refresh %dx%d font=%dx%d start_addr=0x%x line_offset=0x%x\n", + width, height, cwidth, cheight, start_addr, line_offset); +#endif + for(cy = 0; cy < height; cy++) { + ch_addr = ch_addr1; + dst = fb_dev->fb_data + (y1 + cy * cheight) * fb_dev->stride + x1 * 4; + cx_min = width; + cx_max = -1; + for(cx = 0; cx < width; cx++) { + ch_attr = *(uint16_t *)(vga_ram + (ch_addr & 0x1fffe)); + if (full_update || ch_attr != s->last_ch_attr[cy * width + cx]) { + s->last_ch_attr[cy * width + cx] = ch_attr; + cx_min = min_int(cx_min, cx); + cx_max = max_int(cx_max, cx); + ch = ch_attr & 0xff; + cattr = ch_attr >> 8; + font_ptr = vga_ram + 32 * ch; + bgcol = s->last_palette[cattr >> 4]; + fgcol = s->last_palette[cattr & 0x0f]; + if (cwidth == 8) { + vga_draw_glyph8(dst, fb_dev->stride, font_ptr, cheight, + fgcol, bgcol); + } else { + dup9 = 0; + if (ch >= 0xb0 && ch <= 0xdf && (s->ar[0x10] & 0x04)) + dup9 = 1; + vga_draw_glyph9(dst, fb_dev->stride, font_ptr, cheight, + fgcol, bgcol, dup9); + } + /* cursor display */ + if (cursor_offset == ch_addr && !(cursor_start & 0x20)) { + int line_start, line_last, h; + uint8_t *dst1; + line_start = cursor_start & 0x1f; + line_last = min_int(cursor_end & 0x1f, cheight - 1); + + if (line_last >= line_start && line_start < cheight) { + h = line_last - line_start + 1; + dst1 = dst + fb_dev->stride * line_start; + if (cwidth == 8) { + vga_draw_glyph8(dst1, fb_dev->stride, + cursor_glyph, + h, fgcol, bgcol); + } else { + vga_draw_glyph9(dst1, fb_dev->stride, + cursor_glyph, + h, fgcol, bgcol, 1); + } + } + } + } + ch_addr += 2; + dst += 4 * cwidth; + } + if (cx_max >= cx_min) { + // printf("redraw %d %d %d\n", cy, cx_min, cx_max); + redraw_func(fb_dev, opaque, + x1 + cx_min * cwidth, y1 + cy * cheight, + (cx_max - cx_min + 1) * cwidth, cheight); + } + ch_addr1 += line_offset; + } +} + +static void vga_refresh(FBDevice *fb_dev, + SimpleFBDrawFunc *redraw_func, void *opaque) +{ + VGAState *s = fb_dev->device_opaque; + + if (!(s->ar_index & 0x20)) { + /* blank */ + } else if (s->gr[0x06] & 1) { + /* graphic mode (VBE) */ + simplefb_refresh(fb_dev, redraw_func, opaque, s->mem_range, s->fb_page_count); + } else { + /* text mode */ + vga_text_refresh(s, redraw_func, opaque); + } +} + +/* force some bits to zero */ +static const uint8_t sr_mask[8] = { + (uint8_t)~0xfc, + (uint8_t)~0xc2, + (uint8_t)~0xf0, + (uint8_t)~0xc0, + (uint8_t)~0xf1, + (uint8_t)~0xff, + (uint8_t)~0xff, + (uint8_t)~0x00, +}; + +static const uint8_t gr_mask[16] = { + (uint8_t)~0xf0, /* 0x00 */ + (uint8_t)~0xf0, /* 0x01 */ + (uint8_t)~0xf0, /* 0x02 */ + (uint8_t)~0xe0, /* 0x03 */ + (uint8_t)~0xfc, /* 0x04 */ + (uint8_t)~0x84, /* 0x05 */ + (uint8_t)~0xf0, /* 0x06 */ + (uint8_t)~0xf0, /* 0x07 */ + (uint8_t)~0x00, /* 0x08 */ + (uint8_t)~0xff, /* 0x09 */ + (uint8_t)~0xff, /* 0x0a */ + (uint8_t)~0xff, /* 0x0b */ + (uint8_t)~0xff, /* 0x0c */ + (uint8_t)~0xff, /* 0x0d */ + (uint8_t)~0xff, /* 0x0e */ + (uint8_t)~0xff, /* 0x0f */ +}; + +static uint32_t vga_ioport_read(VGAState *s, uint32_t addr) +{ + int val, index; + + /* check port range access depending on color/monochrome mode */ + if ((addr >= 0x3b0 && addr <= 0x3bf && (s->msr & MSR_COLOR_EMULATION)) || + (addr >= 0x3d0 && addr <= 0x3df && !(s->msr & MSR_COLOR_EMULATION))) { + val = 0xff; + } else { + switch(addr) { + case 0x3c0: + if (s->ar_flip_flop == 0) { + val = s->ar_index; + } else { + val = 0; + } + break; + case 0x3c1: + index = s->ar_index & 0x1f; + if (index < 21) + val = s->ar[index]; + else + val = 0; + break; + case 0x3c2: + val = s->st00; + break; + case 0x3c4: + val = s->sr_index; + break; + case 0x3c5: + val = s->sr[s->sr_index]; +#ifdef DEBUG_VGA_REG + printf("vga: read SR%x = 0x%02x\n", s->sr_index, val); +#endif + break; + case 0x3c7: + val = s->dac_state; + break; + case 0x3c8: + val = s->dac_write_index; + break; + case 0x3c9: + val = s->palette[s->dac_read_index * 3 + s->dac_sub_index]; + if (++s->dac_sub_index == 3) { + s->dac_sub_index = 0; + s->dac_read_index++; + } + break; + case 0x3ca: + val = s->fcr; + break; + case 0x3cc: + val = s->msr; + break; + case 0x3ce: + val = s->gr_index; + break; + case 0x3cf: + val = s->gr[s->gr_index]; +#ifdef DEBUG_VGA_REG + printf("vga: read GR%x = 0x%02x\n", s->gr_index, val); +#endif + break; + case 0x3b4: + case 0x3d4: + val = s->cr_index; + break; + case 0x3b5: + case 0x3d5: + val = s->cr[s->cr_index]; +#ifdef DEBUG_VGA_REG + printf("vga: read CR%x = 0x%02x\n", s->cr_index, val); +#endif + break; + case 0x3ba: + case 0x3da: + /* just toggle to fool polling */ + s->st01 ^= ST01_V_RETRACE | ST01_DISP_ENABLE; + val = s->st01; + s->ar_flip_flop = 0; + break; + default: + val = 0x00; + break; + } + } +#if defined(DEBUG_VGA) + printf("VGA: read addr=0x%04x data=0x%02x\n", addr, val); +#endif + return val; +} + +static void vga_ioport_write(VGAState *s, uint32_t addr, uint32_t val) +{ + int index; + + /* check port range access depending on color/monochrome mode */ + if ((addr >= 0x3b0 && addr <= 0x3bf && (s->msr & MSR_COLOR_EMULATION)) || + (addr >= 0x3d0 && addr <= 0x3df && !(s->msr & MSR_COLOR_EMULATION))) + return; + +#ifdef DEBUG_VGA + printf("VGA: write addr=0x%04x data=0x%02x\n", addr, val); +#endif + + switch(addr) { + case 0x3c0: + if (s->ar_flip_flop == 0) { + val &= 0x3f; + s->ar_index = val; + } else { + index = s->ar_index & 0x1f; + switch(index) { + case 0x00 ... 0x0f: + s->ar[index] = val & 0x3f; + break; + case 0x10: + s->ar[index] = val & ~0x10; + break; + case 0x11: + s->ar[index] = val; + break; + case 0x12: + s->ar[index] = val & ~0xc0; + break; + case 0x13: + s->ar[index] = val & ~0xf0; + break; + case 0x14: + s->ar[index] = val & ~0xf0; + break; + default: + break; + } + } + s->ar_flip_flop ^= 1; + break; + case 0x3c2: + s->msr = val & ~0x10; + break; + case 0x3c4: + s->sr_index = val & 7; + break; + case 0x3c5: +#ifdef DEBUG_VGA_REG + printf("vga: write SR%x = 0x%02x\n", s->sr_index, val); +#endif + s->sr[s->sr_index] = val & sr_mask[s->sr_index]; + break; + case 0x3c7: + s->dac_read_index = val; + s->dac_sub_index = 0; + s->dac_state = 3; + break; + case 0x3c8: + s->dac_write_index = val; + s->dac_sub_index = 0; + s->dac_state = 0; + break; + case 0x3c9: + s->dac_cache[s->dac_sub_index] = val; + if (++s->dac_sub_index == 3) { + memcpy(&s->palette[s->dac_write_index * 3], s->dac_cache, 3); + s->dac_sub_index = 0; + s->dac_write_index++; + } + break; + case 0x3ce: + s->gr_index = val & 0x0f; + break; + case 0x3cf: +#ifdef DEBUG_VGA_REG + printf("vga: write GR%x = 0x%02x\n", s->gr_index, val); +#endif + s->gr[s->gr_index] = val & gr_mask[s->gr_index]; + break; + case 0x3b4: + case 0x3d4: + s->cr_index = val; + break; + case 0x3b5: + case 0x3d5: +#ifdef DEBUG_VGA_REG + printf("vga: write CR%x = 0x%02x\n", s->cr_index, val); +#endif + /* handle CR0-7 protection */ + if ((s->cr[0x11] & 0x80) && s->cr_index <= 7) { + /* can always write bit 4 of CR7 */ + if (s->cr_index == 7) + s->cr[7] = (s->cr[7] & ~0x10) | (val & 0x10); + return; + } + switch(s->cr_index) { + case 0x01: /* horizontal display end */ + case 0x07: + case 0x09: + case 0x0c: + case 0x0d: + case 0x12: /* vertical display end */ + s->cr[s->cr_index] = val; + break; + default: + s->cr[s->cr_index] = val; + break; + } + break; + case 0x3ba: + case 0x3da: + s->fcr = val & 0x10; + break; + } +} + +#define VGA_IO(base) \ +static uint32_t vga_read_ ## base(void *opaque, uint32_t addr, int size_log2)\ +{\ + return vga_ioport_read(opaque, base + addr);\ +}\ +static void vga_write_ ## base(void *opaque, uint32_t addr, uint32_t val, int size_log2)\ +{\ + return vga_ioport_write(opaque, base + addr, val);\ +} + +VGA_IO(0x3c0) +VGA_IO(0x3b4) +VGA_IO(0x3d4) +VGA_IO(0x3ba) +VGA_IO(0x3da) + +static void vbe_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + VGAState *s = opaque; + FBDevice *fb_dev = s->fb_dev; + + if (offset == 0) { + s->vbe_index = val; + } else { +#ifdef DEBUG_VBE + printf("VBE write: index=0x%04x val=0x%04x\n", s->vbe_index, val); +#endif + switch(s->vbe_index) { + case VBE_DISPI_INDEX_ID: + if (val >= VBE_DISPI_ID0 && val <= VBE_DISPI_ID5) + s->vbe_regs[s->vbe_index] = val; + break; + case VBE_DISPI_INDEX_ENABLE: + if ((val & VBE_DISPI_ENABLED) && + !(s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED)) { + /* set graphic mode */ + /* XXX: resolution change not really supported */ + if (s->vbe_regs[VBE_DISPI_INDEX_XRES] <= 4096 && + s->vbe_regs[VBE_DISPI_INDEX_YRES] <= 4096 && + (s->vbe_regs[VBE_DISPI_INDEX_XRES] * 4 * + s->vbe_regs[VBE_DISPI_INDEX_YRES]) <= fb_dev->fb_size) { + fb_dev->width = s->vbe_regs[VBE_DISPI_INDEX_XRES]; + fb_dev->height = s->vbe_regs[VBE_DISPI_INDEX_YRES]; + fb_dev->stride = fb_dev->width * 4; + } + s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = + s->vbe_regs[VBE_DISPI_INDEX_XRES]; + s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] = + s->vbe_regs[VBE_DISPI_INDEX_YRES]; + s->vbe_regs[VBE_DISPI_INDEX_X_OFFSET] = 0; + s->vbe_regs[VBE_DISPI_INDEX_Y_OFFSET] = 0; + } + s->vbe_regs[s->vbe_index] = val; + break; + case VBE_DISPI_INDEX_XRES: + case VBE_DISPI_INDEX_YRES: + case VBE_DISPI_INDEX_BPP: + case VBE_DISPI_INDEX_BANK: + case VBE_DISPI_INDEX_VIRT_WIDTH: + case VBE_DISPI_INDEX_VIRT_HEIGHT: + case VBE_DISPI_INDEX_X_OFFSET: + case VBE_DISPI_INDEX_Y_OFFSET: + s->vbe_regs[s->vbe_index] = val; + break; + } + } +} + +static uint32_t vbe_read(void *opaque, uint32_t offset, int size_log2) +{ + VGAState *s = opaque; + uint32_t val; + + if (offset == 0) { + val = s->vbe_index; + } else { + if (s->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_GETCAPS) { + switch(s->vbe_index) { + case VBE_DISPI_INDEX_XRES: + val = s->fb_dev->width; + break; + case VBE_DISPI_INDEX_YRES: + val = s->fb_dev->height; + break; + case VBE_DISPI_INDEX_BPP: + val = 32; + break; + default: + goto read_reg; + } + } else { + read_reg: + if (s->vbe_index < VBE_DISPI_INDEX_NB) + val = s->vbe_regs[s->vbe_index]; + else + val = 0; + } +#ifdef DEBUG_VBE + printf("VBE read: index=0x%04x val=0x%04x\n", s->vbe_index, val); +#endif + } + return val; +} + + +static void simplefb_bar_set(void *opaque, int bar_num, + uint32_t addr, BOOL enabled) +{ + VGAState *s = opaque; + if (bar_num == 0) + phys_mem_set_addr(s->mem_range, addr, enabled); + else + phys_mem_set_addr(s->rom_range, addr, enabled); +} + +VGAState *pci_vga_init(PCIBus *bus, FBDevice *fb_dev, + int width, int height, + const uint8_t *vga_rom_buf, int vga_rom_size) +{ + VGAState *s; + PCIDevice *d; + uint32_t bar_size; + PhysMemoryMap *mem_map, *port_map; + + d = pci_register_device(bus, "VGA", -1, 0x1234, 0x1111, 0x00, 0x0300); + + mem_map = pci_device_get_mem_map(d); + port_map = pci_device_get_port_map(d); + + s = mallocz(sizeof(*s)); + s->fb_dev = fb_dev; + + fb_dev->width = width; + fb_dev->height = height; + fb_dev->stride = width * 4; + + fb_dev->fb_size = (height * fb_dev->stride + FB_ALLOC_ALIGN - 1) & ~(FB_ALLOC_ALIGN - 1); + s->fb_page_count = fb_dev->fb_size >> DEVRAM_PAGE_SIZE_LOG2; + + s->mem_range = + cpu_register_ram(mem_map, 0, fb_dev->fb_size, + DEVRAM_FLAG_DIRTY_BITS | DEVRAM_FLAG_DISABLED); + + fb_dev->fb_data = s->mem_range->phys_mem; + + s->pci_dev = d; + bar_size = 1; + while (bar_size < fb_dev->fb_size) + bar_size <<= 1; + pci_register_bar(d, 0, bar_size, PCI_ADDRESS_SPACE_MEM, s, + simplefb_bar_set); + + if (vga_rom_size > 0) { + int rom_size; + /* align to page size */ + rom_size = (vga_rom_size + DEVRAM_PAGE_SIZE - 1) & ~(DEVRAM_PAGE_SIZE - 1); + s->rom_range = cpu_register_ram(mem_map, 0, rom_size, + DEVRAM_FLAG_ROM | DEVRAM_FLAG_DISABLED); + memcpy(s->rom_range->phys_mem, vga_rom_buf, vga_rom_size); + + bar_size = 1; + while (bar_size < rom_size) + bar_size <<= 1; + pci_register_bar(d, PCI_ROM_SLOT, bar_size, PCI_ADDRESS_SPACE_MEM, s, + simplefb_bar_set); + } + + /* VGA memory (for simple text mode no need for callbacks) */ + s->mem_range2 = cpu_register_ram(mem_map, 0xa0000, 0x20000, 0); + s->vga_ram = s->mem_range2->phys_mem; + + /* standard VGA ports */ + + cpu_register_device(port_map, 0x3c0, 16, s, vga_read_0x3c0, vga_write_0x3c0, + DEVIO_SIZE8); + cpu_register_device(port_map, 0x3b4, 2, s, vga_read_0x3b4, vga_write_0x3b4, + DEVIO_SIZE8); + cpu_register_device(port_map, 0x3d4, 2, s, vga_read_0x3d4, vga_write_0x3d4, + DEVIO_SIZE8); + cpu_register_device(port_map, 0x3ba, 1, s, vga_read_0x3ba, vga_write_0x3ba, + DEVIO_SIZE8); + cpu_register_device(port_map, 0x3da, 1, s, vga_read_0x3da, vga_write_0x3da, + DEVIO_SIZE8); + + /* VBE extension */ + cpu_register_device(port_map, 0x1ce, 2, s, vbe_read, vbe_write, + DEVIO_SIZE16); + + s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID5; + s->vbe_regs[VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = fb_dev->fb_size >> 16; + + fb_dev->device_opaque = s; + fb_dev->refresh = vga_refresh; + return s; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c new file mode 100644 index 0000000..8d07f44 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.c @@ -0,0 +1,2650 @@ +/* + * VIRTIO driver + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <stdarg.h> + +#include "cutils.h" +#include "list.h" +#include "virtio.h" + +//#define DEBUG_VIRTIO + +/* MMIO addresses - from the Linux kernel */ +#define VIRTIO_MMIO_MAGIC_VALUE 0x000 +#define VIRTIO_MMIO_VERSION 0x004 +#define VIRTIO_MMIO_DEVICE_ID 0x008 +#define VIRTIO_MMIO_VENDOR_ID 0x00c +#define VIRTIO_MMIO_DEVICE_FEATURES 0x010 +#define VIRTIO_MMIO_DEVICE_FEATURES_SEL 0x014 +#define VIRTIO_MMIO_DRIVER_FEATURES 0x020 +#define VIRTIO_MMIO_DRIVER_FEATURES_SEL 0x024 +#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 /* version 1 only */ +#define VIRTIO_MMIO_QUEUE_SEL 0x030 +#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034 +#define VIRTIO_MMIO_QUEUE_NUM 0x038 +#define VIRTIO_MMIO_QUEUE_ALIGN 0x03c /* version 1 only */ +#define VIRTIO_MMIO_QUEUE_PFN 0x040 /* version 1 only */ +#define VIRTIO_MMIO_QUEUE_READY 0x044 +#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050 +#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060 +#define VIRTIO_MMIO_INTERRUPT_ACK 0x064 +#define VIRTIO_MMIO_STATUS 0x070 +#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080 +#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084 +#define VIRTIO_MMIO_QUEUE_AVAIL_LOW 0x090 +#define VIRTIO_MMIO_QUEUE_AVAIL_HIGH 0x094 +#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0 +#define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4 +#define VIRTIO_MMIO_CONFIG_GENERATION 0x0fc +#define VIRTIO_MMIO_CONFIG 0x100 + +/* PCI registers */ +#define VIRTIO_PCI_DEVICE_FEATURE_SEL 0x000 +#define VIRTIO_PCI_DEVICE_FEATURE 0x004 +#define VIRTIO_PCI_GUEST_FEATURE_SEL 0x008 +#define VIRTIO_PCI_GUEST_FEATURE 0x00c +#define VIRTIO_PCI_MSIX_CONFIG 0x010 +#define VIRTIO_PCI_NUM_QUEUES 0x012 +#define VIRTIO_PCI_DEVICE_STATUS 0x014 +#define VIRTIO_PCI_CONFIG_GENERATION 0x015 +#define VIRTIO_PCI_QUEUE_SEL 0x016 +#define VIRTIO_PCI_QUEUE_SIZE 0x018 +#define VIRTIO_PCI_QUEUE_MSIX_VECTOR 0x01a +#define VIRTIO_PCI_QUEUE_ENABLE 0x01c +#define VIRTIO_PCI_QUEUE_NOTIFY_OFF 0x01e +#define VIRTIO_PCI_QUEUE_DESC_LOW 0x020 +#define VIRTIO_PCI_QUEUE_DESC_HIGH 0x024 +#define VIRTIO_PCI_QUEUE_AVAIL_LOW 0x028 +#define VIRTIO_PCI_QUEUE_AVAIL_HIGH 0x02c +#define VIRTIO_PCI_QUEUE_USED_LOW 0x030 +#define VIRTIO_PCI_QUEUE_USED_HIGH 0x034 + +#define VIRTIO_PCI_CFG_OFFSET 0x0000 +#define VIRTIO_PCI_ISR_OFFSET 0x1000 +#define VIRTIO_PCI_CONFIG_OFFSET 0x2000 +#define VIRTIO_PCI_NOTIFY_OFFSET 0x3000 + +#define VIRTIO_PCI_CAP_LEN 16 + +#define MAX_QUEUE 8 +#define MAX_CONFIG_SPACE_SIZE 256 +#define MAX_QUEUE_NUM 16 + +typedef struct { + uint32_t ready; /* 0 or 1 */ + uint32_t num; + uint16_t last_avail_idx; + virtio_phys_addr_t desc_addr; + virtio_phys_addr_t avail_addr; + virtio_phys_addr_t used_addr; + BOOL manual_recv; /* if TRUE, the device_recv() callback is not called */ +} QueueState; + +#define VRING_DESC_F_NEXT 1 +#define VRING_DESC_F_WRITE 2 +#define VRING_DESC_F_INDIRECT 4 + +typedef struct { + uint64_t addr; + uint32_t len; + uint16_t flags; /* VRING_DESC_F_x */ + uint16_t next; +} VIRTIODesc; + +/* return < 0 to stop the notification (it must be manually restarted + later), 0 if OK */ +typedef int VIRTIODeviceRecvFunc(VIRTIODevice *s1, int queue_idx, + int desc_idx, int read_size, + int write_size); + +/* return NULL if no RAM at this address. The mapping is valid for one page */ +typedef uint8_t *VIRTIOGetRAMPtrFunc(VIRTIODevice *s, virtio_phys_addr_t paddr, BOOL is_rw); + +struct VIRTIODevice { + PhysMemoryMap *mem_map; + PhysMemoryRange *mem_range; + /* PCI only */ + PCIDevice *pci_dev; + /* MMIO only */ + IRQSignal *irq; + VIRTIOGetRAMPtrFunc *get_ram_ptr; + int debug; + + uint32_t int_status; + uint32_t status; + uint32_t device_features_sel; + uint32_t queue_sel; /* currently selected queue */ + QueueState queue[MAX_QUEUE]; + + /* device specific */ + uint32_t device_id; + uint32_t vendor_id; + uint32_t device_features; + VIRTIODeviceRecvFunc *device_recv; + void (*config_write)(VIRTIODevice *s); /* called after the config + is written */ + uint32_t config_space_size; /* in bytes, must be multiple of 4 */ + uint8_t config_space[MAX_CONFIG_SPACE_SIZE]; +}; + +static uint32_t virtio_mmio_read(void *opaque, uint32_t offset1, int size_log2); +static void virtio_mmio_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +static uint32_t virtio_pci_read(void *opaque, uint32_t offset, int size_log2); +static void virtio_pci_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); + +static void virtio_reset(VIRTIODevice *s) +{ + int i; + + s->status = 0; + s->queue_sel = 0; + s->device_features_sel = 0; + s->int_status = 0; + for(i = 0; i < MAX_QUEUE; i++) { + QueueState *qs = &s->queue[i]; + qs->ready = 0; + qs->num = MAX_QUEUE_NUM; + qs->desc_addr = 0; + qs->avail_addr = 0; + qs->used_addr = 0; + qs->last_avail_idx = 0; + } +} + +static uint8_t *virtio_pci_get_ram_ptr(VIRTIODevice *s, virtio_phys_addr_t paddr, BOOL is_rw) +{ + return pci_device_get_dma_ptr(s->pci_dev, paddr, is_rw); +} + +static uint8_t *virtio_mmio_get_ram_ptr(VIRTIODevice *s, virtio_phys_addr_t paddr, BOOL is_rw) +{ + return phys_mem_get_ram_ptr(s->mem_map, paddr, is_rw); +} + +static void virtio_add_pci_capability(VIRTIODevice *s, int cfg_type, + int bar, uint32_t offset, uint32_t len, + uint32_t mult) +{ + uint8_t cap[20]; + int cap_len; + if (cfg_type == 2) + cap_len = 20; + else + cap_len = 16; + memset(cap, 0, cap_len); + cap[0] = 0x09; /* vendor specific */ + cap[2] = cap_len; /* set by pci_add_capability() */ + cap[3] = cfg_type; + cap[4] = bar; + put_le32(cap + 8, offset); + put_le32(cap + 12, len); + if (cfg_type == 2) + put_le32(cap + 16, mult); + pci_add_capability(s->pci_dev, cap, cap_len); +} + +static void virtio_pci_bar_set(void *opaque, int bar_num, + uint32_t addr, BOOL enabled) +{ + VIRTIODevice *s = opaque; + phys_mem_set_addr(s->mem_range, addr, enabled); +} + +static void virtio_init(VIRTIODevice *s, VIRTIOBusDef *bus, + uint32_t device_id, int config_space_size, + VIRTIODeviceRecvFunc *device_recv) +{ + memset(s, 0, sizeof(*s)); + + if (bus->pci_bus) { + uint16_t pci_device_id, class_id; + char name[32]; + int bar_num; + + switch(device_id) { + case 1: + pci_device_id = 0x1000; /* net */ + class_id = 0x0200; + break; + case 2: + pci_device_id = 0x1001; /* block */ + class_id = 0x0100; /* XXX: check it */ + break; + case 3: + pci_device_id = 0x1003; /* console */ + class_id = 0x0780; + break; + case 9: + pci_device_id = 0x1040 + device_id; /* use new device ID */ + class_id = 0x2; + break; + case 18: + pci_device_id = 0x1040 + device_id; /* use new device ID */ + class_id = 0x0980; + break; + default: + abort(); + } + snprintf(name, sizeof(name), "virtio_%04x", pci_device_id); + s->pci_dev = pci_register_device(bus->pci_bus, name, -1, + 0x1af4, pci_device_id, 0x00, + class_id); + pci_device_set_config16(s->pci_dev, 0x2c, 0x1af4); + pci_device_set_config16(s->pci_dev, 0x2e, device_id); + pci_device_set_config8(s->pci_dev, PCI_INTERRUPT_PIN, 1); + + bar_num = 4; + virtio_add_pci_capability(s, 1, bar_num, + VIRTIO_PCI_CFG_OFFSET, 0x1000, 0); /* common */ + virtio_add_pci_capability(s, 3, bar_num, + VIRTIO_PCI_ISR_OFFSET, 0x1000, 0); /* isr */ + virtio_add_pci_capability(s, 4, bar_num, + VIRTIO_PCI_CONFIG_OFFSET, 0x1000, 0); /* config */ + virtio_add_pci_capability(s, 2, bar_num, + VIRTIO_PCI_NOTIFY_OFFSET, 0x1000, 0); /* notify */ + + s->get_ram_ptr = virtio_pci_get_ram_ptr; + s->irq = pci_device_get_irq(s->pci_dev, 0); + s->mem_map = pci_device_get_mem_map(s->pci_dev); + s->mem_range = cpu_register_device(s->mem_map, 0, 0x4000, s, + virtio_pci_read, virtio_pci_write, + DEVIO_SIZE8 | DEVIO_SIZE16 | DEVIO_SIZE32 | DEVIO_DISABLED); + pci_register_bar(s->pci_dev, bar_num, 0x4000, PCI_ADDRESS_SPACE_MEM, + s, virtio_pci_bar_set); + } else { + /* MMIO case */ + s->mem_map = bus->mem_map; + s->irq = bus->irq; + s->mem_range = cpu_register_device(s->mem_map, bus->addr, VIRTIO_PAGE_SIZE, + s, virtio_mmio_read, virtio_mmio_write, + DEVIO_SIZE8 | DEVIO_SIZE16 | DEVIO_SIZE32); + s->get_ram_ptr = virtio_mmio_get_ram_ptr; + } + + s->device_id = device_id; + s->vendor_id = 0xffff; + s->config_space_size = config_space_size; + s->device_recv = device_recv; + virtio_reset(s); +} + +static uint16_t virtio_read16(VIRTIODevice *s, virtio_phys_addr_t addr) +{ + uint8_t *ptr; + if (addr & 1) + return 0; /* unaligned access are not supported */ + ptr = s->get_ram_ptr(s, addr, FALSE); + if (!ptr) + return 0; + return *(uint16_t *)ptr; +} + +static void virtio_write16(VIRTIODevice *s, virtio_phys_addr_t addr, + uint16_t val) +{ + uint8_t *ptr; + if (addr & 1) + return; /* unaligned access are not supported */ + ptr = s->get_ram_ptr(s, addr, TRUE); + if (!ptr) + return; + *(uint16_t *)ptr = val; +} + +static void virtio_write32(VIRTIODevice *s, virtio_phys_addr_t addr, + uint32_t val) +{ + uint8_t *ptr; + if (addr & 3) + return; /* unaligned access are not supported */ + ptr = s->get_ram_ptr(s, addr, TRUE); + if (!ptr) + return; + *(uint32_t *)ptr = val; +} + +static int virtio_memcpy_from_ram(VIRTIODevice *s, uint8_t *buf, + virtio_phys_addr_t addr, int count) +{ + uint8_t *ptr; + int l; + + while (count > 0) { + l = min_int(count, VIRTIO_PAGE_SIZE - (addr & (VIRTIO_PAGE_SIZE - 1))); + ptr = s->get_ram_ptr(s, addr, FALSE); + if (!ptr) + return -1; + memcpy(buf, ptr, l); + addr += l; + buf += l; + count -= l; + } + return 0; +} + +static int virtio_memcpy_to_ram(VIRTIODevice *s, virtio_phys_addr_t addr, + const uint8_t *buf, int count) +{ + uint8_t *ptr; + int l; + + while (count > 0) { + l = min_int(count, VIRTIO_PAGE_SIZE - (addr & (VIRTIO_PAGE_SIZE - 1))); + ptr = s->get_ram_ptr(s, addr, TRUE); + if (!ptr) + return -1; + memcpy(ptr, buf, l); + addr += l; + buf += l; + count -= l; + } + return 0; +} + +static int get_desc(VIRTIODevice *s, VIRTIODesc *desc, + int queue_idx, int desc_idx) +{ + QueueState *qs = &s->queue[queue_idx]; + return virtio_memcpy_from_ram(s, (void *)desc, qs->desc_addr + + desc_idx * sizeof(VIRTIODesc), + sizeof(VIRTIODesc)); +} + +static int memcpy_to_from_queue(VIRTIODevice *s, uint8_t *buf, + int queue_idx, int desc_idx, + int offset, int count, BOOL to_queue) +{ + VIRTIODesc desc; + int l, f_write_flag; + + if (count == 0) + return 0; + + get_desc(s, &desc, queue_idx, desc_idx); + + if (to_queue) { + f_write_flag = VRING_DESC_F_WRITE; + /* find the first write descriptor */ + for(;;) { + if ((desc.flags & VRING_DESC_F_WRITE) == f_write_flag) + break; + if (!(desc.flags & VRING_DESC_F_NEXT)) + return -1; + desc_idx = desc.next; + get_desc(s, &desc, queue_idx, desc_idx); + } + } else { + f_write_flag = 0; + } + + /* find the descriptor at offset */ + for(;;) { + if ((desc.flags & VRING_DESC_F_WRITE) != f_write_flag) + return -1; + if (offset < desc.len) + break; + if (!(desc.flags & VRING_DESC_F_NEXT)) + return -1; + desc_idx = desc.next; + offset -= desc.len; + get_desc(s, &desc, queue_idx, desc_idx); + } + + for(;;) { + l = min_int(count, desc.len - offset); + if (to_queue) + virtio_memcpy_to_ram(s, desc.addr + offset, buf, l); + else + virtio_memcpy_from_ram(s, buf, desc.addr + offset, l); + count -= l; + if (count == 0) + break; + offset += l; + buf += l; + if (offset == desc.len) { + if (!(desc.flags & VRING_DESC_F_NEXT)) + return -1; + desc_idx = desc.next; + get_desc(s, &desc, queue_idx, desc_idx); + if ((desc.flags & VRING_DESC_F_WRITE) != f_write_flag) + return -1; + offset = 0; + } + } + return 0; +} + +static int memcpy_from_queue(VIRTIODevice *s, void *buf, + int queue_idx, int desc_idx, + int offset, int count) +{ + return memcpy_to_from_queue(s, buf, queue_idx, desc_idx, offset, count, + FALSE); +} + +static int memcpy_to_queue(VIRTIODevice *s, + int queue_idx, int desc_idx, + int offset, const void *buf, int count) +{ + return memcpy_to_from_queue(s, (void *)buf, queue_idx, desc_idx, offset, + count, TRUE); +} + +/* signal that the descriptor has been consumed */ +static void virtio_consume_desc(VIRTIODevice *s, + int queue_idx, int desc_idx, int desc_len) +{ + QueueState *qs = &s->queue[queue_idx]; + virtio_phys_addr_t addr; + uint32_t index; + + addr = qs->used_addr + 2; + index = virtio_read16(s, addr); + virtio_write16(s, addr, index + 1); + + addr = qs->used_addr + 4 + (index & (qs->num - 1)) * 8; + virtio_write32(s, addr, desc_idx); + virtio_write32(s, addr + 4, desc_len); + + s->int_status |= 1; + set_irq(s->irq, 1); +} + +static int get_desc_rw_size(VIRTIODevice *s, + int *pread_size, int *pwrite_size, + int queue_idx, int desc_idx) +{ + VIRTIODesc desc; + int read_size, write_size; + + read_size = 0; + write_size = 0; + get_desc(s, &desc, queue_idx, desc_idx); + + for(;;) { + if (desc.flags & VRING_DESC_F_WRITE) + break; + read_size += desc.len; + if (!(desc.flags & VRING_DESC_F_NEXT)) + goto done; + desc_idx = desc.next; + get_desc(s, &desc, queue_idx, desc_idx); + } + + for(;;) { + if (!(desc.flags & VRING_DESC_F_WRITE)) + return -1; + write_size += desc.len; + if (!(desc.flags & VRING_DESC_F_NEXT)) + break; + desc_idx = desc.next; + get_desc(s, &desc, queue_idx, desc_idx); + } + + done: + *pread_size = read_size; + *pwrite_size = write_size; + return 0; +} + +/* XXX: test if the queue is ready ? */ +static void queue_notify(VIRTIODevice *s, int queue_idx) +{ + QueueState *qs = &s->queue[queue_idx]; + uint16_t avail_idx; + int desc_idx, read_size, write_size; + + if (qs->manual_recv) + return; + + avail_idx = virtio_read16(s, qs->avail_addr + 2); + while (qs->last_avail_idx != avail_idx) { + desc_idx = virtio_read16(s, qs->avail_addr + 4 + + (qs->last_avail_idx & (qs->num - 1)) * 2); + if (!get_desc_rw_size(s, &read_size, &write_size, queue_idx, desc_idx)) { +#ifdef DEBUG_VIRTIO + if (s->debug & VIRTIO_DEBUG_IO) { + printf("queue_notify: idx=%d read_size=%d write_size=%d\n", + queue_idx, read_size, write_size); + } +#endif + if (s->device_recv(s, queue_idx, desc_idx, + read_size, write_size) < 0) + break; + } + qs->last_avail_idx++; + } +} + +static uint32_t virtio_config_read(VIRTIODevice *s, uint32_t offset, + int size_log2) +{ + uint32_t val; + switch(size_log2) { + case 0: + if (offset < s->config_space_size) { + val = s->config_space[offset]; + } else { + val = 0; + } + break; + case 1: + if (offset < (s->config_space_size - 1)) { + val = get_le16(&s->config_space[offset]); + } else { + val = 0; + } + break; + case 2: + if (offset < (s->config_space_size - 3)) { + val = get_le32(s->config_space + offset); + } else { + val = 0; + } + break; + default: + abort(); + } + return val; +} + +static void virtio_config_write(VIRTIODevice *s, uint32_t offset, + uint32_t val, int size_log2) +{ + switch(size_log2) { + case 0: + if (offset < s->config_space_size) { + s->config_space[offset] = val; + if (s->config_write) + s->config_write(s); + } + break; + case 1: + if (offset < s->config_space_size - 1) { + put_le16(s->config_space + offset, val); + if (s->config_write) + s->config_write(s); + } + break; + case 2: + if (offset < s->config_space_size - 3) { + put_le32(s->config_space + offset, val); + if (s->config_write) + s->config_write(s); + } + break; + } +} + +static uint32_t virtio_mmio_read(void *opaque, uint32_t offset, int size_log2) +{ + VIRTIODevice *s = opaque; + uint32_t val; + + if (offset >= VIRTIO_MMIO_CONFIG) { + return virtio_config_read(s, offset - VIRTIO_MMIO_CONFIG, size_log2); + } + + if (size_log2 == 2) { + switch(offset) { + case VIRTIO_MMIO_MAGIC_VALUE: + val = 0x74726976; + break; + case VIRTIO_MMIO_VERSION: + val = 2; + break; + case VIRTIO_MMIO_DEVICE_ID: + val = s->device_id; + break; + case VIRTIO_MMIO_VENDOR_ID: + val = s->vendor_id; + break; + case VIRTIO_MMIO_DEVICE_FEATURES: + switch(s->device_features_sel) { + case 0: + val = s->device_features; + break; + case 1: + val = 1; /* version 1 */ + break; + default: + val = 0; + break; + } + break; + case VIRTIO_MMIO_DEVICE_FEATURES_SEL: + val = s->device_features_sel; + break; + case VIRTIO_MMIO_QUEUE_SEL: + val = s->queue_sel; + break; + case VIRTIO_MMIO_QUEUE_NUM_MAX: + val = MAX_QUEUE_NUM; + break; + case VIRTIO_MMIO_QUEUE_NUM: + val = s->queue[s->queue_sel].num; + break; + case VIRTIO_MMIO_QUEUE_DESC_LOW: + val = s->queue[s->queue_sel].desc_addr; + break; + case VIRTIO_MMIO_QUEUE_AVAIL_LOW: + val = s->queue[s->queue_sel].avail_addr; + break; + case VIRTIO_MMIO_QUEUE_USED_LOW: + val = s->queue[s->queue_sel].used_addr; + break; +#if VIRTIO_ADDR_BITS == 64 + case VIRTIO_MMIO_QUEUE_DESC_HIGH: + val = s->queue[s->queue_sel].desc_addr >> 32; + break; + case VIRTIO_MMIO_QUEUE_AVAIL_HIGH: + val = s->queue[s->queue_sel].avail_addr >> 32; + break; + case VIRTIO_MMIO_QUEUE_USED_HIGH: + val = s->queue[s->queue_sel].used_addr >> 32; + break; +#endif + case VIRTIO_MMIO_QUEUE_READY: + val = s->queue[s->queue_sel].ready; + break; + case VIRTIO_MMIO_INTERRUPT_STATUS: + val = s->int_status; + break; + case VIRTIO_MMIO_STATUS: + val = s->status; + break; + case VIRTIO_MMIO_CONFIG_GENERATION: + val = 0; + break; + default: + val = 0; + break; + } + } else { + val = 0; + } +#ifdef DEBUG_VIRTIO + if (s->debug & VIRTIO_DEBUG_IO) { + printf("virto_mmio_read: offset=0x%x val=0x%x size=%d\n", + offset, val, 1 << size_log2); + } +#endif + return val; +} + +#if VIRTIO_ADDR_BITS == 64 +static void set_low32(virtio_phys_addr_t *paddr, uint32_t val) +{ + *paddr = (*paddr & ~(virtio_phys_addr_t)0xffffffff) | val; +} + +static void set_high32(virtio_phys_addr_t *paddr, uint32_t val) +{ + *paddr = (*paddr & 0xffffffff) | ((virtio_phys_addr_t)val << 32); +} +#else +static void set_low32(virtio_phys_addr_t *paddr, uint32_t val) +{ + *paddr = val; +} +#endif + +static void virtio_mmio_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + VIRTIODevice *s = opaque; + +#ifdef DEBUG_VIRTIO + if (s->debug & VIRTIO_DEBUG_IO) { + printf("virto_mmio_write: offset=0x%x val=0x%x size=%d\n", + offset, val, 1 << size_log2); + } +#endif + + if (offset >= VIRTIO_MMIO_CONFIG) { + virtio_config_write(s, offset - VIRTIO_MMIO_CONFIG, val, size_log2); + return; + } + + if (size_log2 == 2) { + switch(offset) { + case VIRTIO_MMIO_DEVICE_FEATURES_SEL: + s->device_features_sel = val; + break; + case VIRTIO_MMIO_QUEUE_SEL: + if (val < MAX_QUEUE) + s->queue_sel = val; + break; + case VIRTIO_MMIO_QUEUE_NUM: + if ((val & (val - 1)) == 0 && val > 0) { + s->queue[s->queue_sel].num = val; + } + break; + case VIRTIO_MMIO_QUEUE_DESC_LOW: + set_low32(&s->queue[s->queue_sel].desc_addr, val); + break; + case VIRTIO_MMIO_QUEUE_AVAIL_LOW: + set_low32(&s->queue[s->queue_sel].avail_addr, val); + break; + case VIRTIO_MMIO_QUEUE_USED_LOW: + set_low32(&s->queue[s->queue_sel].used_addr, val); + break; +#if VIRTIO_ADDR_BITS == 64 + case VIRTIO_MMIO_QUEUE_DESC_HIGH: + set_high32(&s->queue[s->queue_sel].desc_addr, val); + break; + case VIRTIO_MMIO_QUEUE_AVAIL_HIGH: + set_high32(&s->queue[s->queue_sel].avail_addr, val); + break; + case VIRTIO_MMIO_QUEUE_USED_HIGH: + set_high32(&s->queue[s->queue_sel].used_addr, val); + break; +#endif + case VIRTIO_MMIO_STATUS: + s->status = val; + if (val == 0) { + /* reset */ + set_irq(s->irq, 0); + virtio_reset(s); + } + break; + case VIRTIO_MMIO_QUEUE_READY: + s->queue[s->queue_sel].ready = val & 1; + break; + case VIRTIO_MMIO_QUEUE_NOTIFY: + if (val < MAX_QUEUE) + queue_notify(s, val); + break; + case VIRTIO_MMIO_INTERRUPT_ACK: + s->int_status &= ~val; + if (s->int_status == 0) { + set_irq(s->irq, 0); + } + break; + } + } +} + +static uint32_t virtio_pci_read(void *opaque, uint32_t offset1, int size_log2) +{ + VIRTIODevice *s = opaque; + uint32_t offset; + uint32_t val = 0; + + offset = offset1 & 0xfff; + switch(offset1 >> 12) { + case VIRTIO_PCI_CFG_OFFSET >> 12: + if (size_log2 == 2) { + switch(offset) { + case VIRTIO_PCI_DEVICE_FEATURE: + switch(s->device_features_sel) { + case 0: + val = s->device_features; + break; + case 1: + val = 1; /* version 1 */ + break; + default: + val = 0; + break; + } + break; + case VIRTIO_PCI_DEVICE_FEATURE_SEL: + val = s->device_features_sel; + break; + case VIRTIO_PCI_QUEUE_DESC_LOW: + val = s->queue[s->queue_sel].desc_addr; + break; + case VIRTIO_PCI_QUEUE_AVAIL_LOW: + val = s->queue[s->queue_sel].avail_addr; + break; + case VIRTIO_PCI_QUEUE_USED_LOW: + val = s->queue[s->queue_sel].used_addr; + break; +#if VIRTIO_ADDR_BITS == 64 + case VIRTIO_PCI_QUEUE_DESC_HIGH: + val = s->queue[s->queue_sel].desc_addr >> 32; + break; + case VIRTIO_PCI_QUEUE_AVAIL_HIGH: + val = s->queue[s->queue_sel].avail_addr >> 32; + break; + case VIRTIO_PCI_QUEUE_USED_HIGH: + val = s->queue[s->queue_sel].used_addr >> 32; + break; +#endif + } + } else if (size_log2 == 1) { + switch(offset) { + case VIRTIO_PCI_NUM_QUEUES: + val = MAX_QUEUE_NUM; + break; + case VIRTIO_PCI_QUEUE_SEL: + val = s->queue_sel; + break; + case VIRTIO_PCI_QUEUE_SIZE: + val = s->queue[s->queue_sel].num; + break; + case VIRTIO_PCI_QUEUE_ENABLE: + val = s->queue[s->queue_sel].ready; + break; + case VIRTIO_PCI_QUEUE_NOTIFY_OFF: + val = 0; + break; + } + } else if (size_log2 == 0) { + switch(offset) { + case VIRTIO_PCI_DEVICE_STATUS: + val = s->status; + break; + } + } + break; + case VIRTIO_PCI_ISR_OFFSET >> 12: + if (offset == 0 && size_log2 == 0) { + val = s->int_status; + s->int_status = 0; + set_irq(s->irq, 0); + } + break; + case VIRTIO_PCI_CONFIG_OFFSET >> 12: + val = virtio_config_read(s, offset, size_log2); + break; + } +#ifdef DEBUG_VIRTIO + if (s->debug & VIRTIO_DEBUG_IO) { + printf("virto_pci_read: offset=0x%x val=0x%x size=%d\n", + offset1, val, 1 << size_log2); + } +#endif + return val; +} + +static void virtio_pci_write(void *opaque, uint32_t offset1, + uint32_t val, int size_log2) +{ + VIRTIODevice *s = opaque; + uint32_t offset; + +#ifdef DEBUG_VIRTIO + if (s->debug & VIRTIO_DEBUG_IO) { + printf("virto_pci_write: offset=0x%x val=0x%x size=%d\n", + offset1, val, 1 << size_log2); + } +#endif + offset = offset1 & 0xfff; + switch(offset1 >> 12) { + case VIRTIO_PCI_CFG_OFFSET >> 12: + if (size_log2 == 2) { + switch(offset) { + case VIRTIO_PCI_DEVICE_FEATURE_SEL: + s->device_features_sel = val; + break; + case VIRTIO_PCI_QUEUE_DESC_LOW: + set_low32(&s->queue[s->queue_sel].desc_addr, val); + break; + case VIRTIO_PCI_QUEUE_AVAIL_LOW: + set_low32(&s->queue[s->queue_sel].avail_addr, val); + break; + case VIRTIO_PCI_QUEUE_USED_LOW: + set_low32(&s->queue[s->queue_sel].used_addr, val); + break; +#if VIRTIO_ADDR_BITS == 64 + case VIRTIO_PCI_QUEUE_DESC_HIGH: + set_high32(&s->queue[s->queue_sel].desc_addr, val); + break; + case VIRTIO_PCI_QUEUE_AVAIL_HIGH: + set_high32(&s->queue[s->queue_sel].avail_addr, val); + break; + case VIRTIO_PCI_QUEUE_USED_HIGH: + set_high32(&s->queue[s->queue_sel].used_addr, val); + break; +#endif + } + } else if (size_log2 == 1) { + switch(offset) { + case VIRTIO_PCI_QUEUE_SEL: + if (val < MAX_QUEUE) + s->queue_sel = val; + break; + case VIRTIO_PCI_QUEUE_SIZE: + if ((val & (val - 1)) == 0 && val > 0) { + s->queue[s->queue_sel].num = val; + } + break; + case VIRTIO_PCI_QUEUE_ENABLE: + s->queue[s->queue_sel].ready = val & 1; + break; + } + } else if (size_log2 == 0) { + switch(offset) { + case VIRTIO_PCI_DEVICE_STATUS: + s->status = val; + if (val == 0) { + /* reset */ + set_irq(s->irq, 0); + virtio_reset(s); + } + break; + } + } + break; + case VIRTIO_PCI_CONFIG_OFFSET >> 12: + virtio_config_write(s, offset, val, size_log2); + break; + case VIRTIO_PCI_NOTIFY_OFFSET >> 12: + if (val < MAX_QUEUE) + queue_notify(s, val); + break; + } +} + +void virtio_set_debug(VIRTIODevice *s, int debug) +{ + s->debug = debug; +} + +static void virtio_config_change_notify(VIRTIODevice *s) +{ + /* INT_CONFIG interrupt */ + s->int_status |= 2; + set_irq(s->irq, 1); +} + +/*********************************************************************/ +/* block device */ + +typedef struct { + uint32_t type; + uint8_t *buf; + int write_size; + int queue_idx; + int desc_idx; +} BlockRequest; + +typedef struct VIRTIOBlockDevice { + VIRTIODevice common; + BlockDevice *bs; + + BOOL req_in_progress; + BlockRequest req; /* request in progress */ +} VIRTIOBlockDevice; + +typedef struct { + uint32_t type; + uint32_t ioprio; + uint64_t sector_num; +} BlockRequestHeader; + +#define VIRTIO_BLK_T_IN 0 +#define VIRTIO_BLK_T_OUT 1 +#define VIRTIO_BLK_T_FLUSH 4 +#define VIRTIO_BLK_T_FLUSH_OUT 5 + +#define VIRTIO_BLK_S_OK 0 +#define VIRTIO_BLK_S_IOERR 1 +#define VIRTIO_BLK_S_UNSUPP 2 + +#define SECTOR_SIZE 512 + +static void virtio_block_req_end(VIRTIODevice *s, int ret) +{ + VIRTIOBlockDevice *s1 = (VIRTIOBlockDevice *)s; + int write_size; + int queue_idx = s1->req.queue_idx; + int desc_idx = s1->req.desc_idx; + uint8_t *buf, buf1[1]; + + switch(s1->req.type) { + case VIRTIO_BLK_T_IN: + write_size = s1->req.write_size; + buf = s1->req.buf; + if (ret < 0) { + buf[write_size - 1] = VIRTIO_BLK_S_IOERR; + } else { + buf[write_size - 1] = VIRTIO_BLK_S_OK; + } + memcpy_to_queue(s, queue_idx, desc_idx, 0, buf, write_size); + free(buf); + virtio_consume_desc(s, queue_idx, desc_idx, write_size); + break; + case VIRTIO_BLK_T_OUT: + if (ret < 0) + buf1[0] = VIRTIO_BLK_S_IOERR; + else + buf1[0] = VIRTIO_BLK_S_OK; + memcpy_to_queue(s, queue_idx, desc_idx, 0, buf1, sizeof(buf1)); + virtio_consume_desc(s, queue_idx, desc_idx, 1); + break; + default: + abort(); + } +} + +static void virtio_block_req_cb(void *opaque, int ret) +{ + VIRTIODevice *s = opaque; + VIRTIOBlockDevice *s1 = (VIRTIOBlockDevice *)s; + + virtio_block_req_end(s, ret); + + s1->req_in_progress = FALSE; + + /* handle next requests */ + queue_notify((VIRTIODevice *)s, s1->req.queue_idx); +} + +/* XXX: handle async I/O */ +static int virtio_block_recv_request(VIRTIODevice *s, int queue_idx, + int desc_idx, int read_size, + int write_size) +{ + VIRTIOBlockDevice *s1 = (VIRTIOBlockDevice *)s; + BlockDevice *bs = s1->bs; + BlockRequestHeader h; + uint8_t *buf; + int len, ret; + + if (s1->req_in_progress) + return -1; + + if (memcpy_from_queue(s, &h, queue_idx, desc_idx, 0, sizeof(h)) < 0) + return 0; + s1->req.type = h.type; + s1->req.queue_idx = queue_idx; + s1->req.desc_idx = desc_idx; + switch(h.type) { + case VIRTIO_BLK_T_IN: + s1->req.buf = malloc(write_size); + s1->req.write_size = write_size; + ret = bs->read_async(bs, h.sector_num, s1->req.buf, + (write_size - 1) / SECTOR_SIZE, + virtio_block_req_cb, s); + if (ret > 0) { + /* asyncronous read */ + s1->req_in_progress = TRUE; + } else { + virtio_block_req_end(s, ret); + } + break; + case VIRTIO_BLK_T_OUT: + assert(write_size >= 1); + len = read_size - sizeof(h); + buf = malloc(len); + memcpy_from_queue(s, buf, queue_idx, desc_idx, sizeof(h), len); + ret = bs->write_async(bs, h.sector_num, buf, len / SECTOR_SIZE, + virtio_block_req_cb, s); + free(buf); + if (ret > 0) { + /* asyncronous write */ + s1->req_in_progress = TRUE; + } else { + virtio_block_req_end(s, ret); + } + break; + default: + break; + } + return 0; +} + +VIRTIODevice *virtio_block_init(VIRTIOBusDef *bus, BlockDevice *bs) +{ + VIRTIOBlockDevice *s; + uint64_t nb_sectors; + + s = mallocz(sizeof(*s)); + virtio_init(&s->common, bus, + 2, 8, virtio_block_recv_request); + s->bs = bs; + + nb_sectors = bs->get_sector_count(bs); + put_le32(s->common.config_space, nb_sectors); + put_le32(s->common.config_space + 4, nb_sectors >> 32); + + return (VIRTIODevice *)s; +} + +/*********************************************************************/ +/* network device */ + +typedef struct VIRTIONetDevice { + VIRTIODevice common; + EthernetDevice *es; + int header_size; +} VIRTIONetDevice; + +typedef struct { + uint8_t flags; + uint8_t gso_type; + uint16_t hdr_len; + uint16_t gso_size; + uint16_t csum_start; + uint16_t csum_offset; + uint16_t num_buffers; +} VIRTIONetHeader; + +static int virtio_net_recv_request(VIRTIODevice *s, int queue_idx, + int desc_idx, int read_size, + int write_size) +{ + VIRTIONetDevice *s1 = (VIRTIONetDevice *)s; + EthernetDevice *es = s1->es; + VIRTIONetHeader h; + uint8_t *buf; + int len; + + if (queue_idx == 1) { + /* send to network */ + if (memcpy_from_queue(s, &h, queue_idx, desc_idx, 0, s1->header_size) < 0) + return 0; + len = read_size - s1->header_size; + buf = malloc(len); + memcpy_from_queue(s, buf, queue_idx, desc_idx, s1->header_size, len); + es->write_packet(es, buf, len); + free(buf); + virtio_consume_desc(s, queue_idx, desc_idx, 0); + } + return 0; +} + +static BOOL virtio_net_can_write_packet(EthernetDevice *es) +{ + VIRTIODevice *s = es->device_opaque; + QueueState *qs = &s->queue[0]; + uint16_t avail_idx; + + if (!qs->ready) + return FALSE; + avail_idx = virtio_read16(s, qs->avail_addr + 2); + return qs->last_avail_idx != avail_idx; +} + +static void virtio_net_write_packet(EthernetDevice *es, const uint8_t *buf, int buf_len) +{ + VIRTIODevice *s = es->device_opaque; + VIRTIONetDevice *s1 = (VIRTIONetDevice *)s; + int queue_idx = 0; + QueueState *qs = &s->queue[queue_idx]; + int desc_idx; + VIRTIONetHeader h; + int len, read_size, write_size; + uint16_t avail_idx; + + if (!qs->ready) + return; + avail_idx = virtio_read16(s, qs->avail_addr + 2); + if (qs->last_avail_idx == avail_idx) + return; + desc_idx = virtio_read16(s, qs->avail_addr + 4 + + (qs->last_avail_idx & (qs->num - 1)) * 2); + if (get_desc_rw_size(s, &read_size, &write_size, queue_idx, desc_idx)) + return; + len = s1->header_size + buf_len; + if (len > write_size) + return; + memset(&h, 0, s1->header_size); + memcpy_to_queue(s, queue_idx, desc_idx, 0, &h, s1->header_size); + memcpy_to_queue(s, queue_idx, desc_idx, s1->header_size, buf, buf_len); + virtio_consume_desc(s, queue_idx, desc_idx, len); + qs->last_avail_idx++; +} + +static void virtio_net_set_carrier(EthernetDevice *es, BOOL carrier_state) +{ +#if 0 + VIRTIODevice *s1 = es->device_opaque; + VIRTIONetDevice *s = (VIRTIONetDevice *)s1; + int cur_carrier_state; + + // printf("virtio_net_set_carrier: %d\n", carrier_state); + cur_carrier_state = s->common.config_space[6] & 1; + if (cur_carrier_state != carrier_state) { + s->common.config_space[6] = (carrier_state << 0); + virtio_config_change_notify(s1); + } +#endif +} + +VIRTIODevice *virtio_net_init(VIRTIOBusDef *bus, EthernetDevice *es) +{ + VIRTIONetDevice *s; + + s = mallocz(sizeof(*s)); + virtio_init(&s->common, bus, + 1, 6 + 2, virtio_net_recv_request); + /* VIRTIO_NET_F_MAC, VIRTIO_NET_F_STATUS */ + s->common.device_features = (1 << 5) /* | (1 << 16) */; + s->common.queue[0].manual_recv = TRUE; + s->es = es; + memcpy(s->common.config_space, es->mac_addr, 6); + /* status */ + s->common.config_space[6] = 0; + s->common.config_space[7] = 0; + + s->header_size = sizeof(VIRTIONetHeader); + + es->device_opaque = s; + es->device_can_write_packet = virtio_net_can_write_packet; + es->device_write_packet = virtio_net_write_packet; + es->device_set_carrier = virtio_net_set_carrier; + return (VIRTIODevice *)s; +} + +/*********************************************************************/ +/* console device */ + +typedef struct VIRTIOConsoleDevice { + VIRTIODevice common; + CharacterDevice *cs; +} VIRTIOConsoleDevice; + +static int virtio_console_recv_request(VIRTIODevice *s, int queue_idx, + int desc_idx, int read_size, + int write_size) +{ + VIRTIOConsoleDevice *s1 = (VIRTIOConsoleDevice *)s; + CharacterDevice *cs = s1->cs; + uint8_t *buf; + + if (queue_idx == 1) { + /* send to console */ + buf = malloc(read_size); + memcpy_from_queue(s, buf, queue_idx, desc_idx, 0, read_size); + cs->write_data(cs->opaque, buf, read_size); + free(buf); + virtio_consume_desc(s, queue_idx, desc_idx, 0); + } + return 0; +} + +BOOL virtio_console_can_write_data(VIRTIODevice *s) +{ + QueueState *qs = &s->queue[0]; + uint16_t avail_idx; + + if (!qs->ready) + return FALSE; + avail_idx = virtio_read16(s, qs->avail_addr + 2); + return qs->last_avail_idx != avail_idx; +} + +int virtio_console_get_write_len(VIRTIODevice *s) +{ + int queue_idx = 0; + QueueState *qs = &s->queue[queue_idx]; + int desc_idx; + int read_size, write_size; + uint16_t avail_idx; + + if (!qs->ready) + return 0; + avail_idx = virtio_read16(s, qs->avail_addr + 2); + if (qs->last_avail_idx == avail_idx) + return 0; + desc_idx = virtio_read16(s, qs->avail_addr + 4 + + (qs->last_avail_idx & (qs->num - 1)) * 2); + if (get_desc_rw_size(s, &read_size, &write_size, queue_idx, desc_idx)) + return 0; + return write_size; +} + +int virtio_console_write_data(VIRTIODevice *s, const uint8_t *buf, int buf_len) +{ + int queue_idx = 0; + QueueState *qs = &s->queue[queue_idx]; + int desc_idx; + uint16_t avail_idx; + + if (!qs->ready) + return 0; + avail_idx = virtio_read16(s, qs->avail_addr + 2); + if (qs->last_avail_idx == avail_idx) + return 0; + desc_idx = virtio_read16(s, qs->avail_addr + 4 + + (qs->last_avail_idx & (qs->num - 1)) * 2); + memcpy_to_queue(s, queue_idx, desc_idx, 0, buf, buf_len); + virtio_consume_desc(s, queue_idx, desc_idx, buf_len); + qs->last_avail_idx++; + return buf_len; +} + +/* send a resize event */ +void virtio_console_resize_event(VIRTIODevice *s, int width, int height) +{ + /* indicate the console size */ + put_le16(s->config_space + 0, width); + put_le16(s->config_space + 2, height); + + virtio_config_change_notify(s); +} + +VIRTIODevice *virtio_console_init(VIRTIOBusDef *bus, CharacterDevice *cs) +{ + VIRTIOConsoleDevice *s; + + s = mallocz(sizeof(*s)); + virtio_init(&s->common, bus, + 3, 4, virtio_console_recv_request); + s->common.device_features = (1 << 0); /* VIRTIO_CONSOLE_F_SIZE */ + s->common.queue[0].manual_recv = TRUE; + + s->cs = cs; + return (VIRTIODevice *)s; +} + +/*********************************************************************/ +/* input device */ + +enum { + VIRTIO_INPUT_CFG_UNSET = 0x00, + VIRTIO_INPUT_CFG_ID_NAME = 0x01, + VIRTIO_INPUT_CFG_ID_SERIAL = 0x02, + VIRTIO_INPUT_CFG_ID_DEVIDS = 0x03, + VIRTIO_INPUT_CFG_PROP_BITS = 0x10, + VIRTIO_INPUT_CFG_EV_BITS = 0x11, + VIRTIO_INPUT_CFG_ABS_INFO = 0x12, +}; + +#define VIRTIO_INPUT_EV_SYN 0x00 +#define VIRTIO_INPUT_EV_KEY 0x01 +#define VIRTIO_INPUT_EV_REL 0x02 +#define VIRTIO_INPUT_EV_ABS 0x03 +#define VIRTIO_INPUT_EV_REP 0x14 + +#define BTN_LEFT 0x110 +#define BTN_RIGHT 0x111 +#define BTN_MIDDLE 0x112 +#define BTN_GEAR_DOWN 0x150 +#define BTN_GEAR_UP 0x151 + +#define REL_X 0x00 +#define REL_Y 0x01 +#define REL_Z 0x02 +#define REL_WHEEL 0x08 + +#define ABS_X 0x00 +#define ABS_Y 0x01 +#define ABS_Z 0x02 + +typedef struct VIRTIOInputDevice { + VIRTIODevice common; + VirtioInputTypeEnum type; + uint32_t buttons_state; +} VIRTIOInputDevice; + +static const uint16_t buttons_list[] = { + BTN_LEFT, BTN_RIGHT, BTN_MIDDLE +}; + +static int virtio_input_recv_request(VIRTIODevice *s, int queue_idx, + int desc_idx, int read_size, + int write_size) +{ + if (queue_idx == 1) { + /* led & keyboard updates */ + // printf("%s: write_size=%d\n", __func__, write_size); + virtio_consume_desc(s, queue_idx, desc_idx, 0); + } + return 0; +} + +/* return < 0 if could not send key event */ +static int virtio_input_queue_event(VIRTIODevice *s, + uint16_t type, uint16_t code, + uint32_t value) +{ + int queue_idx = 0; + QueueState *qs = &s->queue[queue_idx]; + int desc_idx, buf_len; + uint16_t avail_idx; + uint8_t buf[8]; + + if (!qs->ready) + return -1; + + put_le16(buf, type); + put_le16(buf + 2, code); + put_le32(buf + 4, value); + buf_len = 8; + + avail_idx = virtio_read16(s, qs->avail_addr + 2); + if (qs->last_avail_idx == avail_idx) + return -1; + desc_idx = virtio_read16(s, qs->avail_addr + 4 + + (qs->last_avail_idx & (qs->num - 1)) * 2); + // printf("send: queue_idx=%d desc_idx=%d\n", queue_idx, desc_idx); + memcpy_to_queue(s, queue_idx, desc_idx, 0, buf, buf_len); + virtio_consume_desc(s, queue_idx, desc_idx, buf_len); + qs->last_avail_idx++; + return 0; +} + +int virtio_input_send_key_event(VIRTIODevice *s, BOOL is_down, + uint16_t key_code) +{ + VIRTIOInputDevice *s1 = (VIRTIOInputDevice *)s; + int ret; + + if (s1->type != VIRTIO_INPUT_TYPE_KEYBOARD) + return -1; + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_KEY, key_code, is_down); + if (ret) + return ret; + return virtio_input_queue_event(s, VIRTIO_INPUT_EV_SYN, 0, 0); +} + +/* also used for the tablet */ +int virtio_input_send_mouse_event(VIRTIODevice *s, int dx, int dy, int dz, + unsigned int buttons) +{ + VIRTIOInputDevice *s1 = (VIRTIOInputDevice *)s; + int ret, i, b, last_b; + + if (s1->type != VIRTIO_INPUT_TYPE_MOUSE && + s1->type != VIRTIO_INPUT_TYPE_TABLET) + return -1; + if (s1->type == VIRTIO_INPUT_TYPE_MOUSE) { + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_REL, REL_X, dx); + if (ret != 0) + return ret; + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_REL, REL_Y, dy); + if (ret != 0) + return ret; + } else { + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_ABS, ABS_X, dx); + if (ret != 0) + return ret; + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_ABS, ABS_Y, dy); + if (ret != 0) + return ret; + } + if (dz != 0) { + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_REL, REL_WHEEL, dz); + if (ret != 0) + return ret; + } + + if (buttons != s1->buttons_state) { + for(i = 0; i < countof(buttons_list); i++) { + b = (buttons >> i) & 1; + last_b = (s1->buttons_state >> i) & 1; + if (b != last_b) { + ret = virtio_input_queue_event(s, VIRTIO_INPUT_EV_KEY, + buttons_list[i], b); + if (ret != 0) + return ret; + } + } + s1->buttons_state = buttons; + } + + return virtio_input_queue_event(s, VIRTIO_INPUT_EV_SYN, 0, 0); +} + +static void set_bit(uint8_t *tab, int k) +{ + tab[k >> 3] |= 1 << (k & 7); +} + +static void virtio_input_config_write(VIRTIODevice *s) +{ + VIRTIOInputDevice *s1 = (VIRTIOInputDevice *)s; + uint8_t *config = s->config_space; + int i; + + // printf("config_write: %02x %02x\n", config[0], config[1]); + switch(config[0]) { + case VIRTIO_INPUT_CFG_UNSET: + break; + case VIRTIO_INPUT_CFG_ID_NAME: + { + const char *name; + int len; + switch(s1->type) { + case VIRTIO_INPUT_TYPE_KEYBOARD: + name = "virtio_keyboard"; + break; + case VIRTIO_INPUT_TYPE_MOUSE: + name = "virtio_mouse"; + break; + case VIRTIO_INPUT_TYPE_TABLET: + name = "virtio_tablet"; + break; + default: + abort(); + } + len = strlen(name); + config[2] = len; + memcpy(config + 8, name, len); + } + break; + default: + case VIRTIO_INPUT_CFG_ID_SERIAL: + case VIRTIO_INPUT_CFG_ID_DEVIDS: + case VIRTIO_INPUT_CFG_PROP_BITS: + config[2] = 0; /* size of reply */ + break; + case VIRTIO_INPUT_CFG_EV_BITS: + config[2] = 0; + switch(s1->type) { + case VIRTIO_INPUT_TYPE_KEYBOARD: + switch(config[1]) { + case VIRTIO_INPUT_EV_KEY: + config[2] = 128 / 8; + memset(config + 8, 0xff, 128 / 8); /* bitmap */ + break; + case VIRTIO_INPUT_EV_REP: /* allow key repetition */ + config[2] = 1; + break; + default: + break; + } + break; + case VIRTIO_INPUT_TYPE_MOUSE: + switch(config[1]) { + case VIRTIO_INPUT_EV_KEY: + config[2] = 512 / 8; + memset(config + 8, 0, 512 / 8); /* bitmap */ + for(i = 0; i < countof(buttons_list); i++) + set_bit(config + 8, buttons_list[i]); + break; + case VIRTIO_INPUT_EV_REL: + config[2] = 2; + config[8] = 0; + config[9] = 0; + set_bit(config + 8, REL_X); + set_bit(config + 8, REL_Y); + set_bit(config + 8, REL_WHEEL); + break; + default: + break; + } + break; + case VIRTIO_INPUT_TYPE_TABLET: + switch(config[1]) { + case VIRTIO_INPUT_EV_KEY: + config[2] = 512 / 8; + memset(config + 8, 0, 512 / 8); /* bitmap */ + for(i = 0; i < countof(buttons_list); i++) + set_bit(config + 8, buttons_list[i]); + break; + case VIRTIO_INPUT_EV_REL: + config[2] = 2; + config[8] = 0; + config[9] = 0; + set_bit(config + 8, REL_WHEEL); + break; + case VIRTIO_INPUT_EV_ABS: + config[2] = 1; + config[8] = 0; + set_bit(config + 8, ABS_X); + set_bit(config + 8, ABS_Y); + break; + default: + break; + } + break; + default: + abort(); + } + break; + case VIRTIO_INPUT_CFG_ABS_INFO: + if (s1->type == VIRTIO_INPUT_TYPE_TABLET && config[1] <= 1) { + /* for ABS_X and ABS_Y */ + config[2] = 5 * 4; + put_le32(config + 8, 0); /* min */ + put_le32(config + 12, VIRTIO_INPUT_ABS_SCALE - 1) ; /* max */ + put_le32(config + 16, 0); /* fuzz */ + put_le32(config + 20, 0); /* flat */ + put_le32(config + 24, 0); /* res */ + } + break; + } +} + +VIRTIODevice *virtio_input_init(VIRTIOBusDef *bus, VirtioInputTypeEnum type) +{ + VIRTIOInputDevice *s; + + s = mallocz(sizeof(*s)); + virtio_init(&s->common, bus, + 18, 256, virtio_input_recv_request); + s->common.queue[0].manual_recv = TRUE; + s->common.device_features = 0; + s->common.config_write = virtio_input_config_write; + s->type = type; + return (VIRTIODevice *)s; +} + +/*********************************************************************/ +/* 9p filesystem device */ + +typedef struct { + struct list_head link; + uint32_t fid; + FSFile *fd; +} FIDDesc; + +typedef struct VIRTIO9PDevice { + VIRTIODevice common; + FSDevice *fs; + int msize; /* maximum message size */ + struct list_head fid_list; /* list of FIDDesc */ + BOOL req_in_progress; +} VIRTIO9PDevice; + +static FIDDesc *fid_find1(VIRTIO9PDevice *s, uint32_t fid) +{ + struct list_head *el; + FIDDesc *f; + + list_for_each(el, &s->fid_list) { + f = list_entry(el, FIDDesc, link); + if (f->fid == fid) + return f; + } + return NULL; +} + +static FSFile *fid_find(VIRTIO9PDevice *s, uint32_t fid) +{ + FIDDesc *f; + + f = fid_find1(s, fid); + if (!f) + return NULL; + return f->fd; +} + +static void fid_delete(VIRTIO9PDevice *s, uint32_t fid) +{ + FIDDesc *f; + + f = fid_find1(s, fid); + if (f) { + s->fs->fs_delete(s->fs, f->fd); + list_del(&f->link); + free(f); + } +} + +static void fid_set(VIRTIO9PDevice *s, uint32_t fid, FSFile *fd) +{ + FIDDesc *f; + + f = fid_find1(s, fid); + if (f) { + s->fs->fs_delete(s->fs, f->fd); + f->fd = fd; + } else { + f = malloc(sizeof(*f)); + f->fid = fid; + f->fd = fd; + list_add(&f->link, &s->fid_list); + } +} + +#ifdef DEBUG_VIRTIO + +typedef struct { + uint8_t tag; + const char *name; +} Virtio9POPName; + +static const Virtio9POPName virtio_9p_op_names[] = { + { 8, "statfs" }, + { 12, "lopen" }, + { 14, "lcreate" }, + { 16, "symlink" }, + { 18, "mknod" }, + { 22, "readlink" }, + { 24, "getattr" }, + { 26, "setattr" }, + { 30, "xattrwalk" }, + { 40, "readdir" }, + { 50, "fsync" }, + { 52, "lock" }, + { 54, "getlock" }, + { 70, "link" }, + { 72, "mkdir" }, + { 74, "renameat" }, + { 76, "unlinkat" }, + { 100, "version" }, + { 104, "attach" }, + { 108, "flush" }, + { 110, "walk" }, + { 116, "read" }, + { 118, "write" }, + { 120, "clunk" }, + { 0, NULL }, +}; + +static const char *get_9p_op_name(int tag) +{ + const Virtio9POPName *p; + for(p = virtio_9p_op_names; p->name != NULL; p++) { + if (p->tag == tag) + return p->name; + } + return NULL; +} + +#endif /* DEBUG_VIRTIO */ + +static int marshall(VIRTIO9PDevice *s, + uint8_t *buf1, int max_len, const char *fmt, ...) +{ + va_list ap; + int c; + uint32_t val; + uint64_t val64; + uint8_t *buf, *buf_end; + +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" ->"); +#endif + va_start(ap, fmt); + buf = buf1; + buf_end = buf1 + max_len; + for(;;) { + c = *fmt++; + if (c == '\0') + break; + switch(c) { + case 'b': + assert(buf + 1 <= buf_end); + val = va_arg(ap, int); +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" b=%d", val); +#endif + buf[0] = val; + buf += 1; + break; + case 'h': + assert(buf + 2 <= buf_end); + val = va_arg(ap, int); +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" h=%d", val); +#endif + put_le16(buf, val); + buf += 2; + break; + case 'w': + assert(buf + 4 <= buf_end); + val = va_arg(ap, int); +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" w=%d", val); +#endif + put_le32(buf, val); + buf += 4; + break; + case 'd': + assert(buf + 8 <= buf_end); + val64 = va_arg(ap, uint64_t); +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" d=%" PRId64, val64); +#endif + put_le64(buf, val64); + buf += 8; + break; + case 's': + { + char *str; + int len; + str = va_arg(ap, char *); +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" s=\"%s\"", str); +#endif + len = strlen(str); + assert(len <= 65535); + assert(buf + 2 + len <= buf_end); + put_le16(buf, len); + buf += 2; + memcpy(buf, str, len); + buf += len; + } + break; + case 'Q': + { + FSQID *qid; + assert(buf + 13 <= buf_end); + qid = va_arg(ap, FSQID *); +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" Q=%d:%d:%" PRIu64, qid->type, qid->version, qid->path); +#endif + buf[0] = qid->type; + put_le32(buf + 1, qid->version); + put_le64(buf + 5, qid->path); + buf += 13; + } + break; + default: + abort(); + } + } + va_end(ap); + return buf - buf1; +} + +/* return < 0 if error */ +/* XXX: free allocated strings in case of error */ +static int unmarshall(VIRTIO9PDevice *s, int queue_idx, + int desc_idx, int *poffset, const char *fmt, ...) +{ + VIRTIODevice *s1 = (VIRTIODevice *)s; + va_list ap; + int offset, c; + uint8_t buf[16]; + + offset = *poffset; + va_start(ap, fmt); + for(;;) { + c = *fmt++; + if (c == '\0') + break; + switch(c) { + case 'b': + { + uint8_t *ptr; + if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 1)) + return -1; + ptr = va_arg(ap, uint8_t *); + *ptr = buf[0]; + offset += 1; +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" b=%d", *ptr); +#endif + } + break; + case 'h': + { + uint16_t *ptr; + if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 2)) + return -1; + ptr = va_arg(ap, uint16_t *); + *ptr = get_le16(buf); + offset += 2; +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" h=%d", *ptr); +#endif + } + break; + case 'w': + { + uint32_t *ptr; + if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 4)) + return -1; + ptr = va_arg(ap, uint32_t *); + *ptr = get_le32(buf); + offset += 4; +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" w=%d", *ptr); +#endif + } + break; + case 'd': + { + uint64_t *ptr; + if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 8)) + return -1; + ptr = va_arg(ap, uint64_t *); + *ptr = get_le64(buf); + offset += 8; +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" d=%" PRId64, *ptr); +#endif + } + break; + case 's': + { + char *str, **ptr; + int len; + + if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, 2)) + return -1; + len = get_le16(buf); + offset += 2; + str = malloc(len + 1); + if (memcpy_from_queue(s1, str, queue_idx, desc_idx, offset, len)) + return -1; + str[len] = '\0'; + offset += len; + ptr = va_arg(ap, char **); + *ptr = str; +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) + printf(" s=\"%s\"", *ptr); +#endif + } + break; + default: + abort(); + } + } + va_end(ap); + *poffset = offset; + return 0; +} + +static void virtio_9p_send_reply(VIRTIO9PDevice *s, int queue_idx, + int desc_idx, uint8_t id, uint16_t tag, + uint8_t *buf, int buf_len) +{ + uint8_t *buf1; + int len; + +#ifdef DEBUG_VIRTIO + if (s->common.debug & VIRTIO_DEBUG_9P) { + if (id == 6) + printf(" (error)"); + printf("\n"); + } +#endif + len = buf_len + 7; + buf1 = malloc(len); + put_le32(buf1, len); + buf1[4] = id + 1; + put_le16(buf1 + 5, tag); + memcpy(buf1 + 7, buf, buf_len); + memcpy_to_queue((VIRTIODevice *)s, queue_idx, desc_idx, 0, buf1, len); + virtio_consume_desc((VIRTIODevice *)s, queue_idx, desc_idx, len); + free(buf1); +} + +static void virtio_9p_send_error(VIRTIO9PDevice *s, int queue_idx, + int desc_idx, uint16_t tag, uint32_t error) +{ + uint8_t buf[4]; + int buf_len; + + buf_len = marshall(s, buf, sizeof(buf), "w", -error); + virtio_9p_send_reply(s, queue_idx, desc_idx, 6, tag, buf, buf_len); +} + +typedef struct { + VIRTIO9PDevice *dev; + int queue_idx; + int desc_idx; + uint16_t tag; +} P9OpenInfo; + +static void virtio_9p_open_reply(FSDevice *fs, FSQID *qid, int err, + P9OpenInfo *oi) +{ + VIRTIO9PDevice *s = oi->dev; + uint8_t buf[32]; + int buf_len; + + if (err < 0) { + virtio_9p_send_error(s, oi->queue_idx, oi->desc_idx, oi->tag, err); + } else { + buf_len = marshall(s, buf, sizeof(buf), + "Qw", qid, s->msize - 24); + virtio_9p_send_reply(s, oi->queue_idx, oi->desc_idx, 12, oi->tag, + buf, buf_len); + } + free(oi); +} + +static void virtio_9p_open_cb(FSDevice *fs, FSQID *qid, int err, + void *opaque) +{ + P9OpenInfo *oi = opaque; + VIRTIO9PDevice *s = oi->dev; + int queue_idx = oi->queue_idx; + + virtio_9p_open_reply(fs, qid, err, oi); + + s->req_in_progress = FALSE; + + /* handle next requests */ + queue_notify((VIRTIODevice *)s, queue_idx); +} + +static int virtio_9p_recv_request(VIRTIODevice *s1, int queue_idx, + int desc_idx, int read_size, + int write_size) +{ + VIRTIO9PDevice *s = (VIRTIO9PDevice *)s1; + int offset, header_len; + uint8_t id; + uint16_t tag; + uint8_t buf[1024]; + int buf_len, err; + FSDevice *fs = s->fs; + + if (queue_idx != 0) + return 0; + + if (s->req_in_progress) + return -1; + + offset = 0; + header_len = 4 + 1 + 2; + if (memcpy_from_queue(s1, buf, queue_idx, desc_idx, offset, header_len)) { + tag = 0; + goto protocol_error; + } + //size = get_le32(buf); + id = buf[4]; + tag = get_le16(buf + 5); + offset += header_len; + +#ifdef DEBUG_VIRTIO + if (s1->debug & VIRTIO_DEBUG_9P) { + const char *name; + name = get_9p_op_name(id); + printf("9p: op="); + if (name) + printf("%s", name); + else + printf("%d", id); + } +#endif + /* Note: same subset as JOR1K */ + switch(id) { + case 8: /* statfs */ + { + FSStatFS st; + + fs->fs_statfs(fs, &st); + buf_len = marshall(s, buf, sizeof(buf), + "wwddddddw", + 0, + st.f_bsize, + st.f_blocks, + st.f_bfree, + st.f_bavail, + st.f_files, + st.f_ffree, + 0, /* id */ + 256 /* max filename length */ + ); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 12: /* lopen */ + { + uint32_t fid, flags; + FSFile *f; + FSQID qid; + P9OpenInfo *oi; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "ww", &fid, &flags)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + oi = malloc(sizeof(*oi)); + oi->dev = s; + oi->queue_idx = queue_idx; + oi->desc_idx = desc_idx; + oi->tag = tag; + err = fs->fs_open(fs, &qid, f, flags, virtio_9p_open_cb, oi); + if (err <= 0) { + virtio_9p_open_reply(fs, &qid, err, oi); + } else { + s->req_in_progress = TRUE; + } + } + break; + case 14: /* lcreate */ + { + uint32_t fid, flags, mode, gid; + char *name; + FSFile *f; + FSQID qid; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wswww", &fid, &name, &flags, &mode, &gid)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) { + err = -P9_EPROTO; + } else { + err = fs->fs_create(fs, &qid, f, name, flags, mode, gid); + } + free(name); + if (err) + goto error; + buf_len = marshall(s, buf, sizeof(buf), + "Qw", &qid, s->msize - 24); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 16: /* symlink */ + { + uint32_t fid, gid; + char *name, *symgt; + FSFile *f; + FSQID qid; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wssw", &fid, &name, &symgt, &gid)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) { + err = -P9_EPROTO; + } else { + err = fs->fs_symlink(fs, &qid, f, name, symgt, gid); + } + free(name); + free(symgt); + if (err) + goto error; + buf_len = marshall(s, buf, sizeof(buf), + "Q", &qid); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 18: /* mknod */ + { + uint32_t fid, mode, major, minor, gid; + char *name; + FSFile *f; + FSQID qid; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wswwww", &fid, &name, &mode, &major, &minor, &gid)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) { + err = -P9_EPROTO; + } else { + err = fs->fs_mknod(fs, &qid, f, name, mode, major, minor, gid); + } + free(name); + if (err) + goto error; + buf_len = marshall(s, buf, sizeof(buf), + "Q", &qid); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 22: /* readlink */ + { + uint32_t fid; + char buf1[1024]; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "w", &fid)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) { + err = -P9_EPROTO; + } else { + err = fs->fs_readlink(fs, buf1, sizeof(buf1), f); + } + if (err) + goto error; + buf_len = marshall(s, buf, sizeof(buf), "s", buf1); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 24: /* getattr */ + { + uint32_t fid; + uint64_t mask; + FSFile *f; + FSStat st; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wd", &fid, &mask)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + err = fs->fs_stat(fs, f, &st); + if (err) + goto error; + + buf_len = marshall(s, buf, sizeof(buf), + "dQwwwddddddddddddddd", + mask, &st.qid, + st.st_mode, st.st_uid, st.st_gid, + st.st_nlink, st.st_rdev, st.st_size, + st.st_blksize, st.st_blocks, + st.st_atime_sec, (uint64_t)st.st_atime_nsec, + st.st_mtime_sec, (uint64_t)st.st_mtime_nsec, + st.st_ctime_sec, (uint64_t)st.st_ctime_nsec, + (uint64_t)0, (uint64_t)0, + (uint64_t)0, (uint64_t)0); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 26: /* setattr */ + { + uint32_t fid, mask, mode, uid, gid; + uint64_t size, atime_sec, atime_nsec, mtime_sec, mtime_nsec; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wwwwwddddd", &fid, &mask, &mode, &uid, &gid, + &size, &atime_sec, &atime_nsec, + &mtime_sec, &mtime_nsec)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + err = fs->fs_setattr(fs, f, mask, mode, uid, gid, size, atime_sec, + atime_nsec, mtime_sec, mtime_nsec); + if (err) + goto error; + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + case 30: /* xattrwalk */ + { + /* not supported yet */ + err = -P9_ENOTSUP; + goto error; + } + break; + case 40: /* readdir */ + { + uint32_t fid, count; + uint64_t offs; + uint8_t *buf; + int n; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wdw", &fid, &offs, &count)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + buf = malloc(count + 4); + n = fs->fs_readdir(fs, f, offs, buf + 4, count); + if (n < 0) { + err = n; + goto error; + } + put_le32(buf, n); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, n + 4); + free(buf); + } + break; + case 50: /* fsync */ + { + uint32_t fid; + if (unmarshall(s, queue_idx, desc_idx, &offset, + "w", &fid)) + goto protocol_error; + /* ignored */ + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + case 52: /* lock */ + { + uint32_t fid; + FSFile *f; + FSLock lock; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wbwddws", &fid, &lock.type, &lock.flags, + &lock.start, &lock.length, + &lock.proc_id, &lock.client_id)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + err = -P9_EPROTO; + else + err = fs->fs_lock(fs, f, &lock); + free(lock.client_id); + if (err < 0) + goto error; + buf_len = marshall(s, buf, sizeof(buf), "b", err); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 54: /* getlock */ + { + uint32_t fid; + FSFile *f; + FSLock lock; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wbddws", &fid, &lock.type, + &lock.start, &lock.length, + &lock.proc_id, &lock.client_id)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + err = -P9_EPROTO; + else + err = fs->fs_getlock(fs, f, &lock); + if (err < 0) { + free(lock.client_id); + goto error; + } + buf_len = marshall(s, buf, sizeof(buf), "bddws", + &lock.type, + &lock.start, &lock.length, + &lock.proc_id, &lock.client_id); + free(lock.client_id); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 70: /* link */ + { + uint32_t dfid, fid; + char *name; + FSFile *f, *df; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wws", &dfid, &fid, &name)) + goto protocol_error; + df = fid_find(s, dfid); + f = fid_find(s, fid); + if (!df || !f) { + err = -P9_EPROTO; + } else { + err = fs->fs_link(fs, df, f, name); + } + free(name); + if (err) + goto error; + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + case 72: /* mkdir */ + { + uint32_t fid, mode, gid; + char *name; + FSFile *f; + FSQID qid; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wsww", &fid, &name, &mode, &gid)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + err = fs->fs_mkdir(fs, &qid, f, name, mode, gid); + if (err != 0) + goto error; + buf_len = marshall(s, buf, sizeof(buf), "Q", &qid); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 74: /* renameat */ + { + uint32_t fid, new_fid; + char *name, *new_name; + FSFile *f, *new_f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wsws", &fid, &name, &new_fid, &new_name)) + goto protocol_error; + f = fid_find(s, fid); + new_f = fid_find(s, new_fid); + if (!f || !new_f) { + err = -P9_EPROTO; + } else { + err = fs->fs_renameat(fs, f, name, new_f, new_name); + } + free(name); + free(new_name); + if (err != 0) + goto error; + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + case 76: /* unlinkat */ + { + uint32_t fid, flags; + char *name; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wsw", &fid, &name, &flags)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) { + err = -P9_EPROTO; + } else { + err = fs->fs_unlinkat(fs, f, name); + } + free(name); + if (err != 0) + goto error; + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + case 100: /* version */ + { + uint32_t msize; + char *version; + if (unmarshall(s, queue_idx, desc_idx, &offset, + "ws", &msize, &version)) + goto protocol_error; + s->msize = msize; + // printf("version: msize=%d version=%s\n", msize, version); + free(version); + buf_len = marshall(s, buf, sizeof(buf), "ws", s->msize, "9P2000.L"); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 104: /* attach */ + { + uint32_t fid, afid, uid; + char *uname, *aname; + FSQID qid; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wwssw", &fid, &afid, &uname, &aname, &uid)) + goto protocol_error; + err = fs->fs_attach(fs, &f, &qid, uid, uname, aname); + if (err != 0) + goto error; + fid_set(s, fid, f); + free(uname); + free(aname); + buf_len = marshall(s, buf, sizeof(buf), "Q", &qid); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 108: /* flush */ + { + uint16_t oldtag; + if (unmarshall(s, queue_idx, desc_idx, &offset, + "h", &oldtag)) + goto protocol_error; + /* ignored */ + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + case 110: /* walk */ + { + uint32_t fid, newfid; + uint16_t nwname; + FSQID *qids; + char **names; + FSFile *f; + int i; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wwh", &fid, &newfid, &nwname)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + names = mallocz(sizeof(names[0]) * nwname); + qids = malloc(sizeof(qids[0]) * nwname); + for(i = 0; i < nwname; i++) { + if (unmarshall(s, queue_idx, desc_idx, &offset, + "s", &names[i])) { + err = -P9_EPROTO; + goto walk_done; + } + } + err = fs->fs_walk(fs, &f, qids, f, nwname, names); + walk_done: + for(i = 0; i < nwname; i++) { + free(names[i]); + } + free(names); + if (err < 0) { + free(qids); + goto error; + } + buf_len = marshall(s, buf, sizeof(buf), "h", err); + for(i = 0; i < err; i++) { + buf_len += marshall(s, buf + buf_len, sizeof(buf) - buf_len, + "Q", &qids[i]); + } + free(qids); + fid_set(s, newfid, f); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 116: /* read */ + { + uint32_t fid, count; + uint64_t offs; + uint8_t *buf; + int n; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wdw", &fid, &offs, &count)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + buf = malloc(count + 4); + n = fs->fs_read(fs, f, offs, buf + 4, count); + if (n < 0) { + err = n; + free(buf); + goto error; + } + put_le32(buf, n); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, n + 4); + free(buf); + } + break; + case 118: /* write */ + { + uint32_t fid, count; + uint64_t offs; + uint8_t *buf1; + int n; + FSFile *f; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "wdw", &fid, &offs, &count)) + goto protocol_error; + f = fid_find(s, fid); + if (!f) + goto fid_not_found; + buf1 = malloc(count); + if (memcpy_from_queue(s1, buf1, queue_idx, desc_idx, offset, + count)) { + free(buf1); + goto protocol_error; + } + n = fs->fs_write(fs, f, offs, buf1, count); + free(buf1); + if (n < 0) { + err = n; + goto error; + } + buf_len = marshall(s, buf, sizeof(buf), "w", n); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, buf, buf_len); + } + break; + case 120: /* clunk */ + { + uint32_t fid; + + if (unmarshall(s, queue_idx, desc_idx, &offset, + "w", &fid)) + goto protocol_error; + fid_delete(s, fid); + virtio_9p_send_reply(s, queue_idx, desc_idx, id, tag, NULL, 0); + } + break; + default: + printf("9p: unsupported operation id=%d\n", id); + goto protocol_error; + } + return 0; + error: + virtio_9p_send_error(s, queue_idx, desc_idx, tag, err); + return 0; + protocol_error: + fid_not_found: + err = -P9_EPROTO; + goto error; +} + +VIRTIODevice *virtio_9p_init(VIRTIOBusDef *bus, FSDevice *fs, + const char *mount_tag) + +{ + VIRTIO9PDevice *s; + int len; + uint8_t *cfg; + + len = strlen(mount_tag); + s = mallocz(sizeof(*s)); + virtio_init(&s->common, bus, + 9, 2 + len, virtio_9p_recv_request); + s->common.device_features = 1 << 0; + + /* set the mount tag */ + cfg = s->common.config_space; + cfg[0] = len; + cfg[1] = len >> 8; + memcpy(cfg + 2, mount_tag, len); + + s->fs = fs; + s->msize = 8192; + init_list_head(&s->fid_list); + + return (VIRTIODevice *)s; +} + diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h new file mode 100644 index 0000000..d53c8c4 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/virtio.h @@ -0,0 +1,146 @@ +/* + * VIRTIO driver + * + * Copyright (c) 2016 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef VIRTIO_H +#define VIRTIO_H + +#include <sys/select.h> + +#include "iomem.h" +#include "pci.h" + +#define VIRTIO_PAGE_SIZE 4096 + +#if defined(EMSCRIPTEN) +#define VIRTIO_ADDR_BITS 32 +#else +#define VIRTIO_ADDR_BITS 64 +#endif + +#if VIRTIO_ADDR_BITS == 64 +typedef uint64_t virtio_phys_addr_t; +#else +typedef uint32_t virtio_phys_addr_t; +#endif + +typedef struct { + /* PCI only: */ + PCIBus *pci_bus; + /* MMIO only: */ + PhysMemoryMap *mem_map; + uint64_t addr; + IRQSignal *irq; +} VIRTIOBusDef; + +typedef struct VIRTIODevice VIRTIODevice; + +#define VIRTIO_DEBUG_IO (1 << 0) +#define VIRTIO_DEBUG_9P (1 << 1) + +void virtio_set_debug(VIRTIODevice *s, int debug_flags); + +/* block device */ + +typedef void BlockDeviceCompletionFunc(void *opaque, int ret); + +typedef struct BlockDevice BlockDevice; + +struct BlockDevice { + int64_t (*get_sector_count)(BlockDevice *bs); + int (*read_async)(BlockDevice *bs, + uint64_t sector_num, uint8_t *buf, int n, + BlockDeviceCompletionFunc *cb, void *opaque); + int (*write_async)(BlockDevice *bs, + uint64_t sector_num, const uint8_t *buf, int n, + BlockDeviceCompletionFunc *cb, void *opaque); + void *opaque; +}; + +VIRTIODevice *virtio_block_init(VIRTIOBusDef *bus, BlockDevice *bs); + +/* network device */ + +typedef struct EthernetDevice EthernetDevice; + +struct EthernetDevice { + uint8_t mac_addr[6]; /* mac address of the interface */ + void (*write_packet)(EthernetDevice *net, + const uint8_t *buf, int len); + void *opaque; +#if !defined(EMSCRIPTEN) + void (*select_fill)(EthernetDevice *net, int *pfd_max, + fd_set *rfds, fd_set *wfds, fd_set *efds, + int *pdelay); + void (*select_poll)(EthernetDevice *net, + fd_set *rfds, fd_set *wfds, fd_set *efds, + int select_ret); +#endif + /* the following is set by the device */ + void *device_opaque; + BOOL (*device_can_write_packet)(EthernetDevice *net); + void (*device_write_packet)(EthernetDevice *net, + const uint8_t *buf, int len); + void (*device_set_carrier)(EthernetDevice *net, BOOL carrier_state); +}; + +VIRTIODevice *virtio_net_init(VIRTIOBusDef *bus, EthernetDevice *es); + +/* console device */ + +typedef struct { + void *opaque; + void (*write_data)(void *opaque, const uint8_t *buf, int len); + int (*read_data)(void *opaque, uint8_t *buf, int len); +} CharacterDevice; + +VIRTIODevice *virtio_console_init(VIRTIOBusDef *bus, CharacterDevice *cs); +BOOL virtio_console_can_write_data(VIRTIODevice *s); +int virtio_console_get_write_len(VIRTIODevice *s); +int virtio_console_write_data(VIRTIODevice *s, const uint8_t *buf, int buf_len); +void virtio_console_resize_event(VIRTIODevice *s, int width, int height); + +/* input device */ + +typedef enum { + VIRTIO_INPUT_TYPE_KEYBOARD, + VIRTIO_INPUT_TYPE_MOUSE, + VIRTIO_INPUT_TYPE_TABLET, +} VirtioInputTypeEnum; + +#define VIRTIO_INPUT_ABS_SCALE 32768 + +int virtio_input_send_key_event(VIRTIODevice *s, BOOL is_down, + uint16_t key_code); +int virtio_input_send_mouse_event(VIRTIODevice *s, int dx, int dy, int dz, + unsigned int buttons); + +VIRTIODevice *virtio_input_init(VIRTIOBusDef *bus, VirtioInputTypeEnum type); + +/* 9p filesystem device */ + +#include "fs.h" + +VIRTIODevice *virtio_9p_init(VIRTIOBusDef *bus, FSDevice *fs, + const char *mount_tag); + +#endif /* VIRTIO_H */ diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c b/jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c new file mode 100644 index 0000000..927e510 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/vmmouse.c @@ -0,0 +1,162 @@ +/* + * VM mouse emulation + * + * Copyright (c) 2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "iomem.h" +#include "ps2.h" + +#define VMPORT_MAGIC 0x564D5868 + +#define REG_EAX 0 +#define REG_EBX 1 +#define REG_ECX 2 +#define REG_EDX 3 +#define REG_ESI 4 +#define REG_EDI 5 + +#define FIFO_SIZE (4 * 16) + +struct VMMouseState { + PS2MouseState *ps2_mouse; + int fifo_count, fifo_rindex, fifo_windex; + BOOL enabled; + BOOL absolute; + uint32_t fifo_buf[FIFO_SIZE]; +}; + +static void put_queue(VMMouseState *s, uint32_t val) +{ + if (s->fifo_count >= FIFO_SIZE) + return; + s->fifo_buf[s->fifo_windex] = val; + if (++s->fifo_windex == FIFO_SIZE) + s->fifo_windex = 0; + s->fifo_count++; +} + +static void read_data(VMMouseState *s, uint32_t *regs, int size) +{ + int i; + if (size > 6 || size > s->fifo_count) { + // printf("vmmouse: read error req=%d count=%d\n", size, s->fifo_count); + s->enabled = FALSE; + return; + } + for(i = 0; i < size; i++) { + regs[i] = s->fifo_buf[s->fifo_rindex]; + if (++s->fifo_rindex == FIFO_SIZE) + s->fifo_rindex = 0; + } + s->fifo_count -= size; +} + +void vmmouse_send_mouse_event(VMMouseState *s, int x, int y, int dz, + int buttons) +{ + int state; + + if (!s->enabled) { + ps2_mouse_event(s->ps2_mouse, x, y, dz, buttons); + return; + } + + if ((s->fifo_count + 4) > FIFO_SIZE) + return; + + state = 0; + if (buttons & 1) + state |= 0x20; + if (buttons & 2) + state |= 0x10; + if (buttons & 4) + state |= 0x08; + if (s->absolute) { + /* range = 0 ... 65535 */ + x *= 2; + y *= 2; + } + + put_queue(s, state); + put_queue(s, x); + put_queue(s, y); + put_queue(s, -dz); + + /* send PS/2 mouse event */ + ps2_mouse_event(s->ps2_mouse, 1, 0, 0, 0); +} + +void vmmouse_handler(VMMouseState *s, uint32_t *regs) +{ + uint32_t cmd; + + cmd = regs[REG_ECX] & 0xff; + switch(cmd) { + case 10: /* get version */ + regs[REG_EBX] = VMPORT_MAGIC; + break; + case 39: /* VMMOUSE_DATA */ + read_data(s, regs, regs[REG_EBX]); + break; + case 40: /* VMMOUSE_STATUS */ + regs[REG_EAX] = ((s->enabled ? 0 : 0xffff) << 16) | s->fifo_count; + break; + case 41: /* VMMOUSE_COMMAND */ + switch(regs[REG_EBX]) { + case 0x45414552: /* read id */ + if (s->fifo_count < FIFO_SIZE) { + put_queue(s, 0x3442554a); + s->enabled = TRUE; + } + break; + case 0x000000f5: /* disable */ + s->enabled = FALSE; + break; + case 0x4c455252: /* set relative */ + s->absolute = 0; + break; + case 0x53424152: /* set absolute */ + s->absolute = 1; + break; + } + break; + } +} + +BOOL vmmouse_is_absolute(VMMouseState *s) +{ + return s->absolute; +} + +VMMouseState *vmmouse_init(PS2MouseState *ps2_mouse) +{ + VMMouseState *s; + s = mallocz(sizeof(*s)); + s->ps2_mouse = ps2_mouse; + return s; +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c new file mode 100644 index 0000000..e599ab8 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.c @@ -0,0 +1,96 @@ +/* + * x86 CPU emulator stub + * + * Copyright (c) 2011-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> + +#include "cutils.h" +#include "x86_cpu.h" + +X86CPUState *x86_cpu_init(PhysMemoryMap *mem_map) +{ + fprintf(stderr, "x86 emulator is not supported\n"); + exit(1); +} + +void x86_cpu_end(X86CPUState *s) +{ +} + +void x86_cpu_interp(X86CPUState *s, int max_cycles1) +{ +} + +void x86_cpu_set_irq(X86CPUState *s, BOOL set) +{ +} + +void x86_cpu_set_reg(X86CPUState *s, int reg, uint32_t val) +{ +} + +uint32_t x86_cpu_get_reg(X86CPUState *s, int reg) +{ + return 0; +} + +void x86_cpu_set_seg(X86CPUState *s, int seg, const X86CPUSeg *sd) +{ +} + +void x86_cpu_set_get_hard_intno(X86CPUState *s, + int (*get_hard_intno)(void *opaque), + void *opaque) +{ +} + +void x86_cpu_set_get_tsc(X86CPUState *s, + uint64_t (*get_tsc)(void *opaque), + void *opaque) +{ +} + +void x86_cpu_set_port_io(X86CPUState *s, + DeviceReadFunc *port_read, DeviceWriteFunc *port_write, + void *opaque) +{ +} + +int64_t x86_cpu_get_cycles(X86CPUState *s) +{ + return 0; +} + +BOOL x86_cpu_get_power_down(X86CPUState *s) +{ + return FALSE; +} + +void x86_cpu_flush_tlb_write_range_ram(X86CPUState *s, + uint8_t *ram_ptr, size_t ram_size) +{ +} diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h new file mode 100644 index 0000000..254f7f5 --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_cpu.h @@ -0,0 +1,70 @@ +/* + * x86 CPU emulator + * + * Copyright (c) 2011-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "iomem.h" + +typedef struct X86CPUState X86CPUState; + +/* get_reg/set_reg additional constants */ +#define X86_CPU_REG_EIP 8 +#define X86_CPU_REG_CR0 9 +#define X86_CPU_REG_CR2 10 + +#define X86_CPU_SEG_ES 0 +#define X86_CPU_SEG_CS 1 +#define X86_CPU_SEG_SS 2 +#define X86_CPU_SEG_DS 3 +#define X86_CPU_SEG_FS 4 +#define X86_CPU_SEG_GS 5 +#define X86_CPU_SEG_LDT 6 +#define X86_CPU_SEG_TR 7 +#define X86_CPU_SEG_GDT 8 +#define X86_CPU_SEG_IDT 9 + +typedef struct { + uint16_t sel; + uint16_t flags; + uint32_t base; + uint32_t limit; +} X86CPUSeg; + +X86CPUState *x86_cpu_init(PhysMemoryMap *mem_map); +void x86_cpu_end(X86CPUState *s); +void x86_cpu_interp(X86CPUState *s, int max_cycles1); +void x86_cpu_set_irq(X86CPUState *s, BOOL set); +void x86_cpu_set_reg(X86CPUState *s, int reg, uint32_t val); +uint32_t x86_cpu_get_reg(X86CPUState *s, int reg); +void x86_cpu_set_seg(X86CPUState *s, int seg, const X86CPUSeg *sd); +void x86_cpu_set_get_hard_intno(X86CPUState *s, + int (*get_hard_intno)(void *opaque), + void *opaque); +void x86_cpu_set_get_tsc(X86CPUState *s, + uint64_t (*get_tsc)(void *opaque), + void *opaque); +void x86_cpu_set_port_io(X86CPUState *s, + DeviceReadFunc *port_read, DeviceWriteFunc *port_write, + void *opaque); +int64_t x86_cpu_get_cycles(X86CPUState *s); +BOOL x86_cpu_get_power_down(X86CPUState *s); +void x86_cpu_flush_tlb_write_range_ram(X86CPUState *s, + uint8_t *ram_ptr, size_t ram_size); diff --git a/jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c new file mode 100644 index 0000000..db8f6bb --- /dev/null +++ b/jslinux-2019-12-21/tinyemu-2019-12-21/x86_machine.c @@ -0,0 +1,2569 @@ +/* + * PC emulator + * + * Copyright (c) 2011-2017 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <inttypes.h> +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <unistd.h> +#include <time.h> +#include <sys/time.h> + +#include "cutils.h" +#include "iomem.h" +#include "virtio.h" +#include "x86_cpu.h" +#include "machine.h" +#include "pci.h" +#include "ide.h" +#include "ps2.h" + +#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__)) +#define USE_KVM +#endif + +#ifdef USE_KVM +#include <linux/kvm.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include <signal.h> +#include <sys/time.h> +#endif + +//#define DEBUG_BIOS +//#define DUMP_IOPORT + +/***********************************************************/ +/* cmos emulation */ + +//#define DEBUG_CMOS + +#define RTC_SECONDS 0 +#define RTC_SECONDS_ALARM 1 +#define RTC_MINUTES 2 +#define RTC_MINUTES_ALARM 3 +#define RTC_HOURS 4 +#define RTC_HOURS_ALARM 5 +#define RTC_ALARM_DONT_CARE 0xC0 + +#define RTC_DAY_OF_WEEK 6 +#define RTC_DAY_OF_MONTH 7 +#define RTC_MONTH 8 +#define RTC_YEAR 9 + +#define RTC_REG_A 10 +#define RTC_REG_B 11 +#define RTC_REG_C 12 +#define RTC_REG_D 13 + +#define REG_A_UIP 0x80 + +#define REG_B_SET 0x80 +#define REG_B_PIE 0x40 +#define REG_B_AIE 0x20 +#define REG_B_UIE 0x10 + +typedef struct { + uint8_t cmos_index; + uint8_t cmos_data[128]; + IRQSignal *irq; + BOOL use_local_time; + /* used for the periodic irq */ + uint32_t irq_timeout; + uint32_t irq_period; +} CMOSState; + +static void cmos_write(void *opaque, uint32_t offset, + uint32_t data, int size_log2); +static uint32_t cmos_read(void *opaque, uint32_t offset, int size_log2); + +static int to_bcd(CMOSState *s, unsigned int a) +{ + if (s->cmos_data[RTC_REG_B] & 0x04) { + return a; + } else { + return ((a / 10) << 4) | (a % 10); + } +} + +static void cmos_update_time(CMOSState *s, BOOL set_century) +{ + struct timeval tv; + struct tm tm; + time_t ti; + int val; + + gettimeofday(&tv, NULL); + ti = tv.tv_sec; + if (s->use_local_time) { + localtime_r(&ti, &tm); + } else { + gmtime_r(&ti, &tm); + } + + s->cmos_data[RTC_SECONDS] = to_bcd(s, tm.tm_sec); + s->cmos_data[RTC_MINUTES] = to_bcd(s, tm.tm_min); + if (s->cmos_data[RTC_REG_B] & 0x02) { + s->cmos_data[RTC_HOURS] = to_bcd(s, tm.tm_hour); + } else { + s->cmos_data[RTC_HOURS] = to_bcd(s, tm.tm_hour % 12); + if (tm.tm_hour >= 12) + s->cmos_data[RTC_HOURS] |= 0x80; + } + s->cmos_data[RTC_DAY_OF_WEEK] = to_bcd(s, tm.tm_wday); + s->cmos_data[RTC_DAY_OF_MONTH] = to_bcd(s, tm.tm_mday); + s->cmos_data[RTC_MONTH] = to_bcd(s, tm.tm_mon + 1); + s->cmos_data[RTC_YEAR] = to_bcd(s, tm.tm_year % 100); + + if (set_century) { + /* not set by the hardware, but easier to do it here */ + val = to_bcd(s, (tm.tm_year / 100) + 19); + s->cmos_data[0x32] = val; + s->cmos_data[0x37] = val; + } + + /* update in progress flag: 8/32768 seconds after change */ + if (tv.tv_usec < 244) { + s->cmos_data[RTC_REG_A] |= REG_A_UIP; + } else { + s->cmos_data[RTC_REG_A] &= ~REG_A_UIP; + } +} + +CMOSState *cmos_init(PhysMemoryMap *port_map, int addr, + IRQSignal *irq, BOOL use_local_time) +{ + CMOSState *s; + + s = mallocz(sizeof(*s)); + s->use_local_time = use_local_time; + + s->cmos_index = 0; + + s->cmos_data[RTC_REG_A] = 0x26; + s->cmos_data[RTC_REG_B] = 0x02; + s->cmos_data[RTC_REG_C] = 0x00; + s->cmos_data[RTC_REG_D] = 0x80; + + cmos_update_time(s, TRUE); + + s->irq = irq; + + cpu_register_device(port_map, addr, 2, s, cmos_read, cmos_write, + DEVIO_SIZE8); + return s; +} + +#define CMOS_FREQ 32768 + +static uint32_t cmos_get_timer(CMOSState *s) +{ + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint32_t)ts.tv_sec * CMOS_FREQ + + ((uint64_t)ts.tv_nsec * CMOS_FREQ / 1000000000); +} + +static void cmos_update_timer(CMOSState *s) +{ + int period_code; + + period_code = s->cmos_data[RTC_REG_A] & 0x0f; + if ((s->cmos_data[RTC_REG_B] & REG_B_PIE) && + period_code != 0) { + if (period_code <= 2) + period_code += 7; + s->irq_period = 1 << (period_code - 1); + s->irq_timeout = (cmos_get_timer(s) + s->irq_period) & + ~(s->irq_period - 1); + } +} + +/* XXX: could return a delay, but we don't need high precision + (Windows 2000 uses it for delay calibration) */ +static void cmos_update_irq(CMOSState *s) +{ + uint32_t d; + if (s->cmos_data[RTC_REG_B] & REG_B_PIE) { + d = cmos_get_timer(s) - s->irq_timeout; + if ((int32_t)d >= 0) { + /* this is not what the real RTC does. Here we sent the IRQ + immediately */ + s->cmos_data[RTC_REG_C] |= 0xc0; + set_irq(s->irq, 1); + /* update for the next irq */ + s->irq_timeout += s->irq_period; + } + } +} + +static void cmos_write(void *opaque, uint32_t offset, + uint32_t data, int size_log2) +{ + CMOSState *s = opaque; + + if (offset == 0) { + s->cmos_index = data & 0x7f; + } else { +#ifdef DEBUG_CMOS + printf("cmos_write: reg=0x%02x val=0x%02x\n", s->cmos_index, data); +#endif + switch(s->cmos_index) { + case RTC_REG_A: + s->cmos_data[RTC_REG_A] = (data & ~REG_A_UIP) | + (s->cmos_data[RTC_REG_A] & REG_A_UIP); + cmos_update_timer(s); + break; + case RTC_REG_B: + s->cmos_data[s->cmos_index] = data; + cmos_update_timer(s); + break; + default: + s->cmos_data[s->cmos_index] = data; + break; + } + } +} + +static uint32_t cmos_read(void *opaque, uint32_t offset, int size_log2) +{ + CMOSState *s = opaque; + int ret; + + if (offset == 0) { + return 0xff; + } else { + switch(s->cmos_index) { + case RTC_SECONDS: + case RTC_MINUTES: + case RTC_HOURS: + case RTC_DAY_OF_WEEK: + case RTC_DAY_OF_MONTH: + case RTC_MONTH: + case RTC_YEAR: + case RTC_REG_A: + cmos_update_time(s, FALSE); + ret = s->cmos_data[s->cmos_index]; + break; + case RTC_REG_C: + ret = s->cmos_data[s->cmos_index]; + s->cmos_data[RTC_REG_C] = 0x00; + set_irq(s->irq, 0); + break; + default: + ret = s->cmos_data[s->cmos_index]; + } +#ifdef DEBUG_CMOS + printf("cmos_read: reg=0x%02x val=0x%02x\n", s->cmos_index, ret); +#endif + return ret; + } +} + +/***********************************************************/ +/* 8259 pic emulation */ + +//#define DEBUG_PIC + +typedef void PICUpdateIRQFunc(void *opaque); + +typedef struct { + uint8_t last_irr; /* edge detection */ + uint8_t irr; /* interrupt request register */ + uint8_t imr; /* interrupt mask register */ + uint8_t isr; /* interrupt service register */ + uint8_t priority_add; /* used to compute irq priority */ + uint8_t irq_base; + uint8_t read_reg_select; + uint8_t special_mask; + uint8_t init_state; + uint8_t auto_eoi; + uint8_t rotate_on_autoeoi; + uint8_t init4; /* true if 4 byte init */ + uint8_t elcr; /* PIIX edge/trigger selection*/ + uint8_t elcr_mask; + PICUpdateIRQFunc *update_irq; + void *opaque; +} PICState; + +static void pic_reset(PICState *s); +static void pic_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +static uint32_t pic_read(void *opaque, uint32_t offset, int size_log2); +static void pic_elcr_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +static uint32_t pic_elcr_read(void *opaque, uint32_t offset, int size_log2); + +PICState *pic_init(PhysMemoryMap *port_map, int port, int elcr_port, + int elcr_mask, + PICUpdateIRQFunc *update_irq, void *opaque) +{ + PICState *s; + + s = mallocz(sizeof(*s)); + s->elcr_mask = elcr_mask; + s->update_irq = update_irq; + s->opaque = opaque; + cpu_register_device(port_map, port, 2, s, + pic_read, pic_write, DEVIO_SIZE8); + cpu_register_device(port_map, elcr_port, 1, s, + pic_elcr_read, pic_elcr_write, DEVIO_SIZE8); + pic_reset(s); + return s; +} + +static void pic_reset(PICState *s) +{ + /* all 8 bit registers */ + s->last_irr = 0; /* edge detection */ + s->irr = 0; /* interrupt request register */ + s->imr = 0; /* interrupt mask register */ + s->isr = 0; /* interrupt service register */ + s->priority_add = 0; /* used to compute irq priority */ + s->irq_base = 0; + s->read_reg_select = 0; + s->special_mask = 0; + s->init_state = 0; + s->auto_eoi = 0; + s->rotate_on_autoeoi = 0; + s->init4 = 0; /* true if 4 byte init */ +} + +/* set irq level. If an edge is detected, then the IRR is set to 1 */ +static void pic_set_irq1(PICState *s, int irq, int level) +{ + int mask; + mask = 1 << irq; + if (s->elcr & mask) { + /* level triggered */ + if (level) { + s->irr |= mask; + s->last_irr |= mask; + } else { + s->irr &= ~mask; + s->last_irr &= ~mask; + } + } else { + /* edge triggered */ + if (level) { + if ((s->last_irr & mask) == 0) + s->irr |= mask; + s->last_irr |= mask; + } else { + s->last_irr &= ~mask; + } + } +} + +static int pic_get_priority(PICState *s, int mask) +{ + int priority; + if (mask == 0) + return -1; + priority = 7; + while ((mask & (1 << ((priority + s->priority_add) & 7))) == 0) + priority--; + return priority; +} + +/* return the pic wanted interrupt. return -1 if none */ +static int pic_get_irq(PICState *s) +{ + int mask, cur_priority, priority; + + mask = s->irr & ~s->imr; + priority = pic_get_priority(s, mask); + if (priority < 0) + return -1; + /* compute current priority */ + cur_priority = pic_get_priority(s, s->isr); + if (priority > cur_priority) { + /* higher priority found: an irq should be generated */ + return priority; + } else { + return -1; + } +} + +/* acknowledge interrupt 'irq' */ +static void pic_intack(PICState *s, int irq) +{ + if (s->auto_eoi) { + if (s->rotate_on_autoeoi) + s->priority_add = (irq + 1) & 7; + } else { + s->isr |= (1 << irq); + } + /* We don't clear a level sensitive interrupt here */ + if (!(s->elcr & (1 << irq))) + s->irr &= ~(1 << irq); +} + +static void pic_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + PICState *s = opaque; + int priority, addr; + + addr = offset & 1; +#ifdef DEBUG_PIC + console.log("pic_write: addr=" + toHex2(addr) + " val=" + toHex2(val)); +#endif + if (addr == 0) { + if (val & 0x10) { + /* init */ + pic_reset(s); + s->init_state = 1; + s->init4 = val & 1; + if (val & 0x02) + abort(); /* "single mode not supported" */ + if (val & 0x08) + abort(); /* "level sensitive irq not supported" */ + } else if (val & 0x08) { + if (val & 0x02) + s->read_reg_select = val & 1; + if (val & 0x40) + s->special_mask = (val >> 5) & 1; + } else { + switch(val) { + case 0x00: + case 0x80: + s->rotate_on_autoeoi = val >> 7; + break; + case 0x20: /* end of interrupt */ + case 0xa0: + priority = pic_get_priority(s, s->isr); + if (priority >= 0) { + s->isr &= ~(1 << ((priority + s->priority_add) & 7)); + } + if (val == 0xa0) + s->priority_add = (s->priority_add + 1) & 7; + break; + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + priority = val & 7; + s->isr &= ~(1 << priority); + break; + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc4: + case 0xc5: + case 0xc6: + case 0xc7: + s->priority_add = (val + 1) & 7; + break; + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + priority = val & 7; + s->isr &= ~(1 << priority); + s->priority_add = (priority + 1) & 7; + break; + } + } + } else { + switch(s->init_state) { + case 0: + /* normal mode */ + s->imr = val; + s->update_irq(s->opaque); + break; + case 1: + s->irq_base = val & 0xf8; + s->init_state = 2; + break; + case 2: + if (s->init4) { + s->init_state = 3; + } else { + s->init_state = 0; + } + break; + case 3: + s->auto_eoi = (val >> 1) & 1; + s->init_state = 0; + break; + } + } +} + +static uint32_t pic_read(void *opaque, uint32_t offset, int size_log2) +{ + PICState *s = opaque; + int addr, ret; + + addr = offset & 1; + if (addr == 0) { + if (s->read_reg_select) + ret = s->isr; + else + ret = s->irr; + } else { + ret = s->imr; + } +#ifdef DEBUG_PIC + console.log("pic_read: addr=" + toHex2(addr1) + " val=" + toHex2(ret)); +#endif + return ret; +} + +static void pic_elcr_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + PICState *s = opaque; + s->elcr = val & s->elcr_mask; +} + +static uint32_t pic_elcr_read(void *opaque, uint32_t offset, int size_log2) +{ + PICState *s = opaque; + return s->elcr; +} + +typedef struct { + PICState *pics[2]; + int irq_requested; + void (*cpu_set_irq)(void *opaque, int level); + void *opaque; +#if defined(DEBUG_PIC) + uint8_t irq_level[16]; +#endif + IRQSignal *irqs; +} PIC2State; + +static void pic2_update_irq(void *opaque); +static void pic2_set_irq(void *opaque, int irq, int level); + +PIC2State *pic2_init(PhysMemoryMap *port_map, uint32_t addr0, uint32_t addr1, + uint32_t elcr_addr0, uint32_t elcr_addr1, + void (*cpu_set_irq)(void *opaque, int level), + void *opaque, IRQSignal *irqs) +{ + PIC2State *s; + int i; + + s = mallocz(sizeof(*s)); + + for(i = 0; i < 16; i++) { + irq_init(&irqs[i], pic2_set_irq, s, i); + } + s->cpu_set_irq = cpu_set_irq; + s->opaque = opaque; + s->pics[0] = pic_init(port_map, addr0, elcr_addr0, 0xf8, pic2_update_irq, s); + s->pics[1] = pic_init(port_map, addr1, elcr_addr1, 0xde, pic2_update_irq, s); + s->irq_requested = 0; + return s; +} + +void pic2_set_elcr(PIC2State *s, const uint8_t *elcr) +{ + int i; + for(i = 0; i < 2; i++) { + s->pics[i]->elcr = elcr[i] & s->pics[i]->elcr_mask; + } +} + +/* raise irq to CPU if necessary. must be called every time the active + irq may change */ +static void pic2_update_irq(void *opaque) +{ + PIC2State *s = opaque; + int irq2, irq; + + /* first look at slave pic */ + irq2 = pic_get_irq(s->pics[1]); + if (irq2 >= 0) { + /* if irq request by slave pic, signal master PIC */ + pic_set_irq1(s->pics[0], 2, 1); + pic_set_irq1(s->pics[0], 2, 0); + } + /* look at requested irq */ + irq = pic_get_irq(s->pics[0]); +#if 0 + console.log("irr=" + toHex2(s->pics[0].irr) + " imr=" + toHex2(s->pics[0].imr) + " isr=" + toHex2(s->pics[0].isr) + " irq="+ irq); +#endif + if (irq >= 0) { + /* raise IRQ request on the CPU */ + s->cpu_set_irq(s->opaque, 1); + } else { + /* lower irq */ + s->cpu_set_irq(s->opaque, 0); + } +} + +static void pic2_set_irq(void *opaque, int irq, int level) +{ + PIC2State *s = opaque; +#if defined(DEBUG_PIC) + if (irq != 0 && level != s->irq_level[irq]) { + console.log("pic_set_irq: irq=" + irq + " level=" + level); + s->irq_level[irq] = level; + } +#endif + pic_set_irq1(s->pics[irq >> 3], irq & 7, level); + pic2_update_irq(s); +} + +/* called from the CPU to get the hardware interrupt number */ +static int pic2_get_hard_intno(PIC2State *s) +{ + int irq, irq2, intno; + + irq = pic_get_irq(s->pics[0]); + if (irq >= 0) { + pic_intack(s->pics[0], irq); + if (irq == 2) { + irq2 = pic_get_irq(s->pics[1]); + if (irq2 >= 0) { + pic_intack(s->pics[1], irq2); + } else { + /* spurious IRQ on slave controller */ + irq2 = 7; + } + intno = s->pics[1]->irq_base + irq2; + irq = irq2 + 8; + } else { + intno = s->pics[0]->irq_base + irq; + } + } else { + /* spurious IRQ on host controller */ + irq = 7; + intno = s->pics[0]->irq_base + irq; + } + pic2_update_irq(s); + +#if defined(DEBUG_PIC) + if (irq != 0 && irq != 14) + printf("pic_interrupt: irq=%d\n", irq); +#endif + return intno; +} + +/***********************************************************/ +/* 8253 PIT emulation */ + +#define PIT_FREQ 1193182 + +#define RW_STATE_LSB 0 +#define RW_STATE_MSB 1 +#define RW_STATE_WORD0 2 +#define RW_STATE_WORD1 3 +#define RW_STATE_LATCHED_WORD0 4 +#define RW_STATE_LATCHED_WORD1 5 + +//#define DEBUG_PIT + +typedef int64_t PITGetTicksFunc(void *opaque); + +typedef struct PITState PITState; + +typedef struct { + PITState *pit_state; + uint32_t count; + uint32_t latched_count; + uint8_t rw_state; + uint8_t mode; + uint8_t bcd; + uint8_t gate; + int64_t count_load_time; + int64_t last_irq_time; +} PITChannel; + +struct PITState { + PITChannel pit_channels[3]; + uint8_t speaker_data_on; + PITGetTicksFunc *get_ticks; + IRQSignal *irq; + void *opaque; +}; + +static void pit_load_count(PITChannel *pc, int val); +static void pit_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +static uint32_t pit_read(void *opaque, uint32_t offset, int size_log2); +static void speaker_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +static uint32_t speaker_read(void *opaque, uint32_t offset, int size_log2); + +PITState *pit_init(PhysMemoryMap *port_map, int addr0, int addr1, + IRQSignal *irq, + PITGetTicksFunc *get_ticks, void *opaque) +{ + PITState *s; + PITChannel *pc; + int i; + + s = mallocz(sizeof(*s)); + + s->irq = irq; + s->get_ticks = get_ticks; + s->opaque = opaque; + + for(i = 0; i < 3; i++) { + pc = &s->pit_channels[i]; + pc->pit_state = s; + pc->mode = 3; + pc->gate = (i != 2) >> 0; + pit_load_count(pc, 0); + } + s->speaker_data_on = 0; + + cpu_register_device(port_map, addr0, 4, s, pit_read, pit_write, + DEVIO_SIZE8); + + cpu_register_device(port_map, addr1, 1, s, speaker_read, speaker_write, + DEVIO_SIZE8); + return s; +} + +/* unit = PIT frequency */ +static int64_t pit_get_time(PITChannel *pc) +{ + PITState *s = pc->pit_state; + return s->get_ticks(s->opaque); +} + +static uint32_t pit_get_count(PITChannel *pc) +{ + uint32_t counter; + uint64_t d; + + d = pit_get_time(pc) - pc->count_load_time; + switch(pc->mode) { + case 0: + case 1: + case 4: + case 5: + counter = (pc->count - d) & 0xffff; + break; + default: + counter = pc->count - (d % pc->count); + break; + } + return counter; +} + +/* get pit output bit */ +static int pit_get_out(PITChannel *pc) +{ + int out; + int64_t d; + + d = pit_get_time(pc) - pc->count_load_time; + switch(pc->mode) { + default: + case 0: + out = (d >= pc->count) >> 0; + break; + case 1: + out = (d < pc->count) >> 0; + break; + case 2: + /* mode used by Linux */ + if ((d % pc->count) == 0 && d != 0) + out = 1; + else + out = 0; + break; + case 3: + out = ((d % pc->count) < (pc->count >> 1)) >> 0; + break; + case 4: + case 5: + out = (d == pc->count) >> 0; + break; + } + return out; +} + +static void pit_load_count(PITChannel *s, int val) +{ + if (val == 0) + val = 0x10000; + s->count_load_time = pit_get_time(s); + s->last_irq_time = 0; + s->count = val; +} + +static void pit_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + PITState *pit = opaque; + int channel, access, addr; + PITChannel *s; + + addr = offset & 3; +#ifdef DEBUG_PIT + printf("pit_write: off=%d val=0x%02x\n", addr, val); +#endif + if (addr == 3) { + channel = val >> 6; + if (channel == 3) + return; + s = &pit->pit_channels[channel]; + access = (val >> 4) & 3; + switch(access) { + case 0: + s->latched_count = pit_get_count(s); + s->rw_state = RW_STATE_LATCHED_WORD0; + break; + default: + s->mode = (val >> 1) & 7; + s->bcd = val & 1; + s->rw_state = access - 1 + RW_STATE_LSB; + break; + } + } else { + s = &pit->pit_channels[addr]; + switch(s->rw_state) { + case RW_STATE_LSB: + pit_load_count(s, val); + break; + case RW_STATE_MSB: + pit_load_count(s, val << 8); + break; + case RW_STATE_WORD0: + case RW_STATE_WORD1: + if (s->rw_state & 1) { + pit_load_count(s, (s->latched_count & 0xff) | (val << 8)); + } else { + s->latched_count = val; + } + s->rw_state ^= 1; + break; + } + } +} + +static uint32_t pit_read(void *opaque, uint32_t offset, int size_log2) +{ + PITState *pit = opaque; + PITChannel *s; + int ret, count, addr; + + addr = offset & 3; + if (addr == 3) + return 0xff; + + s = &pit->pit_channels[addr]; + switch(s->rw_state) { + case RW_STATE_LSB: + case RW_STATE_MSB: + case RW_STATE_WORD0: + case RW_STATE_WORD1: + count = pit_get_count(s); + if (s->rw_state & 1) + ret = (count >> 8) & 0xff; + else + ret = count & 0xff; + if (s->rw_state & 2) + s->rw_state ^= 1; + break; + default: + case RW_STATE_LATCHED_WORD0: + case RW_STATE_LATCHED_WORD1: + if (s->rw_state & 1) + ret = s->latched_count >> 8; + else + ret = s->latched_count & 0xff; + s->rw_state ^= 1; + break; + } +#ifdef DEBUG_PIT + printf("pit_read: off=%d val=0x%02x\n", addr, ret); +#endif + return ret; +} + +static void speaker_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + PITState *pit = opaque; + pit->speaker_data_on = (val >> 1) & 1; + pit->pit_channels[2].gate = val & 1; +} + +static uint32_t speaker_read(void *opaque, uint32_t offset, int size_log2) +{ + PITState *pit = opaque; + PITChannel *s; + int out, val; + + s = &pit->pit_channels[2]; + out = pit_get_out(s); + val = (pit->speaker_data_on << 1) | s->gate | (out << 5); +#ifdef DEBUG_PIT + // console.log("speaker_read: addr=" + toHex2(addr) + " val=" + toHex2(val)); +#endif + return val; +} + +/* set the IRQ if necessary and return the delay in ms until the next + IRQ. Note: The code does not handle all the PIT configurations. */ +static int pit_update_irq(PITState *pit) +{ + PITChannel *s; + int64_t d, delay; + + s = &pit->pit_channels[0]; + + delay = PIT_FREQ; /* could be infinity delay */ + + d = pit_get_time(s) - s->count_load_time; + switch(s->mode) { + default: + case 0: + case 1: + case 4: + case 5: + if (s->last_irq_time == 0) { + delay = s->count - d; + if (delay <= 0) { + set_irq(pit->irq, 1); + set_irq(pit->irq, 0); + s->last_irq_time = d; + } + } + break; + case 2: /* mode used by Linux */ + case 3: + delay = s->last_irq_time + s->count - d; + if (delay <= 0) { + set_irq(pit->irq, 1); + set_irq(pit->irq, 0); + s->last_irq_time += s->count; + } + break; + } + + if (delay <= 0) + return 0; + else + return delay / (PIT_FREQ / 1000); +} + +/***********************************************************/ +/* serial port emulation */ + +#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */ + +#define UART_IER_MSI 0x08 /* Enable Modem status interrupt */ +#define UART_IER_RLSI 0x04 /* Enable receiver line status interrupt */ +#define UART_IER_THRI 0x02 /* Enable Transmitter holding register int. */ +#define UART_IER_RDI 0x01 /* Enable receiver data interrupt */ + +#define UART_IIR_NO_INT 0x01 /* No interrupts pending */ +#define UART_IIR_ID 0x06 /* Mask for the interrupt ID */ + +#define UART_IIR_MSI 0x00 /* Modem status interrupt */ +#define UART_IIR_THRI 0x02 /* Transmitter holding register empty */ +#define UART_IIR_RDI 0x04 /* Receiver data interrupt */ +#define UART_IIR_RLSI 0x06 /* Receiver line status interrupt */ +#define UART_IIR_FE 0xC0 /* Fifo enabled */ + +#define UART_LSR_TEMT 0x40 /* Transmitter empty */ +#define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */ +#define UART_LSR_BI 0x10 /* Break interrupt indicator */ +#define UART_LSR_FE 0x08 /* Frame error indicator */ +#define UART_LSR_PE 0x04 /* Parity error indicator */ +#define UART_LSR_OE 0x02 /* Overrun error indicator */ +#define UART_LSR_DR 0x01 /* Receiver data ready */ + +#define UART_FCR_XFR 0x04 /* XMIT Fifo Reset */ +#define UART_FCR_RFR 0x02 /* RCVR Fifo Reset */ +#define UART_FCR_FE 0x01 /* FIFO Enable */ + +#define UART_FIFO_LENGTH 16 /* 16550A Fifo Length */ + +typedef struct { + uint8_t divider; + uint8_t rbr; /* receive register */ + uint8_t ier; + uint8_t iir; /* read only */ + uint8_t lcr; + uint8_t mcr; + uint8_t lsr; /* read only */ + uint8_t msr; + uint8_t scr; + uint8_t fcr; + IRQSignal *irq; + void (*write_func)(void *opaque, const uint8_t *buf, int buf_len); + void *opaque; +} SerialState; + +static void serial_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2); +static uint32_t serial_read(void *opaque, uint32_t offset, int size_log2); + +SerialState *serial_init(PhysMemoryMap *port_map, int addr, + IRQSignal *irq, + void (*write_func)(void *opaque, const uint8_t *buf, int buf_len), void *opaque) +{ + SerialState *s; + s = mallocz(sizeof(*s)); + + /* all 8 bit registers */ + s->divider = 0; + s->rbr = 0; /* receive register */ + s->ier = 0; + s->iir = UART_IIR_NO_INT; /* read only */ + s->lcr = 0; + s->mcr = 0; + s->lsr = UART_LSR_TEMT | UART_LSR_THRE; /* read only */ + s->msr = 0; + s->scr = 0; + s->fcr = 0; + + s->irq = irq; + s->write_func = write_func; + s->opaque = opaque; + + cpu_register_device(port_map, addr, 8, s, serial_read, serial_write, + DEVIO_SIZE8); + return s; +} + +static void serial_update_irq(SerialState *s) +{ + if ((s->lsr & UART_LSR_DR) && (s->ier & UART_IER_RDI)) { + s->iir = UART_IIR_RDI; + } else if ((s->lsr & UART_LSR_THRE) && (s->ier & UART_IER_THRI)) { + s->iir = UART_IIR_THRI; + } else { + s->iir = UART_IIR_NO_INT; + } + if (s->iir != UART_IIR_NO_INT) { + set_irq(s->irq, 1); + } else { + set_irq(s->irq, 0); + } +} + +#if 0 +/* send remainining chars in fifo */ +Serial.prototype.write_tx_fifo = function() +{ + if (s->tx_fifo != "") { + s->write_func(s->tx_fifo); + s->tx_fifo = ""; + + s->lsr |= UART_LSR_THRE; + s->lsr |= UART_LSR_TEMT; + s->update_irq(); + } +} +#endif + +static void serial_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ + SerialState *s = opaque; + int addr; + + addr = offset & 7; + switch(addr) { + default: + case 0: + if (s->lcr & UART_LCR_DLAB) { + s->divider = (s->divider & 0xff00) | val; + } else { +#if 0 + if (s->fcr & UART_FCR_FE) { + s->tx_fifo += String.fromCharCode(val); + s->lsr &= ~UART_LSR_THRE; + serial_update_irq(s); + if (s->tx_fifo.length >= UART_FIFO_LENGTH) { + /* write to the terminal */ + s->write_tx_fifo(); + } + } else +#endif + { + uint8_t ch; + s->lsr &= ~UART_LSR_THRE; + serial_update_irq(s); + + /* write to the terminal */ + ch = val; + s->write_func(s->opaque, &ch, 1); + s->lsr |= UART_LSR_THRE; + s->lsr |= UART_LSR_TEMT; + serial_update_irq(s); + } + } + break; + case 1: + if (s->lcr & UART_LCR_DLAB) { + s->divider = (s->divider & 0x00ff) | (val << 8); + } else { + s->ier = val; + serial_update_irq(s); + } + break; + case 2: +#if 0 + if ((s->fcr ^ val) & UART_FCR_FE) { + /* clear fifos */ + val |= UART_FCR_XFR | UART_FCR_RFR; + } + if (val & UART_FCR_XFR) + s->tx_fifo = ""; + if (val & UART_FCR_RFR) + s->rx_fifo = ""; + s->fcr = val & UART_FCR_FE; +#endif + break; + case 3: + s->lcr = val; + break; + case 4: + s->mcr = val; + break; + case 5: + break; + case 6: + s->msr = val; + break; + case 7: + s->scr = val; + break; + } +} + +static uint32_t serial_read(void *opaque, uint32_t offset, int size_log2) +{ + SerialState *s = opaque; + int ret, addr; + + addr = offset & 7; + switch(addr) { + default: + case 0: + if (s->lcr & UART_LCR_DLAB) { + ret = s->divider & 0xff; + } else { + ret = s->rbr; + s->lsr &= ~(UART_LSR_DR | UART_LSR_BI); + serial_update_irq(s); +#if 0 + /* try to receive next chars */ + s->send_char_from_fifo(); +#endif + } + break; + case 1: + if (s->lcr & UART_LCR_DLAB) { + ret = (s->divider >> 8) & 0xff; + } else { + ret = s->ier; + } + break; + case 2: + ret = s->iir; + if (s->fcr & UART_FCR_FE) + ret |= UART_IIR_FE; + break; + case 3: + ret = s->lcr; + break; + case 4: + ret = s->mcr; + break; + case 5: + ret = s->lsr; + break; + case 6: + ret = s->msr; + break; + case 7: + ret = s->scr; + break; + } + return ret; +} + +void serial_send_break(SerialState *s) +{ + s->rbr = 0; + s->lsr |= UART_LSR_BI | UART_LSR_DR; + serial_update_irq(s); +} + +#if 0 +static void serial_send_char(SerialState *s, int ch) +{ + s->rbr = ch; + s->lsr |= UART_LSR_DR; + serial_update_irq(s); +} + +Serial.prototype.send_char_from_fifo = function() +{ + var fifo; + + fifo = s->rx_fifo; + if (fifo != "" && !(s->lsr & UART_LSR_DR)) { + s->send_char(fifo.charCodeAt(0)); + s->rx_fifo = fifo.substr(1, fifo.length - 1); + } +} + +/* queue the string in the UART receive fifo and send it ASAP */ +Serial.prototype.send_chars = function(str) +{ + s->rx_fifo += str; + s->send_char_from_fifo(); +} + +#endif + +#ifdef DEBUG_BIOS +static void bios_debug_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ +#ifdef EMSCRIPTEN + static char line_buf[256]; + static int line_buf_index; + line_buf[line_buf_index++] = val; + if (val == '\n' || line_buf_index >= sizeof(line_buf) - 1) { + line_buf[line_buf_index] = '\0'; + printf("%s", line_buf); + line_buf_index = 0; + } +#else + putchar(val & 0xff); +#endif +} + +static uint32_t bios_debug_read(void *opaque, uint32_t offset, int size_log2) +{ + return 0; +} +#endif + +typedef struct PCMachine { + VirtMachine common; + uint64_t ram_size; + PhysMemoryMap *mem_map; + PhysMemoryMap *port_map; + + X86CPUState *cpu_state; + PIC2State *pic_state; + IRQSignal pic_irq[16]; + PITState *pit_state; + I440FXState *i440fx_state; + CMOSState *cmos_state; + SerialState *serial_state; + + /* input */ + VIRTIODevice *keyboard_dev; + VIRTIODevice *mouse_dev; + KBDState *kbd_state; + PS2MouseState *ps2_mouse; + VMMouseState *vm_mouse; + PS2KbdState *ps2_kbd; + +#ifdef USE_KVM + BOOL kvm_enabled; + int kvm_fd; + int vm_fd; + int vcpu_fd; + int kvm_run_size; + struct kvm_run *kvm_run; +#endif +} PCMachine; + +static void copy_kernel(PCMachine *s, const uint8_t *buf, int buf_len, + const char *cmd_line); + +static void port80_write(void *opaque, uint32_t offset, + uint32_t val64, int size_log2) +{ +} + +static uint32_t port80_read(void *opaque, uint32_t offset, int size_log2) +{ + return 0xff; +} + +static void port92_write(void *opaque, uint32_t offset, + uint32_t val, int size_log2) +{ +} + +static uint32_t port92_read(void *opaque, uint32_t offset, int size_log2) +{ + int a20 = 1; /* A20=0 is not supported */ + return a20 << 1; +} + +#define VMPORT_MAGIC 0x564D5868 +#define REG_EAX 0 +#define REG_EBX 1 +#define REG_ECX 2 +#define REG_EDX 3 +#define REG_ESI 4 +#define REG_EDI 5 + +static uint32_t vmport_read(void *opaque, uint32_t addr, int size_log2) +{ + PCMachine *s = opaque; + uint32_t regs[6]; + +#ifdef USE_KVM + if (s->kvm_enabled) { + struct kvm_regs r; + + ioctl(s->vcpu_fd, KVM_GET_REGS, &r); + regs[REG_EAX] = r.rax; + regs[REG_EBX] = r.rbx; + regs[REG_ECX] = r.rcx; + regs[REG_EDX] = r.rdx; + regs[REG_ESI] = r.rsi; + regs[REG_EDI] = r.rdi; + + if (regs[REG_EAX] == VMPORT_MAGIC) { + + vmmouse_handler(s->vm_mouse, regs); + + /* Note: in 64 bits the high parts are reset to zero + in all cases. */ + r.rax = regs[REG_EAX]; + r.rbx = regs[REG_EBX]; + r.rcx = regs[REG_ECX]; + r.rdx = regs[REG_EDX]; + r.rsi = regs[REG_ESI]; + r.rdi = regs[REG_EDI]; + ioctl(s->vcpu_fd, KVM_SET_REGS, &r); + } + } else +#endif + { + regs[REG_EAX] = x86_cpu_get_reg(s->cpu_state, 0); + regs[REG_EBX] = x86_cpu_get_reg(s->cpu_state, 3); + regs[REG_ECX] = x86_cpu_get_reg(s->cpu_state, 1); + regs[REG_EDX] = x86_cpu_get_reg(s->cpu_state, 2); + regs[REG_ESI] = x86_cpu_get_reg(s->cpu_state, 6); + regs[REG_EDI] = x86_cpu_get_reg(s->cpu_state, 7); + + if (regs[REG_EAX] == VMPORT_MAGIC) { + vmmouse_handler(s->vm_mouse, regs); + + x86_cpu_set_reg(s->cpu_state, 0, regs[REG_EAX]); + x86_cpu_set_reg(s->cpu_state, 3, regs[REG_EBX]); + x86_cpu_set_reg(s->cpu_state, 1, regs[REG_ECX]); + x86_cpu_set_reg(s->cpu_state, 2, regs[REG_EDX]); + x86_cpu_set_reg(s->cpu_state, 6, regs[REG_ESI]); + x86_cpu_set_reg(s->cpu_state, 7, regs[REG_EDI]); + } + } + return regs[REG_EAX]; +} + +static void vmport_write(void *opaque, uint32_t addr, uint32_t val, + int size_log2) +{ +} + +static void pic_set_irq_cb(void *opaque, int level) +{ + PCMachine *s = opaque; + x86_cpu_set_irq(s->cpu_state, level); +} + +static void serial_write_cb(void *opaque, const uint8_t *buf, int buf_len) +{ + PCMachine *s = opaque; + if (s->common.console) { + s->common.console->write_data(s->common.console->opaque, buf, buf_len); + } +} + +static int get_hard_intno_cb(void *opaque) +{ + PCMachine *s = opaque; + return pic2_get_hard_intno(s->pic_state); +} + +static int64_t pit_get_ticks_cb(void *opaque) +{ + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * PIT_FREQ + + ((uint64_t)ts.tv_nsec * PIT_FREQ / 1000000000); +} + +#define FRAMEBUFFER_BASE_ADDR 0xf0400000 + +static uint8_t *get_ram_ptr(PCMachine *s, uint64_t paddr) +{ + PhysMemoryRange *pr; + pr = get_phys_mem_range(s->mem_map, paddr); + if (!pr || !pr->is_ram) + return NULL; + return pr->phys_mem + (uintptr_t)(paddr - pr->addr); +} + +#ifdef DUMP_IOPORT +static BOOL dump_port(int port) +{ + return !((port >= 0x1f0 && port <= 0x1f7) || + (port >= 0x20 && port <= 0x21) || + (port >= 0xa0 && port <= 0xa1)); +} +#endif + +static void st_port(void *opaque, uint32_t port, uint32_t val, int size_log2) +{ + PCMachine *s = opaque; + PhysMemoryRange *pr; +#ifdef DUMP_IOPORT + if (dump_port(port)) + printf("write port=0x%x val=0x%x s=%d\n", port, val, 1 << size_log2); +#endif + pr = get_phys_mem_range(s->port_map, port); + if (!pr) { + return; + } + port -= pr->addr; + if ((pr->devio_flags >> size_log2) & 1) { + pr->write_func(pr->opaque, port, (uint32_t)val, size_log2); + } else if (size_log2 == 1 && (pr->devio_flags & DEVIO_SIZE8)) { + pr->write_func(pr->opaque, port, val & 0xff, 0); + pr->write_func(pr->opaque, port + 1, (val >> 8) & 0xff, 0); + } +} + +static uint32_t ld_port(void *opaque, uint32_t port1, int size_log2) +{ + PCMachine *s = opaque; + PhysMemoryRange *pr; + uint32_t val, port; + + port = port1; + pr = get_phys_mem_range(s->port_map, port); + if (!pr) { + val = -1; + } else { + port -= pr->addr; + if ((pr->devio_flags >> size_log2) & 1) { + val = pr->read_func(pr->opaque, port, size_log2); + } else if (size_log2 == 1 && (pr->devio_flags & DEVIO_SIZE8)) { + val = pr->read_func(pr->opaque, port, 0) & 0xff; + val |= (pr->read_func(pr->opaque, port + 1, 0) & 0xff) << 8; + } else { + val = -1; + } + } +#ifdef DUMP_IOPORT + if (dump_port(port1)) + printf("read port=0x%x val=0x%x s=%d\n", port1, val, 1 << size_log2); +#endif + return val; +} + +static void pc_machine_set_defaults(VirtMachineParams *p) +{ + p->accel_enable = TRUE; +} + +#ifdef USE_KVM + +static void sigalrm_handler(int sig) +{ +} + +#define CPUID_APIC (1 << 9) +#define CPUID_ACPI (1 << 22) + +static void kvm_set_cpuid(PCMachine *s) +{ + struct kvm_cpuid2 *kvm_cpuid; + int n_ent_max, i; + struct kvm_cpuid_entry2 *ent; + + n_ent_max = 128; + kvm_cpuid = mallocz(sizeof(struct kvm_cpuid2) + n_ent_max * sizeof(kvm_cpuid->entries[0])); + + kvm_cpuid->nent = n_ent_max; + if (ioctl(s->kvm_fd, KVM_GET_SUPPORTED_CPUID, kvm_cpuid) < 0) { + perror("KVM_GET_SUPPORTED_CPUID"); + exit(1); + } + + for(i = 0; i < kvm_cpuid->nent; i++) { + ent = &kvm_cpuid->entries[i]; + /* remove the APIC & ACPI to be in sync with the emulator */ + if (ent->function == 1 || ent->function == 0x80000001) { + ent->edx &= ~(CPUID_APIC | CPUID_ACPI); + } + } + + if (ioctl(s->vcpu_fd, KVM_SET_CPUID2, kvm_cpuid) < 0) { + perror("KVM_SET_CPUID2"); + exit(1); + } + free(kvm_cpuid); +} + +/* XXX: should check overlapping mappings */ +static void kvm_map_ram(PhysMemoryMap *mem_map, PhysMemoryRange *pr) +{ + PCMachine *s = mem_map->opaque; + struct kvm_userspace_memory_region region; + int flags; + + region.slot = pr - mem_map->phys_mem_range; + flags = 0; + if (pr->devram_flags & DEVRAM_FLAG_ROM) + flags |= KVM_MEM_READONLY; + if (pr->devram_flags & DEVRAM_FLAG_DIRTY_BITS) + flags |= KVM_MEM_LOG_DIRTY_PAGES; + region.flags = flags; + region.guest_phys_addr = pr->addr; + region.memory_size = pr->size; +#if 0 + printf("map slot %d: %08lx %08lx\n", + region.slot, pr->addr, pr->size); +#endif + region.userspace_addr = (uintptr_t)pr->phys_mem; + if (ioctl(s->vm_fd, KVM_SET_USER_MEMORY_REGION, ®ion) < 0) { + perror("KVM_SET_USER_MEMORY_REGION"); + exit(1); + } +} + +/* XXX: just for one region */ +static PhysMemoryRange *kvm_register_ram(PhysMemoryMap *mem_map, uint64_t addr, + uint64_t size, int devram_flags) +{ + PhysMemoryRange *pr; + uint8_t *phys_mem; + + pr = register_ram_entry(mem_map, addr, size, devram_flags); + + phys_mem = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (!phys_mem) + return NULL; + pr->phys_mem = phys_mem; + if (devram_flags & DEVRAM_FLAG_DIRTY_BITS) { + int n_pages = size >> 12; + pr->dirty_bits_size = ((n_pages + 63) / 64) * 8; + pr->dirty_bits = mallocz(pr->dirty_bits_size); + } + + if (pr->size != 0) { + kvm_map_ram(mem_map, pr); + } + return pr; +} + +static void kvm_set_ram_addr(PhysMemoryMap *mem_map, + PhysMemoryRange *pr, uint64_t addr, BOOL enabled) +{ + if (enabled) { + if (pr->size == 0 || addr != pr->addr) { + /* move or create the region */ + pr->size = pr->org_size; + pr->addr = addr; + kvm_map_ram(mem_map, pr); + } + } else { + if (pr->size != 0) { + pr->addr = 0; + pr->size = 0; + /* map a zero size region to disable */ + kvm_map_ram(mem_map, pr); + } + } +} + +static const uint32_t *kvm_get_dirty_bits(PhysMemoryMap *mem_map, + PhysMemoryRange *pr) +{ + PCMachine *s = mem_map->opaque; + struct kvm_dirty_log dlog; + + if (pr->size == 0) { + /* not mapped: we assume no modification was made */ + memset(pr->dirty_bits, 0, pr->dirty_bits_size); + } else { + dlog.slot = pr - mem_map->phys_mem_range; + dlog.dirty_bitmap = pr->dirty_bits; + if (ioctl(s->vm_fd, KVM_GET_DIRTY_LOG, &dlog) < 0) { + perror("KVM_GET_DIRTY_LOG"); + exit(1); + } + } + return pr->dirty_bits; +} + +static void kvm_free_ram(PhysMemoryMap *mem_map, PhysMemoryRange *pr) +{ + /* XXX: do it */ + munmap(pr->phys_mem, pr->org_size); + free(pr->dirty_bits); +} + +static void kvm_pic_set_irq(void *opaque, int irq_num, int level) +{ + PCMachine *s = opaque; + struct kvm_irq_level irq_level; + irq_level.irq = irq_num; + irq_level.level = level; + if (ioctl(s->vm_fd, KVM_IRQ_LINE, &irq_level) < 0) { + perror("KVM_IRQ_LINE"); + exit(1); + } +} + +static void kvm_init(PCMachine *s) +{ + int ret, i; + struct sigaction act; + struct kvm_pit_config pit_config; + uint64_t base_addr; + + s->kvm_enabled = FALSE; + s->kvm_fd = open("/dev/kvm", O_RDWR); + if (s->kvm_fd < 0) { + fprintf(stderr, "KVM not available\n"); + return; + } + ret = ioctl(s->kvm_fd, KVM_GET_API_VERSION, 0); + if (ret < 0) { + perror("KVM_GET_API_VERSION"); + exit(1); + } + if (ret != 12) { + fprintf(stderr, "Unsupported KVM version\n"); + close(s->kvm_fd); + s->kvm_fd = -1; + return; + } + s->vm_fd = ioctl(s->kvm_fd, KVM_CREATE_VM, 0); + if (s->vm_fd < 0) { + perror("KVM_CREATE_VM"); + exit(1); + } + + /* just before the BIOS */ + base_addr = 0xfffbc000; + if (ioctl(s->vm_fd, KVM_SET_IDENTITY_MAP_ADDR, &base_addr) < 0) { + perror("KVM_SET_IDENTITY_MAP_ADDR"); + exit(1); + } + + if (ioctl(s->vm_fd, KVM_SET_TSS_ADDR, (long)(base_addr + 0x1000)) < 0) { + perror("KVM_SET_TSS_ADDR"); + exit(1); + } + + if (ioctl(s->vm_fd, KVM_CREATE_IRQCHIP, 0) < 0) { + perror("KVM_CREATE_IRQCHIP"); + exit(1); + } + + memset(&pit_config, 0, sizeof(pit_config)); + pit_config.flags = KVM_PIT_SPEAKER_DUMMY; + if (ioctl(s->vm_fd, KVM_CREATE_PIT2, &pit_config)) { + perror("KVM_CREATE_PIT2"); + exit(1); + } + + s->vcpu_fd = ioctl(s->vm_fd, KVM_CREATE_VCPU, 0); + if (s->vcpu_fd < 0) { + perror("KVM_CREATE_VCPU"); + exit(1); + } + + kvm_set_cpuid(s); + + /* map the kvm_run structure */ + s->kvm_run_size = ioctl(s->kvm_fd, KVM_GET_VCPU_MMAP_SIZE, NULL); + if (s->kvm_run_size < 0) { + perror("KVM_GET_VCPU_MMAP_SIZE"); + exit(1); + } + + s->kvm_run = mmap(NULL, s->kvm_run_size, PROT_READ | PROT_WRITE, + MAP_SHARED, s->vcpu_fd, 0); + if (!s->kvm_run) { + perror("mmap kvm_run"); + exit(1); + } + + for(i = 0; i < 16; i++) { + irq_init(&s->pic_irq[i], kvm_pic_set_irq, s, i); + } + + act.sa_handler = sigalrm_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + sigaction(SIGALRM, &act, NULL); + + s->kvm_enabled = TRUE; + + s->mem_map->register_ram = kvm_register_ram; + s->mem_map->free_ram = kvm_free_ram; + s->mem_map->get_dirty_bits = kvm_get_dirty_bits; + s->mem_map->set_ram_addr = kvm_set_ram_addr; + s->mem_map->opaque = s; +} + +static void kvm_exit_io(PCMachine *s, struct kvm_run *run) +{ + uint8_t *ptr; + int i; + + ptr = (uint8_t *)run + run->io.data_offset; + // printf("port: addr=%04x\n", run->io.port); + + for(i = 0; i < run->io.count; i++) { + if (run->io.direction == KVM_EXIT_IO_OUT) { + switch(run->io.size) { + case 1: + st_port(s, run->io.port, *(uint8_t *)ptr, 0); + break; + case 2: + st_port(s, run->io.port, *(uint16_t *)ptr, 1); + break; + case 4: + st_port(s, run->io.port, *(uint32_t *)ptr, 2); + break; + default: + abort(); + } + } else { + switch(run->io.size) { + case 1: + *(uint8_t *)ptr = ld_port(s, run->io.port, 0); + break; + case 2: + *(uint16_t *)ptr = ld_port(s, run->io.port, 1); + break; + case 4: + *(uint32_t *)ptr = ld_port(s, run->io.port, 2); + break; + default: + abort(); + } + } + ptr += run->io.size; + } +} + +static void kvm_exit_mmio(PCMachine *s, struct kvm_run *run) +{ + uint8_t *data = run->mmio.data; + PhysMemoryRange *pr; + uint64_t addr; + + pr = get_phys_mem_range(s->mem_map, run->mmio.phys_addr); + if (run->mmio.is_write) { + if (!pr || pr->is_ram) + return; + addr = run->mmio.phys_addr - pr->addr; + switch(run->mmio.len) { + case 1: + if (pr->devio_flags & DEVIO_SIZE8) { + pr->write_func(pr->opaque, addr, *(uint8_t *)data, 0); + } + break; + case 2: + if (pr->devio_flags & DEVIO_SIZE16) { + pr->write_func(pr->opaque, addr, *(uint16_t *)data, 1); + } + break; + case 4: + if (pr->devio_flags & DEVIO_SIZE32) { + pr->write_func(pr->opaque, addr, *(uint32_t *)data, 2); + } + break; + case 8: + if (pr->devio_flags & DEVIO_SIZE32) { + pr->write_func(pr->opaque, addr, *(uint32_t *)data, 2); + pr->write_func(pr->opaque, addr + 4, *(uint32_t *)(data + 4), 2); + } + break; + default: + abort(); + } + } else { + if (!pr || pr->is_ram) + goto no_dev; + addr = run->mmio.phys_addr - pr->addr; + switch(run->mmio.len) { + case 1: + if (!(pr->devio_flags & DEVIO_SIZE8)) + goto no_dev; + *(uint8_t *)data = pr->read_func(pr->opaque, addr, 0); + break; + case 2: + if (!(pr->devio_flags & DEVIO_SIZE16)) + goto no_dev; + *(uint16_t *)data = pr->read_func(pr->opaque, addr, 1); + break; + case 4: + if (!(pr->devio_flags & DEVIO_SIZE32)) + goto no_dev; + *(uint32_t *)data = pr->read_func(pr->opaque, addr, 2); + break; + case 8: + if (pr->devio_flags & DEVIO_SIZE32) { + *(uint32_t *)data = + pr->read_func(pr->opaque, addr, 2); + *(uint32_t *)(data + 4) = + pr->read_func(pr->opaque, addr + 4, 2); + } else { + no_dev: + memset(run->mmio.data, 0, run->mmio.len); + } + break; + default: + abort(); + } + + } +} + +static void kvm_exec(PCMachine *s) +{ + struct kvm_run *run = s->kvm_run; + struct itimerval ival; + int ret; + + /* Not efficient but simple: we use a timer to interrupt the + execution after a given time */ + ival.it_interval.tv_sec = 0; + ival.it_interval.tv_usec = 0; + ival.it_value.tv_sec = 0; + ival.it_value.tv_usec = 10 * 1000; /* 10 ms max */ + setitimer(ITIMER_REAL, &ival, NULL); + + ret = ioctl(s->vcpu_fd, KVM_RUN, 0); + if (ret < 0) { + if (errno == EINTR || errno == EAGAIN) { + /* timeout */ + return; + } + perror("KVM_RUN"); + exit(1); + } + // printf("exit=%d\n", run->exit_reason); + switch(run->exit_reason) { + case KVM_EXIT_HLT: + break; + case KVM_EXIT_IO: + kvm_exit_io(s, run); + break; + case KVM_EXIT_MMIO: + kvm_exit_mmio(s, run); + break; + case KVM_EXIT_FAIL_ENTRY: + fprintf(stderr, "KVM_EXIT_FAIL_ENTRY: reason=0x%" PRIx64 "\n", + (uint64_t)run->fail_entry.hardware_entry_failure_reason); +#if 0 + { + struct kvm_regs regs; + if (ioctl(s->vcpu_fd, KVM_GET_REGS, ®s) < 0) { + perror("KVM_SET_REGS"); + exit(1); + } + printf("RIP=%016" PRIx64 "\n", (uint64_t)regs.rip); + } +#endif + exit(1); + case KVM_EXIT_INTERNAL_ERROR: + fprintf(stderr, "KVM_EXIT_INTERNAL_ERROR: suberror=0x%x\n", + (uint32_t)run->internal.suberror); + exit(1); + default: + fprintf(stderr, "KVM: unsupported exit_reason=%d\n", run->exit_reason); + exit(1); + } +} +#endif + +#if defined(EMSCRIPTEN) +/* with Javascript clock_gettime() is not enough precise enough to + have a reliable TSC counter. XXX: increment the cycles during the + power down time */ +static uint64_t cpu_get_tsc(void *opaque) +{ + PCMachine *s = opaque; + uint64_t c; + c = x86_cpu_get_cycles(s->cpu_state); + return c; +} +#else + +#define TSC_FREQ 100000000 + +static uint64_t cpu_get_tsc(void *opaque) +{ + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * TSC_FREQ + + (ts.tv_nsec / (1000000000 / TSC_FREQ)); +} +#endif + +static void pc_flush_tlb_write_range(void *opaque, uint8_t *ram_addr, + size_t ram_size) +{ + PCMachine *s = opaque; + x86_cpu_flush_tlb_write_range_ram(s->cpu_state, ram_addr, ram_size); +} + +static VirtMachine *pc_machine_init(const VirtMachineParams *p) +{ + PCMachine *s; + int i, piix3_devfn; + PCIBus *pci_bus; + VIRTIOBusDef vbus_s, *vbus = &vbus_s; + + if (strcmp(p->machine_name, "pc") != 0) { + vm_error("unsupported machine: %s\n", p->machine_name); + return NULL; + } + + assert(p->ram_size >= (1 << 20)); + + s = mallocz(sizeof(*s)); + s->common.vmc = p->vmc; + s->ram_size = p->ram_size; + + s->port_map = phys_mem_map_init(); + s->mem_map = phys_mem_map_init(); + +#ifdef USE_KVM + if (p->accel_enable) { + kvm_init(s); + } +#endif + +#ifdef USE_KVM + if (!s->kvm_enabled) +#endif + { + s->cpu_state = x86_cpu_init(s->mem_map); + x86_cpu_set_get_tsc(s->cpu_state, cpu_get_tsc, s); + x86_cpu_set_port_io(s->cpu_state, ld_port, st_port, s); + + /* needed to handle the RAM dirty bits */ + s->mem_map->opaque = s; + s->mem_map->flush_tlb_write_range = pc_flush_tlb_write_range; + } + + /* set the RAM mapping and leave the VGA addresses empty */ + cpu_register_ram(s->mem_map, 0xc0000, p->ram_size - 0xc0000, 0); + cpu_register_ram(s->mem_map, 0, 0xa0000, 0); + + /* devices */ + cpu_register_device(s->port_map, 0x80, 2, s, port80_read, port80_write, + DEVIO_SIZE8); + cpu_register_device(s->port_map, 0x92, 2, s, port92_read, port92_write, + DEVIO_SIZE8); + + /* setup the bios */ + if (p->files[VM_FILE_BIOS].len > 0) { + int bios_size, bios_size1; + uint8_t *bios_buf, *ptr; + uint32_t bios_addr; + + bios_size = p->files[VM_FILE_BIOS].len; + bios_buf = p->files[VM_FILE_BIOS].buf; + assert((bios_size % 65536) == 0 && bios_size != 0); + bios_addr = -bios_size; + /* at the top of the 4GB memory */ + cpu_register_ram(s->mem_map, bios_addr, bios_size, DEVRAM_FLAG_ROM); + ptr = get_ram_ptr(s, bios_addr); + memcpy(ptr, bios_buf, bios_size); + /* in the lower 1MB memory (currently set as RAM) */ + bios_size1 = min_int(bios_size, 128 * 1024); + ptr = get_ram_ptr(s, 0x100000 - bios_size1); + memcpy(ptr, bios_buf + bios_size - bios_size1, bios_size1); +#ifdef DEBUG_BIOS + cpu_register_device(s->port_map, 0x402, 2, s, + bios_debug_read, bios_debug_write, + DEVIO_SIZE8); +#endif + } + +#ifdef USE_KVM + if (!s->kvm_enabled) +#endif + { + s->pic_state = pic2_init(s->port_map, 0x20, 0xa0, + 0x4d0, 0x4d1, + pic_set_irq_cb, s, + s->pic_irq); + x86_cpu_set_get_hard_intno(s->cpu_state, get_hard_intno_cb, s); + s->pit_state = pit_init(s->port_map, 0x40, 0x61, &s->pic_irq[0], + pit_get_ticks_cb, s); + } + + s->cmos_state = cmos_init(s->port_map, 0x70, &s->pic_irq[8], + p->rtc_local_time); + + /* various cmos data */ + { + int size; + /* memory size */ + size = min_int((s->ram_size - (1 << 20)) >> 10, 65535); + put_le16(s->cmos_state->cmos_data + 0x30, size); + if (s->ram_size >= (16 << 20)) { + size = min_int((s->ram_size - (16 << 20)) >> 16, 65535); + put_le16(s->cmos_state->cmos_data + 0x34, size); + } + s->cmos_state->cmos_data[0x14] = 0x06; /* mouse + FPU present */ + } + + s->i440fx_state = i440fx_init(&pci_bus, &piix3_devfn, s->mem_map, + s->port_map, s->pic_irq); + + s->common.console = p->console; + /* serial console */ + if (0) { + s->serial_state = serial_init(s->port_map, 0x3f8, &s->pic_irq[4], + serial_write_cb, s); + } + + memset(vbus, 0, sizeof(*vbus)); + vbus->pci_bus = pci_bus; + + if (p->console) { + /* virtio console */ + s->common.console_dev = virtio_console_init(vbus, p->console); + } + + /* block devices */ + for(i = 0; i < p->drive_count;) { + const VMDriveEntry *de = &p->tab_drive[i]; + + if (!de->device || !strcmp(de->device, "virtio")) { + virtio_block_init(vbus, p->tab_drive[i].block_dev); + i++; + } else if (!strcmp(de->device, "ide")) { + BlockDevice *tab_bs[2]; + + tab_bs[0] = p->tab_drive[i++].block_dev; + tab_bs[1] = NULL; + if (i < p->drive_count) + tab_bs[1] = p->tab_drive[i++].block_dev; + ide_init(s->port_map, 0x1f0, 0x3f6, &s->pic_irq[14], tab_bs); + piix3_ide_init(pci_bus, piix3_devfn + 1); + } + } + + /* virtio filesystem */ + for(i = 0; i < p->fs_count; i++) { + virtio_9p_init(vbus, p->tab_fs[i].fs_dev, + p->tab_fs[i].tag); + } + + if (p->display_device) { + FBDevice *fb_dev; + + fb_dev = mallocz(sizeof(*fb_dev)); + s->common.fb_dev = fb_dev; + if (!strcmp(p->display_device, "vga")) { + int bios_size; + uint8_t *bios_buf; + bios_size = p->files[VM_FILE_VGA_BIOS].len; + bios_buf = p->files[VM_FILE_VGA_BIOS].buf; + pci_vga_init(pci_bus, fb_dev, p->width, p->height, + bios_buf, bios_size); + } else if (!strcmp(p->display_device, "simplefb")) { + simplefb_init(s->mem_map, + FRAMEBUFFER_BASE_ADDR, + fb_dev, p->width, p->height); + } else { + vm_error("unsupported display device: %s\n", p->display_device); + exit(1); + } + } + + if (p->input_device) { + if (!strcmp(p->input_device, "virtio")) { + s->keyboard_dev = virtio_input_init(vbus, VIRTIO_INPUT_TYPE_KEYBOARD); + + s->mouse_dev = virtio_input_init(vbus, VIRTIO_INPUT_TYPE_TABLET); + } else if (!strcmp(p->input_device, "ps2")) { + s->kbd_state = i8042_init(&s->ps2_kbd, &s->ps2_mouse, + s->port_map, + &s->pic_irq[1], &s->pic_irq[12], 0x60); + /* vmmouse */ + cpu_register_device(s->port_map, 0x5658, 1, s, + vmport_read, vmport_write, + DEVIO_SIZE32); + s->vm_mouse = vmmouse_init(s->ps2_mouse); + } else { + vm_error("unsupported input device: %s\n", p->input_device); + exit(1); + } + } + + /* virtio net device */ + for(i = 0; i < p->eth_count; i++) { + virtio_net_init(vbus, p->tab_eth[i].net); + s->common.net = p->tab_eth[i].net; + } + + if (p->files[VM_FILE_KERNEL].buf) { + copy_kernel(s, p->files[VM_FILE_KERNEL].buf, + p->files[VM_FILE_KERNEL].len, + p->cmdline ? p->cmdline : ""); + } + + return (VirtMachine *)s; +} + +static void pc_machine_end(VirtMachine *s1) +{ + PCMachine *s = (PCMachine *)s1; + /* XXX: free all */ + if (s->cpu_state) { + x86_cpu_end(s->cpu_state); + } + phys_mem_map_end(s->mem_map); + phys_mem_map_end(s->port_map); + free(s); +} + +static void pc_vm_send_key_event(VirtMachine *s1, BOOL is_down, uint16_t key_code) +{ + PCMachine *s = (PCMachine *)s1; + if (s->keyboard_dev) { + virtio_input_send_key_event(s->keyboard_dev, is_down, key_code); + } else if (s->ps2_kbd) { + ps2_put_keycode(s->ps2_kbd, is_down, key_code); + } +} + +static BOOL pc_vm_mouse_is_absolute(VirtMachine *s1) +{ + PCMachine *s = (PCMachine *)s1; + if (s->mouse_dev) { + return TRUE; + } else if (s->vm_mouse) { + return vmmouse_is_absolute(s->vm_mouse); + } else { + return FALSE; + } +} + +static void pc_vm_send_mouse_event(VirtMachine *s1, int dx, int dy, int dz, + unsigned int buttons) +{ + PCMachine *s = (PCMachine *)s1; + if (s->mouse_dev) { + virtio_input_send_mouse_event(s->mouse_dev, dx, dy, dz, buttons); + } else if (s->vm_mouse) { + vmmouse_send_mouse_event(s->vm_mouse, dx, dy, dz, buttons); + } +} + +struct screen_info { +} __attribute__((packed)); + +/* from plex86 (BSD license) */ +struct __attribute__ ((packed)) linux_params { + /* screen_info structure */ + uint8_t orig_x; /* 0x00 */ + uint8_t orig_y; /* 0x01 */ + uint16_t ext_mem_k; /* 0x02 */ + uint16_t orig_video_page; /* 0x04 */ + uint8_t orig_video_mode; /* 0x06 */ + uint8_t orig_video_cols; /* 0x07 */ + uint8_t flags; /* 0x08 */ + uint8_t unused2; /* 0x09 */ + uint16_t orig_video_ega_bx;/* 0x0a */ + uint16_t unused3; /* 0x0c */ + uint8_t orig_video_lines; /* 0x0e */ + uint8_t orig_video_isVGA; /* 0x0f */ + uint16_t orig_video_points;/* 0x10 */ + + /* VESA graphic mode -- linear frame buffer */ + uint16_t lfb_width; /* 0x12 */ + uint16_t lfb_height; /* 0x14 */ + uint16_t lfb_depth; /* 0x16 */ + uint32_t lfb_base; /* 0x18 */ + uint32_t lfb_size; /* 0x1c */ + uint16_t cl_magic, cl_offset; /* 0x20 */ + uint16_t lfb_linelength; /* 0x24 */ + uint8_t red_size; /* 0x26 */ + uint8_t red_pos; /* 0x27 */ + uint8_t green_size; /* 0x28 */ + uint8_t green_pos; /* 0x29 */ + uint8_t blue_size; /* 0x2a */ + uint8_t blue_pos; /* 0x2b */ + uint8_t rsvd_size; /* 0x2c */ + uint8_t rsvd_pos; /* 0x2d */ + uint16_t vesapm_seg; /* 0x2e */ + uint16_t vesapm_off; /* 0x30 */ + uint16_t pages; /* 0x32 */ + uint16_t vesa_attributes; /* 0x34 */ + uint32_t capabilities; /* 0x36 */ + uint32_t ext_lfb_base; /* 0x3a */ + uint8_t _reserved[2]; /* 0x3e */ + + /* 0x040 */ uint8_t apm_bios_info[20]; // struct apm_bios_info + /* 0x054 */ uint8_t pad2[0x80 - 0x54]; + + // Following 2 from 'struct drive_info_struct' in drivers/block/cciss.h. + // Might be truncated? + /* 0x080 */ uint8_t hd0_info[16]; // hd0-disk-parameter from intvector 0x41 + /* 0x090 */ uint8_t hd1_info[16]; // hd1-disk-parameter from intvector 0x46 + + // System description table truncated to 16 bytes + // From 'struct sys_desc_table_struct' in linux/arch/i386/kernel/setup.c. + /* 0x0a0 */ uint16_t sys_description_len; + /* 0x0a2 */ uint8_t sys_description_table[14]; + // [0] machine id + // [1] machine submodel id + // [2] BIOS revision + // [3] bit1: MCA bus + + /* 0x0b0 */ uint8_t pad3[0x1e0 - 0xb0]; + /* 0x1e0 */ uint32_t alt_mem_k; + /* 0x1e4 */ uint8_t pad4[4]; + /* 0x1e8 */ uint8_t e820map_entries; + /* 0x1e9 */ uint8_t eddbuf_entries; // EDD_NR + /* 0x1ea */ uint8_t pad5[0x1f1 - 0x1ea]; + /* 0x1f1 */ uint8_t setup_sects; // size of setup.S, number of sectors + /* 0x1f2 */ uint16_t mount_root_rdonly; // MOUNT_ROOT_RDONLY (if !=0) + /* 0x1f4 */ uint16_t sys_size; // size of compressed kernel-part in the + // (b)zImage-file (in 16 byte units, rounded up) + /* 0x1f6 */ uint16_t swap_dev; // (unused AFAIK) + /* 0x1f8 */ uint16_t ramdisk_flags; + /* 0x1fa */ uint16_t vga_mode; // (old one) + /* 0x1fc */ uint16_t orig_root_dev; // (high=Major, low=minor) + /* 0x1fe */ uint8_t pad6[1]; + /* 0x1ff */ uint8_t aux_device_info; + /* 0x200 */ uint16_t jump_setup; // Jump to start of setup code, + // aka "reserved" field. + /* 0x202 */ uint8_t setup_signature[4]; // Signature for SETUP-header, ="HdrS" + /* 0x206 */ uint16_t header_format_version; // Version number of header format; + /* 0x208 */ uint8_t setup_S_temp0[8]; // Used by setup.S for communication with + // boot loaders, look there. + /* 0x210 */ uint8_t loader_type; + // 0 for old one. + // else 0xTV: + // T=0: LILO + // T=1: Loadlin + // T=2: bootsect-loader + // T=3: SYSLINUX + // T=4: ETHERBOOT + // V=version + /* 0x211 */ uint8_t loadflags; + // bit0 = 1: kernel is loaded high (bzImage) + // bit7 = 1: Heap and pointer (see below) set by boot + // loader. + /* 0x212 */ uint16_t setup_S_temp1; + /* 0x214 */ uint32_t kernel_start; + /* 0x218 */ uint32_t initrd_start; + /* 0x21c */ uint32_t initrd_size; + /* 0x220 */ uint8_t setup_S_temp2[4]; + /* 0x224 */ uint16_t setup_S_heap_end_pointer; + /* 0x226 */ uint16_t pad70; + /* 0x228 */ uint32_t cmd_line_ptr; + /* 0x22c */ uint8_t pad7[0x2d0 - 0x22c]; + + /* 0x2d0 : Int 15, ax=e820 memory map. */ + // (linux/include/asm-i386/e820.h, 'struct e820entry') +#define E820MAX 32 +#define E820_RAM 1 +#define E820_RESERVED 2 +#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */ +#define E820_NVS 4 + struct { + uint64_t addr; + uint64_t size; + uint32_t type; + } e820map[E820MAX]; + + /* 0x550 */ uint8_t pad8[0x600 - 0x550]; + + // BIOS Enhanced Disk Drive Services. + // (From linux/include/asm-i386/edd.h, 'struct edd_info') + // Each 'struct edd_info is 78 bytes, times a max of 6 structs in array. + /* 0x600 */ uint8_t eddbuf[0x7d4 - 0x600]; + + /* 0x7d4 */ uint8_t pad9[0x800 - 0x7d4]; + /* 0x800 */ uint8_t commandline[0x800]; + + uint64_t gdt_table[4]; +}; + +#define KERNEL_PARAMS_ADDR 0x00090000 + +static void copy_kernel(PCMachine *s, const uint8_t *buf, int buf_len, + const char *cmd_line) +{ + uint8_t *ram_ptr; + int setup_sects, header_len, copy_len, setup_hdr_start, setup_hdr_end; + uint32_t load_address; + struct linux_params *params; + FBDevice *fb_dev; + + if (buf_len < 1024) { + too_small: + fprintf(stderr, "Kernel too small\n"); + exit(1); + } + if (buf[0x1fe] != 0x55 || buf[0x1ff] != 0xaa) { + fprintf(stderr, "Invalid kernel magic\n"); + exit(1); + } + setup_sects = buf[0x1f1]; + if (setup_sects == 0) + setup_sects = 4; + header_len = (setup_sects + 1) * 512; + if (buf_len < header_len) + goto too_small; + if (memcmp(buf + 0x202, "HdrS", 4) != 0) { + fprintf(stderr, "Kernel too old\n"); + exit(1); + } + load_address = 0x100000; /* we don't support older protocols */ + + ram_ptr = get_ram_ptr(s, load_address); + copy_len = buf_len - header_len; + if (copy_len > (s->ram_size - load_address)) { + fprintf(stderr, "Not enough RAM\n"); + exit(1); + } + memcpy(ram_ptr, buf + header_len, copy_len); + + params = (void *)get_ram_ptr(s, KERNEL_PARAMS_ADDR); + + memset(params, 0, sizeof(struct linux_params)); + + /* copy the setup header */ + setup_hdr_start = 0x1f1; + setup_hdr_end = 0x202 + buf[0x201]; + memcpy((uint8_t *)params + setup_hdr_start, buf + setup_hdr_start, + setup_hdr_end - setup_hdr_start); + + strcpy((char *)params->commandline, cmd_line); + + params->mount_root_rdonly = 0; + params->cmd_line_ptr = KERNEL_PARAMS_ADDR + + offsetof(struct linux_params, commandline); + params->alt_mem_k = (s->ram_size / 1024) - 1024; + params->loader_type = 0x01; +#if 0 + if (initrd_size > 0) { + params->initrd_start = INITRD_LOAD_ADDR; + params->initrd_size = initrd_size; + } +#endif + params->orig_video_lines = 0; + params->orig_video_cols = 0; + + fb_dev = s->common.fb_dev; + if (fb_dev) { + + params->orig_video_isVGA = 0x23; /* VIDEO_TYPE_VLFB */ + + params->lfb_depth = 32; + params->red_size = 8; + params->red_pos = 16; + params->green_size = 8; + params->green_pos = 8; + params->blue_size = 8; + params->blue_pos = 0; + params->rsvd_size = 8; + params->rsvd_pos = 24; + + params->lfb_width = fb_dev->width; + params->lfb_height = fb_dev->height; + params->lfb_linelength = fb_dev->stride; + params->lfb_size = fb_dev->fb_size; + params->lfb_base = FRAMEBUFFER_BASE_ADDR; + } + + params->gdt_table[2] = 0x00cf9b000000ffffLL; /* CS */ + params->gdt_table[3] = 0x00cf93000000ffffLL; /* DS */ + +#ifdef USE_KVM + if (s->kvm_enabled) { + struct kvm_sregs sregs; + struct kvm_segment seg; + struct kvm_regs regs; + + /* init flat protected mode */ + + if (ioctl(s->vcpu_fd, KVM_GET_SREGS, &sregs) < 0) { + perror("KVM_GET_SREGS"); + exit(1); + } + + sregs.cr0 |= (1 << 0); /* CR0_PE */ + sregs.gdt.base = KERNEL_PARAMS_ADDR + + offsetof(struct linux_params, gdt_table); + sregs.gdt.limit = sizeof(params->gdt_table) - 1; + + memset(&seg, 0, sizeof(seg)); + seg.limit = 0xffffffff; + seg.present = 1; + seg.db = 1; + seg.s = 1; /* code/data */ + seg.g = 1; /* 4KB granularity */ + + seg.type = 0xb; /* code */ + seg.selector = 2 << 3; + sregs.cs = seg; + + seg.type = 0x3; /* data */ + seg.selector = 3 << 3; + sregs.ds = seg; + sregs.es = seg; + sregs.ss = seg; + sregs.fs = seg; + sregs.gs = seg; + + if (ioctl(s->vcpu_fd, KVM_SET_SREGS, &sregs) < 0) { + perror("KVM_SET_SREGS"); + exit(1); + } + + memset(®s, 0, sizeof(regs)); + regs.rip = load_address; + regs.rsi = KERNEL_PARAMS_ADDR; + regs.rflags = 0x2; + if (ioctl(s->vcpu_fd, KVM_SET_REGS, ®s) < 0) { + perror("KVM_SET_REGS"); + exit(1); + } + } else +#endif + { + int i; + X86CPUSeg sd; + uint32_t val; + val = x86_cpu_get_reg(s->cpu_state, X86_CPU_REG_CR0); + x86_cpu_set_reg(s->cpu_state, X86_CPU_REG_CR0, val | (1 << 0)); + + sd.base = KERNEL_PARAMS_ADDR + + offsetof(struct linux_params, gdt_table); + sd.limit = sizeof(params->gdt_table) - 1; + x86_cpu_set_seg(s->cpu_state, X86_CPU_SEG_GDT, &sd); + sd.sel = 2 << 3; + sd.base = 0; + sd.limit = 0xffffffff; + sd.flags = 0xc09b; + x86_cpu_set_seg(s->cpu_state, X86_CPU_SEG_CS, &sd); + sd.sel = 3 << 3; + sd.flags = 0xc093; + for(i = 0; i < 6; i++) { + if (i != X86_CPU_SEG_CS) { + x86_cpu_set_seg(s->cpu_state, i, &sd); + } + } + + x86_cpu_set_reg(s->cpu_state, X86_CPU_REG_EIP, load_address); + x86_cpu_set_reg(s->cpu_state, 6, KERNEL_PARAMS_ADDR); /* esi */ + } + + /* map PCI interrupts (no BIOS, so we must do it) */ + { + uint8_t elcr[2]; + static const uint8_t pci_irqs[4] = { 9, 10, 11, 12 }; + + i440fx_map_interrupts(s->i440fx_state, elcr, pci_irqs); + /* XXX: KVM support */ + if (s->pic_state) { + pic2_set_elcr(s->pic_state, elcr); + } + } +} + +/* in ms */ +static int pc_machine_get_sleep_duration(VirtMachine *s1, int delay) +{ + PCMachine *s = (PCMachine *)s1; + +#ifdef USE_KVM + if (s->kvm_enabled) { + /* XXX: improve */ + cmos_update_irq(s->cmos_state); + delay = 0; + } else +#endif + { + cmos_update_irq(s->cmos_state); + delay = min_int(delay, pit_update_irq(s->pit_state)); + if (!x86_cpu_get_power_down(s->cpu_state)) + delay = 0; + } + return delay; +} + +static void pc_machine_interp(VirtMachine *s1, int max_exec_cycles) +{ + PCMachine *s = (PCMachine *)s1; +#ifdef USE_KVM + if (s->kvm_enabled) { + kvm_exec(s); + } else +#endif + { + x86_cpu_interp(s->cpu_state, max_exec_cycles); + } +} + +const VirtMachineClass pc_machine_class = { + "pc", + pc_machine_set_defaults, + pc_machine_init, + pc_machine_end, + pc_machine_get_sleep_duration, + pc_machine_interp, + pc_vm_mouse_is_absolute, + pc_vm_send_mouse_event, + pc_vm_send_key_event, +}; diff --git a/jslinux-2019-12-21/x86emu-wasm.js b/jslinux-2019-12-21/x86emu-wasm.js new file mode 100644 index 0000000..a89b8b4 --- /dev/null +++ b/jslinux-2019-12-21/x86emu-wasm.js @@ -0,0 +1,4 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;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;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);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};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}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}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}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){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(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 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";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?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>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)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;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:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;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];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";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;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 UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;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){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){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<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,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;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;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 allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY<HEAP32[DYNAMICTOP_PTR>>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||67108864;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){Module["wasmMemory"]=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module["wasmMemory"].buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}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__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="x86emu-wasm.wast";var wasmBinaryFile="x86emu-wasm.wasm";var asmjsCodeFile="x86emu-wasm.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength<oldBuffer.byteLength){err("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);newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}function fixImports(imports){return imports}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then((function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()})).catch((function(){return getBinary()}))}return new Promise((function(resolve,reject){resolve(getBinary())}))}function doNativeWasm(global,env,providedBuffer){if(typeof WebAssembly!=="object"){err("no native wasm support detected");return false}if(!(Module["wasmMemory"]instanceof WebAssembly.Memory)){err("no native wasm Memory in use");return false}env["memory"]=Module["wasmMemory"];info["global"]={"NaN":NaN,"Infinity":Infinity};info["global.Math"]=Math;info["env"]=env;function receiveInstance(instance,module){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module["asm"]=exports;Module["usingWasm"]=true;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then((function(binary){return WebAssembly.instantiate(binary,info)})).then(receiver).catch((function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)}))}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource).catch((function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)}))}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asmPreload"]=Module["asm"];var asmjsReallocBuffer=Module["reallocBuffer"];var wasmReallocBuffer=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}});Module["reallocBuffer"]=(function(size){if(finalMethod==="asmjs"){return asmjsReallocBuffer(size)}else{return wasmReallocBuffer(size)}});var finalMethod="";Module["asm"]=(function(global,env,providedBuffer){env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;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)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;exports=doNativeWasm(global,env,providedBuffer);assert(exports,"no binaryen method succeeded.");return exports})}integrateWasmJS();STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+16810192;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});var STATIC_BUMP=16810192;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}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!")}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 SYSCALLS={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}),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 ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;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{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{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 _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}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};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,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/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){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)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}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{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("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=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;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,1e3/fps);else _emscripten_set_main_loop_timing(1,1);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++}),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);_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}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("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"]=[];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}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){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){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);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;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);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);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&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});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&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){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{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}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)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);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){err("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){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){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(){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()}}),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){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;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}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);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(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);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_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();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)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_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()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}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}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("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)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=244;Module["wasmMaxTableSize"]=244;Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_gmtime_r":_gmtime_r,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=(function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)});var __get_daylight=Module["__get_daylight"]=(function(){return Module["asm"]["__get_daylight"].apply(null,arguments)});var __get_timezone=Module["__get_timezone"]=(function(){return Module["asm"]["__get_timezone"].apply(null,arguments)});var __get_tzname=Module["__get_tzname"]=(function(){return Module["asm"]["__get_tzname"].apply(null,arguments)});var _console_queue_char=Module["_console_queue_char"]=(function(){return Module["asm"]["_console_queue_char"].apply(null,arguments)});var _display_key_event=Module["_display_key_event"]=(function(){return Module["asm"]["_display_key_event"].apply(null,arguments)});var _display_mouse_event=Module["_display_mouse_event"]=(function(){return Module["asm"]["_display_mouse_event"].apply(null,arguments)});var _display_wheel_event=Module["_display_wheel_event"]=(function(){return Module["asm"]["_display_wheel_event"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _fs_import_file=Module["_fs_import_file"]=(function(){return Module["asm"]["_fs_import_file"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var _net_set_carrier=Module["_net_set_carrier"]=(function(){return Module["asm"]["_net_set_carrier"].apply(null,arguments)});var _net_write_packet=Module["_net_write_packet"]=(function(){return Module["asm"]["_net_write_packet"].apply(null,arguments)});var _vm_start=Module["_vm_start"]=(function(){return Module["asm"]["_vm_start"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)});var dynCall_iiiiiiijjjjj=Module["dynCall_iiiiiiijjjjj"]=(function(){return Module["asm"]["dynCall_iiiiiiijjjjj"].apply(null,arguments)});var dynCall_iiijii=Module["dynCall_iiijii"]=(function(){return Module["asm"]["dynCall_iiijii"].apply(null,arguments)});var dynCall_iijiiii=Module["dynCall_iijiiii"]=(function(){return Module["asm"]["dynCall_iijiiii"].apply(null,arguments)});var dynCall_iijji=Module["dynCall_iijji"]=(function(){return Module["asm"]["dynCall_iijji"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["dynCall_viiiiii"].apply(null,arguments)});var dynCall_viiji=Module["dynCall_viiji"]=(function(){return Module["asm"]["dynCall_viiji"].apply(null,arguments)});Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + diff --git a/jslinux-2019-12-21/x86emu-wasm.wasm b/jslinux-2019-12-21/x86emu-wasm.wasm Binary files differnew file mode 100644 index 0000000..d8f51b9 --- /dev/null +++ b/jslinux-2019-12-21/x86emu-wasm.wasm diff --git a/jslinux-2019-12-21/x86emu.js b/jslinux-2019-12-21/x86emu.js new file mode 100644 index 0000000..2e85a7f --- /dev/null +++ b/jslinux-2019-12-21/x86emu.js @@ -0,0 +1,22 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;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;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;ret=tryParseAsDataURI(filename);if(!ret){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);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};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){var data=tryParseAsDataURI(f);if(data){return intArrayToString(data)}return read(f)}}Module["readBinary"]=function readBinary(f){var data;data=tryParseAsDataURI(f);if(data){return data}if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}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}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}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){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}function getNativeTypeSize(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 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function getFuncWrapper(func,sig){if(!func)return;assert(sig);if(!funcWrappers[sig]){funcWrappers[sig]={}}var sigCache=funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func)}}else if(sig.length===2){sigCache[func]=function dynCall_wrapper(arg){return dynCall(sig,func,[arg])}}else{sigCache[func]=function dynCall_wrapper(){return dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return sigCache[func]}function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var Runtime={dynCall:dynCall};var GLOBAL_BASE=8;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}var JSfuncs={"stackSave":(function(){stackSave()}),"stackRestore":(function(){stackRestore()}),"arrayToC":(function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};function ccall(ident,returnType,argTypes,args,opts){function convertReturnValue(ret){if(returnType==="string")return Pointer_stringify(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every((function(type){return type==="number"}));var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(function(){return ccall(ident,returnType,argTypes,arguments,opts)})}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";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?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>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)}}var ALLOC_NORMAL=0;var ALLOC_STATIC=2;var ALLOC_NONE=4;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:staticAlloc,stackAlloc,staticAlloc,dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;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];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!staticSealed)return staticAlloc(size);if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";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;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 UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;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){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){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<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){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){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;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 allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) 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"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}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__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}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()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}STATIC_BASE=GLOBAL_BASE;STATICTOP=STATIC_BASE+16809184;__ATINIT__.push({func:(function(){___emscripten_environ_constructor()})});memoryInitializer="data:application/octet-stream;base64,AAAAAAAAAABjY2NjfHx8fHd3d3d7e3t78vLy8mtra2tvb29vxcXFxTAwMDABAQEBZ2dnZysrKyv+/v7+19fX16urq6t2dnZ2ysrKyoKCgoLJycnJfX19ffr6+vpZWVlZR0dHR/Dw8PCtra2t1NTU1KKioqKvr6+vnJycnKSkpKRycnJywMDAwLe3t7f9/f39k5OTkyYmJiY2NjY2Pz8/P/f39/fMzMzMNDQ0NKWlpaXl5eXl8fHx8XFxcXHY2NjYMTExMRUVFRUEBAQEx8fHxyMjIyPDw8PDGBgYGJaWlpYFBQUFmpqamgcHBwcSEhISgICAgOLi4uLr6+vrJycnJ7KysrJ1dXV1CQkJCYODg4MsLCwsGhoaGhsbGxtubm5uWlpaWqCgoKBSUlJSOzs7O9bW1tazs7OzKSkpKePj4+MvLy8vhISEhFNTU1PR0dHRAAAAAO3t7e0gICAg/Pz8/LGxsbFbW1tbampqasvLy8u+vr6+OTk5OUpKSkpMTExMWFhYWM/Pz8/Q0NDQ7+/v76qqqqr7+/v7Q0NDQ01NTU0zMzMzhYWFhUVFRUX5+fn5AgICAn9/f39QUFBQPDw8PJ+fn5+oqKioUVFRUaOjo6NAQEBAj4+Pj5KSkpKdnZ2dODg4OPX19fW8vLy8tra2ttra2tohISEhEBAQEP/////z8/Pz0tLS0s3Nzc0MDAwMExMTE+zs7OxfX19fl5eXl0REREQXFxcXxMTExKenp6d+fn5+PT09PWRkZGRdXV1dGRkZGXNzc3NgYGBggYGBgU9PT0/c3NzcIiIiIioqKiqQkJCQiIiIiEZGRkbu7u7uuLi4uBQUFBTe3t7eXl5eXgsLCwvb29vb4ODg4DIyMjI6Ojo6CgoKCklJSUkGBgYGJCQkJFxcXFzCwsLC09PT06ysrKxiYmJikZGRkZWVlZXk5OTkeXl5eefn5+fIyMjINzc3N21tbW2NjY2N1dXV1U5OTk6pqampbGxsbFZWVlb09PT06urq6mVlZWV6enp6rq6urggICAi6urq6eHh4eCUlJSUuLi4uHBwcHKampqa0tLS0xsbGxujo6Ojd3d3ddHR0dB8fHx9LS0tLvb29vYuLi4uKioqKcHBwcD4+Pj61tbW1ZmZmZkhISEgDAwMD9vb29g4ODg5hYWFhNTU1NVdXV1e5ubm5hoaGhsHBwcEdHR0dnp6enuHh4eH4+Pj4mJiYmBERERFpaWlp2dnZ2Y6Ojo6UlJSUm5ubmx4eHh6Hh4eH6enp6c7Ozs5VVVVVKCgoKN/f39+MjIyMoaGhoYmJiYkNDQ0Nv7+/v+bm5uZCQkJCaGhoaEFBQUGZmZmZLS0tLQ8PDw+wsLCwVFRUVLu7u7sWFhYWAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAbAAAANgAAAAAAAAAAUKf0UVNlQX7DpBcall4nOstrqzvxRZ0fq1j6rJMD40tV+jAg9m12rZF2zIglTAL1/NflT9fLKsWARDUmj6NitUlasd5nG7olmA7qReHA/l0CdS/DEvBMgaOXRo3G+dNr51+PA5WckhXrem2/2llSlS2DvtTTIXRYKWngSUTIyY5qicJ1eHmO9Gs+WJndcbkntk/hvhetiPBmrCDJtDrOfRhK32OCMRrlYDNRl0V/U2Lgd2SxhK5ruxyggf6UKwj5WGhIcBn9RY+HbN6Ut/h7UiPTc6viAktyV48f4yqrVWYHKOuyA8K1L5p7xYalCDfT8ocoMLKlvyO6agMCXIIW7Sscz4qStHmn8PIH86HiaU7N9Npl1b4FBh9iNNGK/qbEnVMuNKBV86Iy4YoFdev2pDnsgwuq72BABp9xXlEQbr35iiE+PQbdlq4FPt1GveZNtY1UkQVdxHFv1AYE/xVQYCT7mBmX6b3WzENAiXee2We9QuiwiIuJBzhbGefb7sh5Rwp8oekPQnzJHoT4AAAAAIOGgAlI7SsyrHARHk5yWmz7/w79VjiFDx7Vrj0nOS02ZNkPCiGmXGjRVFubOi42JLFnCgwP51eT0pbutJ6RmxtPxcCAoiDcYWlLd1oWGhIcCrqT4uUqoMBD4CI8HRcbEgsNCQ6tx4vyuai2LcipHhSFGfFXTAd1r7vdme79YH+jnyYB97z1clzFO2ZENH77W3YpQ4vcxiPLaPzttmPx5LjK3DHXEIVjQkAilxMgEcaEfSRKhfg9u9IRMvmubaEpx0svnh3zMLLc7FKGDdDjwXdsFrMrmblwqfpIlBEiZOlHxIz8qBo/8KDYLH1W75AzIsdOSYfB0TjZ/qLKjDYL1JjPgfWmKN56pSaOt9qkv60/5J06LA2SeFCbzF9qYkZ+VMITjfbouNiQXvc5LvWvw4K+gF2ffJPQaakt1W+zEiXPO5msyKd9GBBuY5zoe7s72wl4Js30GFluAbea7KiaT4NlbpXmfub/qgjPvCHm6BXv2Zvnus42b0rUCZ/q1nywKa+ypDExIz8qMJSlxsBmojU3vE50psqC/LDQkOAV2KczSpgE8ffa7EEOUM1/L/aRF43WTXZNsO9DVE2qzN8EluTjtdGeG4hqTLgfLMF/UWVGBOpenV01jAFzdIf6LkEL+1odZ7NS0tuSM1YQ6RNH1m2MYdeaegyhN44U+FmJPBPr7iepzjXJYbft5RzhPLFHelnf0pw/c/JVec4UGL83x3PqzfdTW6r9XxRvPd+G20R4gfOvyj7EaLksNCQ4X0CjwnLDHRYMJeK8i0k8KEGVDf9xAag53rMMCJzktNiQwVZkYYTLe3C2MtV0XGxIQle40Kf0UVBlQX5TpBcaw14nOpZrqzvLRZ0f8Vj6rKsD40uT+jAgVW12rfZ2zIiRTAL1JdflT/zLKsXXRDUmgKNitY9asd5JG7olZw7qRZjA/l3hdS/DAvBMgRKXRo2j+dNrxl+PA+eckhWVem2/61lSldqDvtQtIXRY02ngSSnIyY5EicJ1anmO9Hg+WJlrcbkn3U/hvratiPAXrCDJZjrOfbRK32MYMRrlgjNRl2B/U2JFd2Sx4K5ru4Sggf4cKwj5lGhIcFj9RY8ZbN6Uh/h7UrfTc6sjAkty4o8f41erVWYqKOuyB8K1LwN7xYaaCDfTpYcoMPKlvyOyagMCuoIW7Vwcz4ortHmnkvIH8/DiaU6h9Nplzb4FBtViNNEf/qbEilMuNJ1V86Kg4YoFMuv2pHXsgws572BAqp9xXgYQbr1RiiE++Qbdlj0FPt2uveZNRo1UkbVdxHEF1AYEbxVQYP/7mBkk6b3Wl0NAicye2Wd3QuiwvYuJB4hbGec47sh52wp8oUcPQnzpHoT4yQAAAACGgAmD7SsySHARHqxyWmxO/w79+ziFD1bVrj0eOS02J9kPCmSmXGghVFub0S42JDpnCgyx51eTD5butNKRmxuexcCATyDcYaJLd1ppGhIcFrqT4goqoMDl4CI8QxcbEh0NCQ4Lx4vyrai2LbmpHhTIGfFXhQd1r0zdme67YH+j/SYB95/1cly8O2ZExX77WzQpQ4t2xiPL3Pzttmjx5Lhj3DHXyoVjQhAilxNAEcaEICRKhX09u9L4MvmuEaEpx20vnh1LMLLc81KGDezjwXfQFrMrbLlwqZlIlBH6ZOlHIoz8qMQ/8KAaLH1W2JAzIu9OSYfH0TjZwaLKjP4L1Jg2gfWmz956pSiOt9omv60/pJ06LOSSeFANzF9qm0Z+VGITjfbCuNiQ6Pc5Ll6vw4L1gF2fvpPQaXwt1W+pEiXPs5msyDt9GBCnY5zobrs723t4Js0JGFlu9Lea7AGaT4OobpXmZeb/qn7PvCEI6BXv5pvnutk2b0rOCZ/q1HywKdaypDGvIz8qMZSlxjBmojXAvE50N8qC/KbQkOCw2KczFZgE8Ura7EH3UM1/DvaRFy/WTXaNsO9DTU2qzFQEluTftdGe44hqTBsfLMG4UWVGf+penQQ1jAFddIf6c0EL+y4dZ7Na0tuSUlYQ6TNH1m0TYdeajAyhN3oU+FmOPBPriSepzu7JYbc15Rzh7bFHejzf0pxZc/JVP84UGHk3x3O/zfdT6qr9X1tvPd8U20R4hvOvyoHEaLk+NCQ4LECjwl/DHRZyJeK8DEk8KIuVDf9BAag5cbMMCN7ktNicwVZkkITLe2G2MtVwXGxIdFe40EL0UVCnQX5TZRcaw6QnOpZeqzvLa50f8UX6rKtY40uTAzAgVfp2rfZtzIiRdgL1JUzlT/zXKsXXyzUmgERitY+jsd5JWrolZxvqRZgO/l3hwC/DAnVMgRLwRo2jl9NrxvmPA+dfkhWVnG2/63pSldpZvtQtg3RY0yHgSSlpyY5EyMJ1aomO9Hh5WJlrPrkn3XHhvrZPiPAXrSDJZqzOfbQ632MYShrlgjFRl2AzU2JFf2Sx4Hdru4Sugf4coAj5lCtIcFhoRY8Z/d6Uh2x7Urf4c6sj00ty4gIf41ePVWYqq+uyByi1LwPCxYaaezfTpQgoMPKHvyOypQMCumoW7VyCz4orHHmnkrQH8/DyaU6h4tplzfQFBtW+NNEfYqbEiv4uNJ1T86KgVYoFMuH2pHXrgws57GBAqu9xXgafbr1RECE++Yrdlj0GPt2uBeZNRr1UkbWNxHEFXQYEb9RQYP8VmBkk+73Wl+lAicxD2Wd3nuiwvUKJB4iLGec4W8h52+58oUcKQnzpD4T4yR4AAAAAgAmDhisySO0RHqxwWmxOcg79+/+FD1Y4rj0e1S02JzkPCmTZXGghplub0VQ2JDouCgyxZ1eTD+futNKWmxuekcCAT8XcYaIgd1ppSxIcFhqT4gq6oMDlKiI8Q+AbEh0XCQ4LDYvyrce2LbmoHhTIqfFXhRl1r0wHme673X+j/WAB958mcly89WZExTv7WzR+Q4t2KSPL3Mbttmj85Lhj8THXytxjQhCFlxNAIsaEIBFKhX0ku9L4PfmuETIpx22hnh1LL7Lc8zCGDexSwXfQ47MrbBZwqZm5lBH6SOlHImT8qMSM8KAaP31W2CwzIu+QSYfHTjjZwdHKjP6i1Jg2C/Wmz4F6pSjet9omjq0/pL86LOSdeFANkl9qm8x+VGJGjfbCE9iQ6Lg5Ll73w4L1r12fvoDQaXyT1W+pLSXPsxKsyDuZGBCnfZzobmM723u7Js0JeFlu9Bia7AG3T4OompXmZW7/qn7mvCEIzxXv5ujnutmbb0rONp/q1AmwKdZ8pDGvsj8qMSOlxjCUojXAZk50N7yC/KbKkOCw0KczFdgE8UqY7EH32s1/DlCRFy/2TXaN1u9DTbCqzFRNluTfBNGe47VqTBuILMG4H2VGf1FenQTqjAFdNYf6c3QL+y5BZ7NaHduSUtIQ6TNW1m0TR9eajGGhN3oM+FmOFBPriTypzu4nYbc1yRzh7eVHejyx0pxZ3/JVP3MUGHnOx3O/N/dT6s39X1uqPd8Ub0R4htuvyoHzaLk+xCQ4LDSjwl9AHRZyw+K8DCU8KItJDf9Blag5cQEMCN6ztNic5FZkkMHLe2GEMtVwtmxIdFy40EJXUVCn9H5TZUEaw6QXOpZeJzvLa6sf8UWdrKtY+kuTA+MgVfowrfZtdoiRdsz1JUwCT/zX5cXXyyomgEQ1tY+jYt5JWrElZxu6RZgO6l3hwP7DAnUvgRLwTI2jl0ZrxvnTA+dfjxWVnJK/63ptldpZUtQtg75Y0yF0SSlp4I5EyMl1aonC9Hh5jplrPlgn3XG5vrZP4fAXrYjJZqwgfbQ6zmMYSt/lgjEal2AzUWJFf1Ox4Hdku4Sua/4coIH5lCsIcFhoSI8Z/UWUh2zeUrf4e6sj03Ny4gJL41ePH2Yqq1WyByjrLwPCtYaae8XTpQg3MPKHKCOypb8CumoD7VyCFoorHM+nkrR58/DyB06h4mllzfTaBtW+BdEfYjTEiv6mNJ1TLqKgVfMFMuGKpHXr9gs57INAqu9gXgafcb1REG4++Yohlj0G3d2uBT5NRr3mkbWNVHEFXcQEb9QGYP8VUBkk+5jWl+m9icxDQGd3ntmwvULoB4iLiec4Wxl52+7IoUcKfHzpD0L4yR6EAAAAAAmDhoAySO0rHqxwEWxOclr9+/8OD1Y4hT0e1a42JzktCmTZD2ghplyb0VRbJDouNgyxZwqTD+dXtNKW7huekZuAT8XAYaIg3FppS3ccFhoS4gq6k8DlKqA8Q+AiEh0XGw4LDQnyrceLLbmothTIqR5XhRnxr0wHde673Zmj/WB/958mAVy89XJExTtmWzR++4t2KUPL3MYjtmj87bhj8eTXytwxQhCFYxNAIpeEIBHGhX0kStL4PbuuETL5x22hKR1LL57c8zCyDexShnfQ48ErbBazqZm5cBH6SJRHImTpqMSM/KAaP/BW2Cx9Iu+QM4fHTknZwdE4jP6iypg2C9Smz4H1pSjeetomjrc/pL+tLOSdOlANknhqm8xfVGJGfvbCE42Q6LjYLl73OYL1r8OfvoBdaXyT0G+pLdXPsxIlyDuZrBCnfRjobmOc23u7O80JeCZu9BhZ7AG3moOomk/mZW6Vqn7m/yEIz7zv5ugVutmb50rONm/q1AmfKdZ8sDGvsqQqMSM/xjCUpTXAZqJ0N7xO/KbKguCw0JAzFdin8UqYBEH32ux/DlDNFy/2kXaN1k1DTbDvzFRNquTfBJae47XRTBuIasG4HyxGf1FlnQTqXgFdNYz6c3SH+y5BC7NaHWeSUtLb6TNWEG0TR9aajGHXN3oMoVmOFPjriTwTzu4nqbc1yWHh7eUcejyxR5xZ39JVP3PyGHnOFHO/N8dT6s33X1uq/d8Ubz14httEyoHzr7k+xGg4LDQkwl9AoxZywx28DCXiKItJPP9BlQ05cQGoCN6zDNic5LRkkMFWe2GEy9VwtjJIdFxs0EJXuKVjY8aEfHz4mXd37o17e/YN8vL/vWtr1rFvb95UxcWRUDAwYAMBAQKpZ2fOfSsrVhn+/udi19e15qurTZp2duxFysqPnYKCH0DJyYmHfX36Ffr67+tZWbLJR0eOC/Dw++ytrUFn1NSz/aKiX+qvr0W/nJwj96SkU5ZycuRbwMCbwre3dRz9/eGuk5M9aiYmTFo2NmxBPz9+Avf39U/MzINcNDRo9KWlUTTl5dEI8fH5k3Fx4nPY2KtTMTFiPxUVKgwEBAhSx8eVZSMjRl7Dw50oGBgwoZaWNw8FBQq1mpovCQcHDjYSEiSbgIAbPeLi3ybr681pJydOzbKyf591deobCQkSnoODHXQsLFguGho0LRsbNrJubtzuWlq0+6CgW/ZSUqRNOzt2YdbWt86zs317KSlSPuPj3XEvL16XhIQT9VNTpmjR0bkAAAAALO3twWAgIEAf/PzjyLGxee1bW7a+amrURsvLjdm+vmdLOTly3kpKlNRMTJjoWFiwSs/PhWvQ0Lsq7+/F5aqqTxb7++3FQ0OG101NmlUzM2aUhYURz0VFihD5+ekGAgIEgX9//vBQUKBEPDx4up+fJeOoqEvzUVGi/qOjXcBAQICKj48FrZKSP7ydnSFIODhwBPX18d+8vGPBtrZ3ddrar2MhIUIwEBAgGv//5Q7z8/1t0tK/TM3NgRQMDBg1ExMmL+zsw+FfX76il5c1zEREiDkXFy5XxMST8qenVYJ+fvxHPT16rGRkyOddXborGRkylXNz5qBgYMCYgYEZ0U9Pnn/c3KNmIiJEfioqVKuQkDuDiIgLykZGjCnu7sfTuLhrPBQUKHne3qfiXl68HQsLFnbb26074ODbVjIyZE46OnQeCgoU20lJkgoGBgxsJCRI5FxcuF3Cwp9u09O976ysQ6ZiYsSokZE5pJWVMTfk5NOLeXnyMufn1UPIyItZNzdut21t2oyNjQFk1dWx0k5OnOCpqUm0bGzY+lZWrAf09PMl6urPr2Vlyo56evTprq5HGAgIENW6um+IeHjwbyUlSnIuLlwkHBw48aamV8e0tHNRxsaXI+joy3zd3aGcdHToIR8fPt1LS5bcvb1hhouLDYWKig+QcHDgQj4+fMS1tXGqZmbM2EhIkAUDAwYB9vb3Eg4OHKNhYcJfNTVq+VdXrtC5uWmRhoYXWMHBmScdHTq5np4nOOHh2RP4+OuzmJgrMxERIrtpadJw2dmpiY6OB6eUlDO2m5stIh4ePJKHhxUg6enJSc7Oh/9VVap4KChQet/fpY+MjAP4oaFZgImJCRcNDRrav79lMebm18ZCQoS4aGjQw0FBgrCZmSl3LS1aEQ8PHsuwsHv8VFSo1ru7bToWFixjY8alfHz4hHd37pl7e/aN8vL/DWtr1r1vb96xxcWRVDAwYFABAQIDZ2fOqSsrVn3+/ucZ19e1YqurTeZ2duyaysqPRYKCH53JyYlAfX36h/r67xVZWbLrR0eOyfDw+wutrUHs1NSzZ6KiX/2vr0XqnJwjv6SkU/dycuSWwMCbW7e3dcL9/eEck5M9riYmTGo2NmxaPz9+Qff39QLMzINPNDRoXKWlUfTl5dE08fH5CHFx4pPY2KtzMTFiUxUVKj8EBAgMx8eVUiMjRmXDw51eGBgwKJaWN6EFBQoPmpovtQcHDgkSEiQ2gIAbm+Li3z3r680mJydOabKyf811deqfCQkSG4ODHZ4sLFh0Gho0LhsbNi1ubtyyWlq07qCgW/tSUqT2Ozt2TdbWt2Gzs33OKSlSe+Pj3T4vL15xhIQTl1NTpvXR0bloAAAAAO3twSwgIEBg/PzjH7GxechbW7btamrUvsvLjUa+vmfZOTlyS0pKlN5MTJjUWFiw6M/PhUrQ0Ltr7+/FKqqqT+X7++0WQ0OGxU1NmtczM2ZVhYURlEVFis/5+ekQAgIEBn9//oFQUKDwPDx4RJ+fJbqoqEvjUVGi86OjXf5AQIDAj48FipKSP62dnSG8ODhwSPX18QS8vGPftrZ3wdrar3UhIUJjEBAgMP//5Rrz8/0O0tK/bc3NgUwMDBgUExMmNezswy9fX77hl5c1okREiMwXFy45xMSTV6enVfJ+fvyCPT16R2RkyKxdXbrnGRkyK3Nz5pVgYMCggYEZmE9PntHc3KN/IiJEZioqVH6QkDuriIgLg0ZGjMru7scpuLhr0xQUKDze3qd5Xl684gsLFh3b26124ODbOzIyZFY6OnROCgoUHklJktsGBgwKJCRIbFxcuOTCwp9d09O9bqysQ+9iYsSmkZE5qJWVMaTk5NM3eXnyi+fn1TLIyItDNzduWW1t2reNjQGM1dWxZE5OnNKpqUngbGzYtFZWrPr09PMH6urPJWVlyq96evSOrq5H6QgIEBi6um/VeHjwiCUlSm8uLlxyHBw4JKamV/G0tHPHxsaXUejoyyPd3aF8dHTonB8fPiFLS5bdvb1h3IuLDYaKig+FcHDgkD4+fEK1tXHEZmbMqkhIkNgDAwYF9vb3AQ4OHBJhYcKjNTVqX1dXrvm5uWnQhoYXkcHBmVgdHTonnp4nueHh2Tj4+OsTmJgrsxERIjNpadK72dmpcI6OB4mUlDOnm5stth4ePCKHhxWS6enJIM7Oh0lVVar/KChQeN/fpXqMjAOPoaFZ+ImJCYANDRoXv79l2ubm1zFCQoTGaGjQuEFBgsOZmSmwLS1adw8PHhGwsHvLVFSo/Lu7bdYWFiw6Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6FsalY2P4hHx87pl3d/aNe3v/DfLy1r1ra96xb2+RVMXFYFAwMAIDAQHOqWdnVn0rK+cZ/v61YtfXTearq+yadnaPRcrKH52CgolAycn6h3197xX6+rLrWVmOyUdH+wvw8EHsra2zZ9TUX/2iokXqr68jv5ycU/ekpOSWcnKbW8DAdcK3t+Ec/f09rpOTTGomJmxaNjZ+QT8/9QL394NPzMxoXDQ0UfSlpdE05eX5CPHx4pNxcatz2NhiUzExKj8VFQgMBASVUsfHRmUjI51ew8MwKBgYN6GWlgoPBQUvtZqaDgkHByQ2EhIbm4CA3z3i4s0m6+tOaScnf82ysuqfdXUSGwkJHZ6Dg1h0LCw0LhoaNi0bG9yybm607lpaW/ugoKT2UlJ2TTs7t2HW1n3Os7NSeykp3T7j415xLy8Tl4SEpvVTU7lo0dEAAAAAwSzt7UBgICDjH/z8ecixsbbtW1vUvmpqjUbLy2fZvr5ySzk5lN5KSpjUTEyw6FhYhUrPz7tr0NDFKu/vT+Wqqu0W+/uGxUNDmtdNTWZVMzMRlIWFis9FRekQ+fkEBgIC/oF/f6DwUFB4RDw8Jbqfn0vjqKii81FRXf6jo4DAQEAFio+PP62SkiG8nZ1wSDg48QT19WPfvLx3wba2r3Xa2kJjISEgMBAQ5Rr///0O8/O/bdLSgUzNzRgUDAwmNRMTwy/s7L7hX181opeXiMxERC45FxeTV8TEVfKnp/yCfn56Rz09yKxkZLrnXV0yKxkZ5pVzc8CgYGAZmIGBntFPT6N/3NxEZiIiVH4qKjurkJALg4iIjMpGRscp7u5r07i4KDwUFKd53t684l5eFh0LC61229vbO+DgZFYyMnROOjoUHgoKkttJSQwKBgZIbCQkuORcXJ9dwsK9btPTQ++srMSmYmI5qJGRMaSVldM35OTyi3l51TLn54tDyMhuWTc32rdtbQGMjY2xZNXVnNJOTkngqanYtGxsrPpWVvMH9PTPJerqyq9lZfSOenpH6a6uEBgICG/VurrwiHh4Sm8lJVxyLi44JBwcV/GmpnPHtLSXUcbGyyPo6KF83d3onHR0PiEfH5bdS0th3L29DYaLiw+FiorgkHBwfEI+PnHEtbXMqmZmkNhISAYFAwP3Afb2HBIODsKjYWFqXzU1rvlXV2nQubkXkYaGmVjBwTonHR0nuZ6e2Tjh4esT+Pgrs5iYIjMREdK7aWmpcNnZB4mOjjOnlJQttpubPCIeHhWSh4fJIOnph0nOzqr/VVVQeCgopXrf3wOPjIxZ+KGhCYCJiRoXDQ1l2r+/1zHm5oTGQkLQuGhogsNBQSmwmZlady0tHhEPD3vLsLCo/FRUbda7uyw6FhZSUlJSCQkJCWpqamrV1dXVMDAwMDY2NjalpaWlODg4OL+/v79AQEBAo6Ojo56enp6BgYGB8/Pz89fX19f7+/v7fHx8fOPj4+M5OTk5goKCgpubm5svLy8v/////4eHh4c0NDQ0jo6OjkNDQ0NERERExMTExN7e3t7p6enpy8vLy1RUVFR7e3t7lJSUlDIyMjKmpqamwsLCwiMjIyM9PT097u7u7kxMTEyVlZWVCwsLC0JCQkL6+vr6w8PDw05OTk4ICAgILi4uLqGhoaFmZmZmKCgoKNnZ2dkkJCQksrKysnZ2dnZbW1tboqKioklJSUltbW1ti4uLi9HR0dElJSUlcnJycvj4+Pj29vb2ZGRkZIaGhoZoaGhomJiYmBYWFhbU1NTUpKSkpFxcXFzMzMzMXV1dXWVlZWW2tra2kpKSkmxsbGxwcHBwSEhISFBQUFD9/f397e3t7bm5ubna2traXl5eXhUVFRVGRkZGV1dXV6enp6eNjY2NnZ2dnYSEhISQkJCQ2NjY2Kurq6sAAAAAjIyMjLy8vLzT09PTCgoKCvf39/fk5OTkWFhYWAUFBQW4uLi4s7Ozs0VFRUUGBgYG0NDQ0CwsLCweHh4ej4+Pj8rKyso/Pz8/Dw8PDwICAgLBwcHBr6+vr729vb0DAwMDAQEBARMTExOKioqKa2trazo6OjqRkZGREREREUFBQUFPT09PZ2dnZ9zc3Nzq6urql5eXl/Ly8vLPz8/Pzs7OzvDw8PC0tLS05ubm5nNzc3OWlpaWrKysrHR0dHQiIiIi5+fn562tra01NTU1hYWFheLi4uL5+fn5Nzc3N+jo6OgcHBwcdXV1dd/f399ubm5uR0dHR/Hx8fEaGhoacXFxcR0dHR0pKSkpxcXFxYmJiYlvb29vt7e3t2JiYmIODg4OqqqqqhgYGBi+vr6+GxsbG/z8/PxWVlZWPj4+PktLS0vGxsbG0tLS0nl5eXkgICAgmpqamtvb29vAwMDA/v7+/nh4eHjNzc3NWlpaWvT09PQfHx8f3d3d3aioqKgzMzMziIiIiAcHBwfHx8fHMTExMbGxsbESEhISEBAQEFlZWVknJycngICAgOzs7OxfX19fYGBgYFFRUVF/f39/qampqRkZGRm1tbW1SkpKSg0NDQ0tLS0t5eXl5Xp6enqfn5+fk5OTk8nJycmcnJyc7+/v76CgoKDg4ODgOzs7O01NTU2urq6uKioqKvX19fWwsLCwyMjIyOvr6+u7u7u7PDw8PIODg4NTU1NTmZmZmWFhYWEXFxcXKysrKwQEBAR+fn5+urq6und3d3fW1tbWJiYmJuHh4eFpaWlpFBQUFGNjY2NVVVVVISEhIQwMDAx9fX19AAAAAAAAAID/PwAAAAAAAP6KG81LeJrUAEAAAAAAAAC88BdcKTuquP8/AAAAAAAANcJoIaLaD8kAQAAAAAAAAJn3z/uEmiCa/T8AAAAAAACsec/R9xdysf4/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgHBgYFBQUFBAQEBAQEBAQDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACIAXQCxAB0BnwE2AuACnANoBEUFMQYrBzIIRglnCi0KrwhaBykGGgUpBFYDngIAAnkBCQGvAGgANAASAAIAAAAAAAAAAAAAAAAAAAD/PwAAAAAAAAAAAAAAAAAA/j9VVVVVVVVVVVVVVVVVVfw/VVVVVVVVVVVVVVVVVVX6PxERERERERERERERERER+D8XbMEWbMEWbMEWbMEWbPU/GqABGqABGqABGqABGqDyPxqgARqgARqgARqgARqg7z8XAOWIHKz6OHNsVTrecew/eWbq0xbwLsf1iXf75CfpP8d9g0t+dP44TlR/VmSu5T+F/qyHqU1Ue4mN/47tHuI/aK8jHTM4ypfQhjphJGHeP+Wj30XxrQvSyQeMSpeT2j+wjO6wVoYd8YE7cz5/rtY/AAAAAAAAAAAAAAAAAAD/P1VVVVVVVVVVVVVVVVVV/b+amZmZmZmZmZmZmZmZmfw/kiRJkiRJkiRJkiRJkiT8vxzHcRzHcRzHcRzHcRzH+z9GF1100UUXXXTRRRdddPu/FDuxEzuxEzuxEzuxEzv7PxERERERERERERERERER+7/i4eHh4eHh4eHh4eHh4fo/G8prKK+hvIbyGsprKK/6vxiGYRiGYRiGYRiGYRiG+j8AAAAAAAAAAAAAAAAAAP8/AAAAAAAAAAAAAAAAAAD+v1VVVVVVVVVVVVVVVVVV+j8XbMEWbMEWbMEWbMEWbPW/GqABGqABGqABGqABGqDvP3lm6tMW8C7H9Yl3++Qn6b+F/qyHqU1Ue4mN/47tHuI/5aPfRfGtC9LJB4xKl5Pav7CM7rBWhh3xgTtzPn+u0j+rwqKGSAC7d9mXO4YnaMq/u/D4K62celAiIEC6QuXBPwAAAAAAAAAAAAAAAAAA/z9VVVVVVVVVVVVVVVVVVfy/ERERERERERERERERERH4PxqgARqgARqgARqgARqg8r8XAOWIHKz6OHNsVTrecew/x32DS350/jhOVH9WZK7lv2ivIx0zOMqX0IY6YSRh3j+wjO6wVoYd8YE7cz5/rta/ABt3l1FgsqbUCgN3LJXOP3WWezvsoUxyFRRotEkvxr9Fbu78RvG+GFfPbe+4cb0/AAAAAAAAAAAAAAAAAAD/P1VVVVVVVVVVVVVVVVVV/T+amZmZmZmZmZmZmZmZmfw/kiRJkiRJkiRJkiRJkiT8PxzHcRzHcRzHcRzHcRzH+z9GF1100UUXXXTRRRdddPs/FDuxEzuxEzuxEzuxEzv7PxERERERERERERERERER+z/i4eHh4eHh4eHh4eHh4fo/HB01ADgAR0hJS01PUFFSUwAAAAAAAAAAAAAAAABbXF3//////////////////////////////////////////w8PDx8Dew8P/wAAAAAAAAARAAoAERERAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABEADwoREREDCgcAARMJCwsAAAkGCwAACwAGEQAAABEREQAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAARAAoKERERAAoAAAIACQsAAAAJAAsAAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAADAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAAEDQAAAAAJDgAAAAAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAPAAAAAA8AAAAACRAAAAAAABAAABAAABIAAAASEhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAABISEgAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAoAAAAACgAAAAAJCwAAAAAACwAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAwAAAAACQwAAAAAAAwAAAwAADAxMjM0NTY3ODlBQkNERUZUISIZDQECAxFLHAwQBAsdEh4naG5vcHFiIAUGDxMUFRoIFgcoJBcYCQoOGx8lI4OCfSYqKzw9Pj9DR0pNWFlaW1xdXl9gYWNkZWZnaWprbHJzdHl6e3wAAAAAAAAAAABJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgAAAAAAAP////////////////////////////////////////////////////////////////8AAQIDBAUGBwgJ/////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD//wAAAAAAAAAAAAAAAACA/78AAAAAAADmBzBnx5NX856j7y/kYv4/AAAAAAAAAID+vwAAAAAAAAAAAAAAAAAAAAAAAAAA/z+4eHAtdCU7p8qEha5nu/8/e1YPLrNbRlg214IjFQz+P7gBF8WMiWmE0UJEtR+S/j+4ARfFjIlphNFCRLUfkv8/uAEXxYyJaYTRQkS1H5IAQAAAAAAAAACA/z8AAAAAAAA60qD9D3134S+4UnZUcQBAAAAAAAAAAAAAAAAAAAAAQM1DAAC3QwAA/wAAAP//AAD/////1kwAAAEAAAABAAAAAgAAAAEAAAABAAAAAgAAAAEAAAABAAAAPDkAAAUAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAA1XwAAQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8OQAABQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAIAAAD4UwAAAAQAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAACv////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnHwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQAAAAEUBAEAAAABFAHAtPmZzX2NvdW50ID09IDEAanNlbXUuYwBpbml0X3ZtX2ZzAHAtPmRyaXZlX2NvdW50ID09IDEAaW5pdF92bV9kcml2ZQBwLT5ldGhfY291bnQgPT0gMQBpbml0X3ZtAHZpcnRpb18lMDR4AHdyaXRlX3NpemUgPj0gMQB2aXJ0aW8uYwB2aXJ0aW9fYmxvY2tfcmVjdl9yZXF1ZXN0AHZpcnRpb190YWJsZXQAdmlydGlvX21vdXNlAHZpcnRpb19rZXlib2FyZAB3d2RkZGRkZHcAd3cAd3N3d3cAUXcAd3NzdwBRAHdzd3d3dwB3AHMAd2QAZFF3d3dkZGRkZGRkZGRkZGRkZGQAd3d3d3dkZGRkZAB3ZHcAd2J3ZGR3cwBiAHdiZGR3cwBiZGR3cwB3d3MAd3N3dwB3c3dzAHdzdwB3cwA5UDIwMDAuTAB3d3NzdwBoAHd3aAA5cDogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGlkPSVkCgBidWYgKyAxIDw9IGJ1Zl9lbmQAbWFyc2hhbGwAYnVmICsgMiA8PSBidWZfZW5kAGJ1ZiArIDQgPD0gYnVmX2VuZABidWYgKyA4IDw9IGJ1Zl9lbmQAbGVuIDw9IDY1NTM1AGJ1ZiArIDIgKyBsZW4gPD0gYnVmX2VuZABidWYgKyAxMyA8PSBidWZfZW5kAG4tPnR5cGUgPT0gRlRfRElSAGZzX25ldC5jAGlub2RlX2Rpcl9hZGQALi4Abi0+cmVmY291bnQgPj0gMQBpbm9kZV9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA9PSAwAGZsdXNoX2RpcgBuLT5yZWZjb3VudCA9PSAwAGlub2RlX2ZyZWUAbi0+b3Blbl9jb3VudCA9PSAwAGZzLT5mc19ibG9ja3MgPj0gMABmcy0+aW5vZGVfY2FjaGVfc2l6ZSA+PSAwAG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0FESU5HAGZzX3dnZXRfc2V0X2Vycm9yAGxpc3RfZW1wdHkoJm4tPnUuZGlyLmRlX2xpc3QpAGZzLT5pbm9kZV9jb3VudCA+PSAwAGJ1LT5yZWZfY291bnQgPj0gMQBmc19iYXNlX3VybF9kZWNyZWYAbi0+dS5kaXIuc2l6ZSA+PSAwAGlub2RlX2RpcmVudF9kZWxldGVfbm9fZGVjcmVmAHhocgAhZnMtPmZzX2F0dGFjaChmcywgJnJvb3RfZmQsICZxaWQsIHVpZCwgIiIsICIiKQBmc19jbWRfeGhyAG4tPnR5cGUgPT0gRlRfUkVHICYmIG4tPnUucmVnLnN0YXRlID09IFJFR19TVEFURV9MT0NBTABzZXRfYmFzZV91cmwAcmVzZXRfYmFzZV91cmwAZnNfaXNfbmV0KGZzMSkAZnNfbmV0X3Jlc2V0X2Jhc2VfdXJsAHNldF91cmwAZXhwb3J0X2ZpbGUAcGJrZGYyAHNldF9pbXBvcnRfZGlyAHVua25vd24gY29tbWFuZDogJyVzJwoAZnNfd3JpdGUAZnNfdHJ1bmNhdGUAZnNfbmV0X3NldF91cmwAZnNfbmV0X3NldF9iYXNlX3VybABuLT5vcGVuX2NvdW50ID49IDEAaW5vZGVfZGVjX29wZW4Abi0+dS5yZWcuc3RhdGUgPT0gUkVHX1NUQVRFX1VOTE9BREVEAGZzX29wZW5fd2dldABuLT51LnJlZy5zdGF0ZSA9PSBSRUdfU1RBVEVfTE9BREVEAGZzX3RyaW1fY2FjaGUAZnNfd2dldF9zZXRfbG9hZGVkAGxpc3RfZW1wdHkoJmZzLT5pbm9kZV9jYWNoZV9saXN0KQBmc19tZW1fZW5kAC90bXAAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAwLCAiIiwgIiIpAGZzX2NyZWF0ZV9jbWQALmZzY21kACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCByb290X2ZkLCBGU0NNRF9OQU1FLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjY2LCAwKQAhZnMtPmZzX2F0dGFjaChmcywgJnMtPnJvb3RfZmQsICZxaWQsIDAsICIiLCAiIikAZnNfaW5pdGlhbF9zeW5jAGhlYWQ/bm9jYWNoZT0lbGxkAC5oZWFkACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBoZWFkX2ZkLCAiLmhlYWQiLCBQOV9PX1JEV1IgfCBQOV9PX1RSVU5DLCAwNjQ0LCAwKQBjb3VsZCBub3QgbG9hZCAnaGVhZCcgZmlsZSAoSFRUUCBlcnJvcj0lZCkAaW52YWxpZCBoZWFkIHZlcnNpb24AUm9vdElEAGV4cGVjdGVkIFJvb3RJRCB0YWcARlNNYXhTaXplAGZzX25ldF9zZXRfZnNfbWF4X3NpemUAZmlsZXMALwAuZmlsZWxpc3QudHh0ACFmcy0+ZnNfY3JlYXRlKGZzLCAmcWlkLCBuZXdfZmlsZWxpc3RfZmQsICIuZmlsZWxpc3QudHh0IiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDY0NCwgMCkAaGVhZF9sb2FkZWQAY291bGQgbm90IGxvYWQgZmlsZSBsaXN0IChIVFRQIGVycm9yPSVkKQBlcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgbGlzdAAucHJlbG9hZDIvcHJlbG9hZC50eHQALnByZWxvYWQAaW52YWxpZCBmaWxlbmFtZQoAaW52YWxpZCBwcmVsb2FkIGZpbGU6ICclcycKAGZpbGVuYW1lIHdpdGhvdXQgdGFyZ2V0OiAlcwoAaW52YWxpZCBzaXplCgBpbnZhbGlkIGZpbGUgaWQKAGludmFsaWQgbW9kZQoAaW52YWxpZCB1aWQKAGludmFsaWQgZ2lkCgBpbnZhbGlkIG1ham9yCgBpbnZhbGlkIG1pbm9yCgBpbnZhbGlkIG10aW1lCgBpbnZhbGlkIHN5bWxpbmsgbmFtZQoARXJyb3I6IABmc19pc19uZXQoZnMpAGZzX25ldF9zZXRfcHdkAC5mc2NtZF9wd2QAIWZzLT5mc19jcmVhdGUoZnMsICZxaWQsIHJvb3RfZmQsICIuZnNjbWRfcHdkIiwgUDlfT19SRFdSIHwgUDlfT19UUlVOQywgMDYwMCwgMCkAIWZzLT5mc19hdHRhY2goZnMsICZyb290X2ZkLCAmcWlkLCAxMDAwLCAiIiwgIiIpAGZzX2ltcG9ydF9maWxlAFBPU1QAR0VUAHNhbHRfbGVuIDw9IFNBTFRfTEVOX01BWABmc193Z2V0LmMAcGJrZGYyX2htYWNfc2hhMjU2APui6QElMDE2bGx4AAoKAFZlcnNpb24AaHR0cDoAaHR0cHM6AGZpbGU6AGlycV9udW0gPCA0AHBjaS5jAHBjaV9kZXZpY2VfZ2V0X2lycQBiYXJfbnVtIDwgUENJX05VTV9SRUdJT05TAHBjaV9yZWdpc3Rlcl9iYXIAKHNpemUgJiAoc2l6ZSAtIDEpKSA9PSAwAHNpemUgPj0gNAByLT5zaXplID09IDAAaTQ0MEZYAFBJSVgzAHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUASW52YWxpZCBwcm9wZXJ0eSBuYW1lACc6JyBleHBlY3RlZABleHBlY3RpbmcgJywnIG9yICd9JwBleHBlY3RpbmcgJywnIG9yICddJwBudWxsAHRydWUAZmFsc2UAdW5rbm93biBpZGVudGlmaWVyOiAnJXMnAHVuZXhwZWN0ZWQgY2hhcmFjdGVyAHVudGVybWluYXRlZCBzdHJpbmcAaW52YWxpZyBoZXggZGlnaXQAdW5rbm93biBlc2NhcGUgY29kZQBzdHJpbmcgdG9vIGxvbmcAdW5leHBlY3RlZCBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQAQ291bGQgbm90IGxvYWQgYmxvY2sgZGV2aWNlIGZpbGUgKGVycj0lZCkKAGJsb2NrX3NpemUAaW52YWxpZCBibG9ja19zaXplCgBuX2Jsb2NrAGludmFsaWQgbl9ibG9jawoAcHJlZmV0Y2hfZ3JvdXBfbGVuAHByZWZldGNoX2dyb3VwX2xlbiBpcyB0b28gbGFyZ2UAcHJlZmV0Y2gAZXhwZWN0aW5nIGFuIGFycmF5CgBleHBlY3RpbmcgYW4gaW50ZWdlcgoAJXNibGslMDl1LmJpbgAlc2dycCUwOXUuYmluAENvdWxkIG5vdCBsb2FkIGdyb3VwICV1CgBzaXplID09IGJsb2NrX2J5dGVzICogcmVxLT5uX2Jsb2NrX251bQBibG9ja19uZXQuYwBiZl9wcmVmZXRjaF9ncm91cF9vbmxvYWQAYi0+c3RhdGUgPT0gQ0JMT0NLX0xPQURJTkcAYmZfdXBkYXRlX2Jsb2NrAENvdWxkIG5vdCBsb2FkIGJsb2NrICV1CgBzaXplID09IGJmLT5ibG9ja19zaXplICogNTEyAGJmX3JlYWRfb25sb2FkAHMtPm5fcGh5c19tZW1fcmFuZ2UgPCBQSFlTX01FTV9SQU5HRV9NQVgAaW9tZW0uYwByZWdpc3Rlcl9yYW1fZW50cnkAKHNpemUgJiAoREVWUkFNX1BBR0VfU0laRSAtIDEpKSA9PSAwICYmIHNpemUgIT0gMABDb3VsZCBub3QgYWxsb2NhdGUgVk0gbWVtb3J5CgBjcHVfcmVnaXN0ZXJfZGV2aWNlAHNpemUgPD0gMHhmZmZmZmZmZgBleHBlY3RpbmcgJyVzJyBwcm9wZXJ0eQoAJXM6IGludGVnZXIgZXhwZWN0ZWQKAEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlsZQoAZXJyb3I6ICVzCgB2ZXJzaW9uAFRoZSBlbXVsYXRvciBpcyB0b28gb2xkIHRvIHJ1biB0aGlzIFZNOiBwbGVhc2UgdXBncmFkZQoAVGhlIFZNIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0b28gb2xkIGZvciB0aGlzIGVtdWxhdG9yIHZlcnNpb246IHBsZWFzZSB1cGdyYWRlIHRoZSBWTSBjb25maWd1cmF0aW9uIGZpbGUKAG1hY2hpbmUAJXM6IHN0cmluZyBleHBlY3RlZAoAVW5rbm93biBtYWNoaW5lIG5hbWU6ICVzCgBtZW1vcnlfc2l6ZQBiaW9zAGtlcm5lbABpbml0cmQAY21kbGluZQBUWgBVVEMlYyUwMmQ6JTAyZABkcml2ZSVkAFRvbyBtYW55IGRyaXZlcwoAZmlsZQBkZXZpY2UAZnMlZABUb28gbWFueSBmaWxlc3lzdGVtcwoAdGFnAC9kZXYvcm9vdAAvZGV2L3Jvb3QlZABldGglZABUb28gbWFueSBldGhlcm5ldCBpbnRlcmZhY2VzCgBkcml2ZXIAdGFwAGlmbmFtZQBkaXNwbGF5MAB3aWR0aABoZWlnaHQAdmdhX2Jpb3MAaW5wdXRfZGV2aWNlAGFjY2VsAG5vbmUAYXV0bwB1bnN1cHBvcnRlZCAnYWNjZWwnIGNvbmZpZzogJXMKAHJ0Y19sb2NhbF90aW1lACVzOiBib29sZWFuIGV4cGVjdGVkCgAlczolZDogJXMKAHg4Nl9jcHUuYwB0cmlwbGUgZmF1bHQ6IHNodXRfZG93bgAuL3g4Nl9oZWxwZXIuaAB1bnN1cHBvcnRlZCBldmVudCB0eXBlAGludmFsaWQgdHNzAGludmFsaWQgdHNzIHR5cGUAcGMAdW5zdXBwb3J0ZWQgbWFjaGluZTogJXMKAHAtPnJhbV9zaXplID49ICgxIDw8IDIwKQB4ODZfbWFjaGluZS5jAHBjX21hY2hpbmVfaW5pdAAoYmlvc19zaXplICUgNjU1MzYpID09IDAgJiYgYmlvc19zaXplICE9IDAAdmlydGlvAGlkZQB2Z2EAc2ltcGxlZmIAdW5zdXBwb3J0ZWQgZGlzcGxheSBkZXZpY2U6ICVzCgBwczIAdW5zdXBwb3J0ZWQgaW5wdXQgZGV2aWNlOiAlcwoAS2VybmVsIHRvbyBzbWFsbAoASW52YWxpZCBrZXJuZWwgbWFnaWMKAEhkclMAS2VybmVsIHRvbyBvbGQKAE5vdCBlbm91Z2ggUkFNCgAJCgsMUklTQ1ZFTVUgSEFSRERJU0sAUElJWDMgSURFAHFlbXU6IHVuc3VwcG9ydGVkIGtleWJvYXJkIGNtZD0weCUwMngKAHN5c3RlbV9yZXNldF9yZXF1ZXN0AFZHQQADPQ8/DgAA/y0rICAgMFgweAAobnVsbCkALTBYKzBYIDBYLTB4KzB4IDB4AGluZgBJTkYAbmFuAE5BTgAuAAABAgQHAwYF";var tempDoublePtr=STATICTOP;STATICTOP+=16;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}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!")}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 SYSCALLS={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}),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 ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function flush_NO_FILESYSTEM(){var fflush=Module["_fflush"];if(fflush)fflush(0);var printChar=___syscall146.printChar;if(!printChar)return;var buffers=___syscall146.buffers;if(buffers[1].length)printChar(1,10);if(buffers[2].length)printChar(2,10)}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j<len;j++){___syscall146.printChar(stream,HEAPU8[ptr+j])}ret+=len}return ret}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{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 _abort(){Module["abort"]()}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}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};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,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/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function _console_get_size(pw,ph){var r;r=term.getSize();HEAPU32[pw>>2]=r[0];HEAPU32[ph>>2]=r[1]}function _console_write(opaque,buf,len){var str;str=String.fromCharCode.apply(String,HEAPU8.subarray(buf,buf+len));term.write(str)}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){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)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate==="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";function Browser_setImmediate_messageHandler(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}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{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}if(Browser.mainLoop.method==="timeout"&&Module.ctx){err("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=""}Browser.mainLoop.runIter(browserIterationFunc);if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop)return;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,1e3/fps);else _emscripten_set_main_loop_timing(1,1);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++}),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);_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}}try{func()}catch(e){if(e instanceof ExitStatus){return}else{if(e&&typeof e==="object"&&e.stack)err("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"]=[];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}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){b=new Blob([(new Uint8Array(byteArray)).buffer],{type:Browser.getMimetype(name)})}}catch(e){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);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;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);var audio=new Audio;audio.addEventListener("canplaythrough",(function(){finish(audio)}),false);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&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});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&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){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{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}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)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);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){err("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){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){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(){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()}}),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){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;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}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);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(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);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_async_call(func,arg,millis){Module["noExitRuntime"]=true;function wrapper(){getFuncWrapper(func,"vi")(arg)}if(millis>=0){Browser.safeSetTimeout(wrapper,millis)}else{Browser.safeRequestAnimationFrame(wrapper)}}function _emscripten_async_wget3_data(url,request,user,password,post_data,post_data_len,arg,free,onload,onerror,onprogress){var _url=Pointer_stringify(url);var _request=Pointer_stringify(request);var _user;var _password;var http=new XMLHttpRequest;if(user)_user=Pointer_stringify(user);else _user=null;if(password)_password=Pointer_stringify(password);else _password=null;http.open(_request,_url,true);http.responseType="arraybuffer";if(_user){http.setRequestHeader("Authorization","Basic "+btoa(_user+":"+_password))}var handle=Browser.getNextWgetRequestHandle();http.onload=function http_onload(e){if(http.status==200||_url.substr(0,4).toLowerCase()!="http"){var byteArray=new Uint8Array(http.response);var buffer=_malloc(byteArray.length);HEAPU8.set(byteArray,buffer);if(onload)Runtime.dynCall("viiii",onload,[handle,arg,buffer,byteArray.length]);if(free)_free(buffer)}else{if(onerror)Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onerror=function http_onerror(e){if(onerror){Runtime.dynCall("viiii",onerror,[handle,arg,http.status,http.statusText])}delete Browser.wgetRequests[handle]};http.onprogress=function http_onprogress(e){if(onprogress)Runtime.dynCall("viiii",onprogress,[handle,arg,e.loaded,e.lengthComputable||e.lengthComputable===undefined?e.total:0])};http.onabort=function http_onabort(e){delete Browser.wgetRequests[handle]};try{if(http.channel instanceof Ci.nsIHttpChannel)http.channel.redirectionLimit=0}catch(ex){}if(_request=="POST"){var _post_data=HEAPU8.subarray(post_data,post_data+post_data_len);http.setRequestHeader("Content-type","application/octet-stream");http.setRequestHeader("Content-length",post_data_len);http.setRequestHeader("Connection","close");http.send(_post_data)}else{http.send(null)}Browser.wgetRequests[handle]=http;return handle}function _emscripten_random(){return Math.random()}function __exit(status){exit(status)}function _exit(status){__exit(status)}function _fb_refresh(opaque,data,x,y,w,h,stride){var i,j,v,src,image_data,dst_pos,display,dst_pos1,image_stride;display=graphic_display;image_data=display.image.data;image_stride=display.width*4;dst_pos1=(y*display.width+x)*4;for(i=0;i<h;i=i+1|0){src=data;dst_pos=dst_pos1;for(j=0;j<w;j=j+1|0){v=HEAPU32[src>>2];image_data[dst_pos]=v>>16&255;image_data[dst_pos+1]=v>>8&255;image_data[dst_pos+2]=v&255;image_data[dst_pos+3]=255;src=src+4|0;dst_pos=dst_pos+4|0}data=data+stride|0;dst_pos1=dst_pos1+image_stride|0}display.ctx.putImageData(display.image,0,0,x,y,w,h)}function _file_buffer_init(bs){HEAPU32[bs>>2]=0;HEAPU32[bs+4>>2]=0}function _file_buffer_read(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){HEAPU8[buf+i]=data[offset+i]}}}function _file_buffer_reset(bs){_file_buffer_resize(bs,0);_file_buffer_init(bs)}function _file_buffer_get_new_handle(){var h;if(typeof Browser.fbuf_table=="undefined"){Browser.fbuf_table=new Object;Browser.fbuf_next_handle=1}for(;;){h=Browser.fbuf_next_handle;Browser.fbuf_next_handle++;if(Browser.fbuf_next_handle==2147483648)Browser.fbuf_next_handle=1;if(typeof Browser.fbuf_table[h]=="undefined"){return h}}}function _file_buffer_resize(bs,new_size){var h,size,new_data,i,data;h=HEAPU32[bs>>2];size=HEAPU32[bs+4>>2];if(new_size==0){if(h!=0){delete Browser.fbuf_table[h];h=0}}else if(size==0){h=_file_buffer_get_new_handle();new_data=new Uint8Array(new_size);Browser.fbuf_table[h]=new_data}else if(size!=new_size){data=Browser.fbuf_table[h];new_data=new Uint8Array(new_size);if(new_size>size){new_data.set(data,0)}else{for(i=0;i<new_size;i=i+1|0)new_data[i]=data[i]}Browser.fbuf_table[h]=new_data}HEAPU32[bs>>2]=h;HEAPU32[bs+4>>2]=new_size;return 0}function _file_buffer_set(bs,offset,val,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=val}}}function _file_buffer_write(bs,offset,buf,size){var h,data,i;h=HEAPU32[bs>>2];if(h){data=Browser.fbuf_table[h];for(i=0;i<size;i=i+1|0){data[offset+i]=HEAPU8[buf+i]}}}function _fs_export_file(filename,buf,buf_len){var _filename=Pointer_stringify(filename);var data=HEAPU8.subarray(buf,buf+buf_len);var file=new Blob([data],{type:"application/octet-stream"});var url=URL.createObjectURL(file);var a=document.createElement("a");a.href=url;a.setAttribute("download",_filename);a.innerHTML="downloading";document.body.appendChild(a);setTimeout((function(){a.click();document.body.removeChild(a)}),50)}function _fs_wget_update_downloading(flag){update_downloading(Boolean(flag))}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();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)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_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()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}function _net_recv_packet(bs,buf,buf_len){if(net_state){net_state.recv_packet(HEAPU8.subarray(buf,buf+buf_len))}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}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}Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){err("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)};DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i<array.length;i++){var chr=array[i];if(chr>255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob==="function"?atob:(function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output});function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE==="boolean"&&ENVIRONMENT_IS_NODE){var buf;try{buf=Buffer.from(s,"base64")}catch(_){buf=new Buffer(s,"base64")}return new Uint8Array(buf.buffer,buf.byteOffset,buf.byteLength)}try{var decoded=decodeBase64(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}catch(_){throw new Error("Converting base64 string to bytes failed.")}}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return Module["dynCall_iiiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{return Module["dynCall_iiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return Module["dynCall_iiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiiiiiiiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16){var sp=stackSave();try{return Module["dynCall_iiiiiiiiiiiiiiiii"](index,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{Module["dynCall_viiiiii"](index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["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_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_iiiiiiii":invoke_iiiiiiii,"invoke_iiiiiiiii":invoke_iiiiiiiii,"invoke_iiiiiiiiiiiiiiiii":invoke_iiiiiiiiiiiiiiiii,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiii":invoke_viiiiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"__exit":__exit,"_abort":_abort,"_clock_gettime":_clock_gettime,"_console_get_size":_console_get_size,"_console_write":_console_write,"_emscripten_async_call":_emscripten_async_call,"_emscripten_async_wget3_data":_emscripten_async_wget3_data,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_random":_emscripten_random,"_emscripten_set_main_loop":_emscripten_set_main_loop,"_emscripten_set_main_loop_timing":_emscripten_set_main_loop_timing,"_exit":_exit,"_fb_refresh":_fb_refresh,"_file_buffer_get_new_handle":_file_buffer_get_new_handle,"_file_buffer_init":_file_buffer_init,"_file_buffer_read":_file_buffer_read,"_file_buffer_reset":_file_buffer_reset,"_file_buffer_resize":_file_buffer_resize,"_file_buffer_set":_file_buffer_set,"_file_buffer_write":_file_buffer_write,"_fs_export_file":_fs_export_file,"_fs_wget_update_downloading":_fs_wget_update_downloading,"_gettimeofday":_gettimeofday,"_gmtime_r":_gmtime_r,"_localtime_r":_localtime_r,"_net_recv_packet":_net_recv_packet,"_time":_time,"_tzset":_tzset,"flush_NO_FILESYSTEM":flush_NO_FILESYSTEM,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};// EMSCRIPTEN_START_ASM +var asm=(/** @suppress {uselessCode} */ function(global,env,buffer) { +"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.DYNAMICTOP_PTR|0;var j=env.tempDoublePtr|0;var k=env.ABORT|0;var l=env.STACKTOP|0;var m=env.STACK_MAX|0;var n=0;var o=0;var p=0;var q=0;var r=global.NaN,s=global.Infinity;var t=0,u=0,v=0,w=0,x=0.0;var y=0;var z=global.Math.floor;var A=global.Math.abs;var B=global.Math.sqrt;var C=global.Math.pow;var D=global.Math.cos;var E=global.Math.sin;var F=global.Math.tan;var G=global.Math.acos;var H=global.Math.asin;var I=global.Math.atan;var J=global.Math.atan2;var K=global.Math.exp;var L=global.Math.log;var M=global.Math.ceil;var N=global.Math.imul;var O=global.Math.min;var P=global.Math.max;var Q=global.Math.clz32;var R=env.abort;var S=env.assert;var T=env.enlargeMemory;var U=env.getTotalMemory;var V=env.abortOnCannotGrowMemory;var W=env.invoke_ii;var X=env.invoke_iii;var Y=env.invoke_iiii;var Z=env.invoke_iiiii;var _=env.invoke_iiiiii;var $=env.invoke_iiiiiii;var aa=env.invoke_iiiiiiii;var ba=env.invoke_iiiiiiiii;var ca=env.invoke_iiiiiiiiiiiiiiiii;var da=env.invoke_vi;var ea=env.invoke_vii;var fa=env.invoke_viii;var ga=env.invoke_viiii;var ha=env.invoke_viiiii;var ia=env.invoke_viiiiii;var ja=env.___assert_fail;var ka=env.___buildEnvironment;var la=env.___setErrNo;var ma=env.___syscall140;var na=env.___syscall146;var oa=env.___syscall54;var pa=env.___syscall6;var qa=env.__exit;var ra=env._abort;var sa=env._clock_gettime;var ta=env._console_get_size;var ua=env._console_write;var va=env._emscripten_async_call;var wa=env._emscripten_async_wget3_data;var xa=env._emscripten_get_now;var ya=env._emscripten_get_now_is_monotonic;var za=env._emscripten_memcpy_big;var Aa=env._emscripten_random;var Ba=env._emscripten_set_main_loop;var Ca=env._emscripten_set_main_loop_timing;var Da=env._exit;var Ea=env._fb_refresh;var Fa=env._file_buffer_get_new_handle;var Ga=env._file_buffer_init;var Ha=env._file_buffer_read;var Ia=env._file_buffer_reset;var Ja=env._file_buffer_resize;var Ka=env._file_buffer_set;var La=env._file_buffer_write;var Ma=env._fs_export_file;var Na=env._fs_wget_update_downloading;var Oa=env._gettimeofday;var Pa=env._gmtime_r;var Qa=env._localtime_r;var Ra=env._net_recv_packet;var Sa=env._time;var Ta=env._tzset;var Ua=env.flush_NO_FILESYSTEM;var Va=0.0; +// EMSCRIPTEN_START_FUNCS +function jb(a){a=a|0;var b=0;b=l;l=l+a|0;l=l+15&-16;return b|0}function kb(){return l|0}function lb(a){a=a|0;l=a}function mb(a,b){a=a|0;b=b|0;l=a;m=b}function nb(a,b){a=a|0;b=b|0;if(!n){n=a;o=b}}function ob(a){a=a|0;y=a}function pb(){return y|0}function qb(b){b=b|0;var d=0,e=0;d=c[4202132]|0;if(d>>>0>=1024)return;e=c[4202133]|0;a[20144+e>>0]=b;b=e+1|0;c[4202133]=(b|0)==1024?0:b;c[4202132]=d+1;return}function rb(a,b){a=a|0;b=b|0;var d=0;d=c[4202134]|0;if(!d)return;fb[c[(c[d>>2]|0)+32>>2]&15](d,a,b&65535);return}function sb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[4202134]|0;if(!e)return;Wa[c[(c[e>>2]|0)+24>>2]&15](e)|0;g=c[4202135]|0;h=g+-1|0;e=c[4202136]|0;f=e+-1|0;a=(((h|0)>(a|0)?a:h)<<15|0)/(g|0)|0;e=(((f|0)>(b|0)?b:f)<<15|0)/(e|0)|0;c[4202137]=a;c[4202138]=e;c[4202139]=d;b=c[4202134]|0;hb[c[(c[b>>2]|0)+28>>2]&7](b,a,e,0,d);return}function tb(a){a=a|0;var b=0;b=c[4202134]|0;if(!b)return;hb[c[(c[b>>2]|0)+28>>2]&7](b,c[4202137]|0,c[4202138]|0,a,c[4202139]|0);return}function ub(a,b){a=a|0;b=b|0;var d=0;d=c[(c[4202134]|0)+4>>2]|0;if(!d)return;fb[c[d+24>>2]&15](d,a,b);return}function vb(a){a=a|0;var b=0;c[4202140]=a;b=c[4202134]|0;if(!b)return;b=c[b+4>>2]|0;if(!b)return;eb[c[b+28>>2]&15](b,a);return}function wb(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=Le(20)|0;c[i+4>>2]=b;c[i+8>>2]=Tk(d)|0;if(e|0)c[i+16>>2]=Tk(e)|0;c[4202135]=f;c[4202136]=g;c[i+12>>2]=h;h=Le(248)|0;c[i>>2]=h;lf(h);bf(c[i>>2]|0,a,3,i);return}function xb(a){a=a|0;var b=0,d=0,e=0;e=c[a>>2]|0;b=c[e+164>>2]|0;if((b|0)>0){if((b|0)!=1)ja(15288,15305,207,15313);d=ad(c[e+108>>2]|0,4,a)|0;c[e+112>>2]=d;b=c[a+16>>2]|0;if(!b)return;hd(d,b);return}b=c[e+96>>2]|0;if((b|0)<=0){Bb(a);return}if((b|0)!=1)ja(15324,15305,224,15344);c[e+56>>2]=re(c[e+52>>2]|0,131072,5,a)|0;return}function yb(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;h=l;l=l+144|0;d=h;e=h+132|0;f=h+128|0;g=a+8|0;b=c[g>>2]|0;if(b|0?_b(b)|0:0){b=$b(c[g>>2]|0)|0;i=c[a+12>>2]|0;b=Ya[c[i+8>>2]&63](c[i>>2]|0,d,(b|0)<128?b:128)|0;if((b|0)>0)ac(c[g>>2]|0,d,b)|0;if(c[4202141]|0){ta(e|0,f|0);bc(c[g>>2]|0,c[e>>2]|0,c[f>>2]|0);c[4202141]=0}}b=c[a+16>>2]|0;if(b|0)fb[c[b+24>>2]&15](b,1,0);if(!(Xa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0)){b=0;while(1){eb[c[(c[a>>2]|0)+20>>2]&15](a,2e5);d=Xa[c[(c[a>>2]|0)+16>>2]&3](a,10)|0;if(b>>>0>13|(d|0)!=0)break;else b=b+1|0}if(!d){va(6,a|0,0);l=h;return}}va(6,a|0,10);l=h;return}function zb(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=c[a+8>>2]|0;Ea(b|0,(c[a+12>>2]|0)+(N(h,e)|0)+(d<<2)|0,d|0,e|0,f|0,g|0,h|0);return}function Ab(a){a=a|0;var b=0,d=0;b=c[a>>2]|0;d=c[b+96>>2]|0;if((d|0)<=0){Bb(a);return}if((d|0)!=1)ja(15324,15305,224,15344);c[b+56>>2]=re(c[b+52>>2]|0,131072,5,a)|0;return}function Bb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;g=c[b>>2]|0;c[g+24>>2]=1;d=c[b+4>>2]<<20;h=g+16|0;c[h>>2]=d;c[h+4>>2]=((d|0)<0)<<31>>31;h=b+8|0;d=c[h>>2]|0;if(d|0?a[d>>0]|0:0)hf(c[b>>2]|0,d);e=c[4202135]|0;d=c[4202136]|0;if((e|0)>0&(d|0)>0){f=g+32|0;if(!(c[f>>2]|0)){c[f>>2]=Tk(19811)|0;e=c[4202135]|0;d=c[4202136]|0}c[g+36>>2]=e;c[g+40>>2]=d}else{c[4202141]=1;f=Le(12)|0;c[f+4>>2]=2;c[f+8>>2]=5;c[g+44>>2]=f}e=g+180|0;d=c[e>>2]|0;do if((d|0)>0)if(c[b+12>>2]|0)if((d|0)==1){f=Le(32)|0;a[f>>0]=2;a[f+1>>0]=~~(+Aa()*256.0);a[f+2>>0]=~~(+Aa()*256.0);a[f+3>>0]=~~(+Aa()*256.0);a[f+4>>0]=~~(+Aa()*256.0);a[f+5>>0]=~~(+Aa()*256.0);c[f+8>>2]=3;c[f+12>>2]=0;c[g+176>>2]=f;break}else ja(15358,15305,269,15376);else{d=0;do{Uj(c[g+168+(d*12|0)+4>>2]|0);Uj(c[g+168+(d*12|0)>>2]|0);d=d+1|0}while((d|0)<(c[e>>2]|0));c[e>>2]=0;break}while(0);f=kf(g)|0;c[4202134]=f;jf(c[b>>2]|0);d=c[f+4>>2]|0;if(d|0)eb[c[d+28>>2]&15](d,c[4202140]|0);Uj(c[b>>2]|0);Uj(c[h>>2]|0);d=b+16|0;e=c[d>>2]|0;if(!e){Uj(b);va(6,f|0,0);return}Nl(e|0,0,gk(e)|0)|0;Uj(c[d>>2]|0);Uj(b);va(6,f|0,0);return}function Cb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[4202132]|0;a=(e|0)>(d|0)?d:e;c[4202132]=e-a;if(!a){b=0;return b|0}e=0;d=c[4202142]|0;do{f=1024-d|0;f=(a|0)<(f|0)?a:f;Ll(b+e|0,20144+d|0,f|0)|0;a=a-f|0;e=f+e|0;f=f+d|0;d=(f|0)==1024?0:f}while((a|0)!=0);c[4202142]=d;f=e;return f|0}function Db(b,d){b=b|0;d=d|0;var e=0,f=0;e=Le(572)|0;Fb(e,b,2,8,1);c[e+544>>2]=d;b=Wa[c[d>>2]&15](d)|0;d=y;a[e+288>>0]=b;a[e+289>>0]=b>>>8;a[e+290>>0]=b>>>16;a[e+291>>0]=b>>>24;a[e+292>>0]=d;f=Il(b|0,d|0,40)|0;a[e+293>>0]=f;f=Il(b|0,d|0,48)|0;a[e+294>>0]=f;d=Il(b|0,d|0,56)|0;a[e+295>>0]=d;return e|0}function Eb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0;k=l;l=l+16|0;h=k;i=c[a+544>>2]|0;j=a+548|0;if(c[j>>2]|0){j=-1;l=k;return j|0}if((Rb(a,h,b,d,0,16,0)|0)<0){j=0;l=k;return j|0}m=c[h>>2]|0;g=a+552|0;c[g>>2]=m;c[g+12>>2]=b;c[g+16>>2]=d;switch(m|0){case 0:{b=Tj(f)|0;c[g+4>>2]=b;c[g+8>>2]=f;m=h+8|0;b=ab[c[i+4>>2]&3](i,c[m>>2]|0,c[m+4>>2]|0,b,(f+-1|0)/512|0,2,a)|0;if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Tb(a,b);m=0;l=k;return m|0}}case 1:{if((f|0)<=0)ja(15396,15412,1097,15421);f=e+-16|0;m=Tj(f)|0;Rb(a,m,b,d,16,f,0)|0;b=h+8|0;b=ab[c[i+8>>2]&3](i,c[b>>2]|0,c[b+4>>2]|0,m,(f|0)/512|0,2,a)|0;Uj(m);if((b|0)>0){c[j>>2]=1;m=0;l=k;return m|0}else{Tb(a,b);m=0;l=k;return m|0}}default:{m=0;l=k;return m|0}}return 0}function Fb(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;n=l;l=l+64|0;m=n+32|0;k=n;Nl(d|0,0,544)|0;if(!(c[e>>2]|0)){k=c[e+4>>2]|0;c[d>>2]=k;c[d+12>>2]=c[e+16>>2];m=e+8|0;c[d+4>>2]=He(k,c[m>>2]|0,c[m+4>>2]|0,4096,0,d,8,3,7)|0;c[d+16>>2]=9}else{switch(f|0){case 1:{i=4096;j=512;break}case 2:{i=4097;j=256;break}case 3:{i=4099;j=1920;break}case 9:{i=4169;j=2;break}case 18:{i=4178;j=2432;break}default:ra()}c[m>>2]=i&65535;nk(k,32,15384,m)|0;v=Qd(c[e>>2]|0,k,-1,6900,i,0,j)|0;k=d+8|0;c[k>>2]=v;Yd(v,44,6900);Yd(c[k>>2]|0,46,f&65535);Xd(c[k>>2]|0,61,1);c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;v=m+2|0;a[v>>0]=16;u=m+3|0;a[u>>0]=1;t=m+4|0;a[t>>0]=4;s=m+8|0;r=m+9|0;q=m+10|0;p=m+11|0;o=m+12|0;i=m+13|0;c[s>>2]=0;a[s+4>>0]=0;a[i>>0]=16;j=m+14|0;a[j>>0]=0;e=m+15|0;a[e>>0]=0;Zd(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=3;a[t>>0]=4;a[s>>0]=0;a[r>>0]=16;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Zd(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;a[m>>0]=9;a[v>>0]=16;a[u>>0]=4;a[t>>0]=4;a[s>>0]=0;a[r>>0]=32;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;Zd(c[k>>2]|0,m,16)|0;c[m>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;c[m+16>>2]=0;a[m>>0]=9;a[v>>0]=20;a[u>>0]=2;a[t>>0]=4;a[s>>0]=0;a[r>>0]=48;a[q>>0]=0;a[p>>0]=0;a[o>>0]=0;a[i>>0]=16;a[j>>0]=0;a[e>>0]=0;c[m+16>>2]=0;Zd(c[k>>2]|0,m,20)|0;c[d+16>>2]=6;c[d+12>>2]=Sd(c[k>>2]|0,0)|0;m=Td(c[k>>2]|0)|0;c[d>>2]=m;c[d+4>>2]=He(m,0,0,16384,0,d,7,1,23)|0;Vd(c[k>>2]|0,4,16384,0,d,2)}c[d+264>>2]=f;c[d+268>>2]=65535;c[d+284>>2]=g;c[d+276>>2]=h;v=d+24|0;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[d+44>>2]=16;c[d+52>>2]=0;c[d+56>>2]=0;c[d+60>>2]=0;b[d+48>>1]=0;c[d+68>>2]=0;c[d+72>>2]=16;c[d+80>>2]=0;c[d+84>>2]=0;c[d+88>>2]=0;b[d+76>>1]=0;c[d+96>>2]=0;c[d+100>>2]=16;c[d+108>>2]=0;c[d+112>>2]=0;c[d+116>>2]=0;b[d+104>>1]=0;c[d+124>>2]=0;c[d+128>>2]=16;c[d+136>>2]=0;c[d+140>>2]=0;c[d+144>>2]=0;b[d+132>>1]=0;c[d+152>>2]=0;c[d+156>>2]=16;c[d+164>>2]=0;c[d+168>>2]=0;c[d+172>>2]=0;b[d+160>>1]=0;c[d+180>>2]=0;c[d+184>>2]=16;c[d+192>>2]=0;c[d+196>>2]=0;c[d+200>>2]=0;b[d+188>>1]=0;c[d+208>>2]=0;c[d+212>>2]=16;c[d+220>>2]=0;c[d+224>>2]=0;c[d+228>>2]=0;b[d+216>>1]=0;c[d+236>>2]=0;c[d+240>>2]=16;c[d+248>>2]=0;c[d+252>>2]=0;c[d+256>>2]=0;b[d+244>>1]=0;l=n;return}function Gb(a,b,d){a=a|0;b=b|0;d=d|0;return Wd(c[a+8>>2]|0,b,0,d)|0}function Hb(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;f=b&4095;switch(b>>>12&1048575|0){case 0:switch(e|0){case 2:switch(b&4095){case 4:{b=c[a+32>>2]|0;switch(b|0){case 0:{a=c[a+272>>2]|0;return a|0}case 1:{a=b;return a|0}default:{a=0;return a|0}}}case 0:{a=c[a+32>>2]|0;return a|0}case 32:{a=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;return a|0}case 40:{a=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;return a|0}case 48:{a=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;return a|0}default:{a=0;return a|0}}case 1:{f=f+-18|0;switch(f>>>1|f<<31|0){case 0:{a=16;return a|0}case 2:{a=c[a+36>>2]|0;return a|0}case 3:{a=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;return a|0}case 5:{a=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;return a|0}default:{a=0;return a|0}}}default:{if(!((e|0)==0&(f|0)==20)){a=0;return a|0}a=c[a+28>>2]|0;return a|0}}case 1:{if(f|e|0){a=0;return a|0}e=a+24|0;f=c[e>>2]|0;c[e>>2]=0;a=c[a+12>>2]|0;fb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);a=f;return a|0}case 2:{switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=f>>>0){a=0;return a|0}a=d[a+288+f>>0]|0;return a|0}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0);return a|0}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=f>>>0){a=0;return a|0}a=a+288+f|0;a=(d[a+1>>0]|0)<<8|(d[a>>0]|0)|(d[a+2>>0]|0)<<16|(d[a+3>>0]|0)<<24;return a|0}default:ra()}break}default:{a=0;return a|0}}return 0}function Ib(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0;g=d&4095;switch(d>>>12&1048575|0){case 0:switch(f|0){case 2:switch(g>>>3|d<<29|0){case 0:{c[a+32>>2]=e;return}case 4:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 5:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 6:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}default:return}case 1:switch(d&4095){case 22:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 24:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 28:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}default:return}default:{if(!((g|0)==20&(f|0)==0))return;c[a+28>>2]=e;if(e|0)return;g=c[a+12>>2]|0;fb[c[g>>2]&15](c[g+4>>2]|0,c[g+8>>2]|0,0);g=a+24|0;c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;c[g+12>>2]=0;c[g+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}}case 2:{Nb(a,g,e,f);return}case 3:{if(e>>>0>=8)return;Ob(a,e);return}default:return}}function Jb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;Ie(c[a+4>>2]|0,d,0,e);return}function Kb(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;a:do if(b>>>0<=255)if((e|0)==2)do switch(b|0){case 0:{f=1953655158;break a}case 4:{f=2;break a}case 8:{f=c[a+264>>2]|0;break a}case 12:{f=c[a+268>>2]|0;break a}case 16:{f=c[a+32>>2]|0;switch(f|0){case 1:break a;case 0:{f=c[a+272>>2]|0;break a}default:{f=0;break a}}}case 20:{f=c[a+32>>2]|0;break a}case 48:{f=c[a+36>>2]|0;break a}case 52:{f=16;break a}case 56:{f=c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]|0;break a}case 128:{f=c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]|0;break a}case 144:{f=c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]|0;break a}case 160:{f=c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]|0;break a}case 68:{f=c[a+40+((c[a+36>>2]|0)*28|0)>>2]|0;break a}case 96:{f=c[a+24>>2]|0;break a}case 112:{f=c[a+28>>2]|0;break a}case 252:{f=0;break a}default:{f=0;break a}}while(0);else f=0;else{b=b+-256|0;switch(e|0){case 0:{if((c[a+284>>2]|0)>>>0<=b>>>0){f=0;break a}f=d[a+288+b>>0]|0;break a}case 1:{if(((c[a+284>>2]|0)+-1|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0);break a}case 2:{if(((c[a+284>>2]|0)+-3|0)>>>0<=b>>>0){f=0;break a}f=a+288+b|0;f=(d[f+1>>0]|0)<<8|(d[f>>0]|0)|(d[f+2>>0]|0)<<16|(d[f+3>>0]|0)<<24;break a}default:ra()}}while(0);return f|0}function Lb(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;if(d>>>0>255){Nb(a,d+-256|0,e,f);return}if((f|0)!=2)return;do switch(d|0){case 20:{c[a+32>>2]=e;return}case 48:{if(e>>>0>=8)return;c[a+36>>2]=e;return}case 56:{if(!((e|0)!=0&(e+-1&e|0)==0))return;c[a+40+((c[a+36>>2]|0)*28|0)+4>>2]=e;return}case 128:{c[a+40+((c[a+36>>2]|0)*28|0)+12>>2]=e;return}case 144:{c[a+40+((c[a+36>>2]|0)*28|0)+16>>2]=e;return}case 160:{c[a+40+((c[a+36>>2]|0)*28|0)+20>>2]=e;return}case 112:{c[a+28>>2]=e;if(e|0)return;f=c[a+12>>2]|0;fb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);f=a+24|0;c[f>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f+16>>2]=0;c[a+44>>2]=16;c[a+52>>2]=0;c[a+56>>2]=0;c[a+60>>2]=0;b[a+48>>1]=0;c[a+68>>2]=0;c[a+72>>2]=16;c[a+80>>2]=0;c[a+84>>2]=0;c[a+88>>2]=0;b[a+76>>1]=0;c[a+96>>2]=0;c[a+100>>2]=16;c[a+108>>2]=0;c[a+112>>2]=0;c[a+116>>2]=0;b[a+104>>1]=0;c[a+124>>2]=0;c[a+128>>2]=16;c[a+136>>2]=0;c[a+140>>2]=0;c[a+144>>2]=0;b[a+132>>1]=0;c[a+152>>2]=0;c[a+156>>2]=16;c[a+164>>2]=0;c[a+168>>2]=0;c[a+172>>2]=0;b[a+160>>1]=0;c[a+180>>2]=0;c[a+184>>2]=16;c[a+192>>2]=0;c[a+196>>2]=0;c[a+200>>2]=0;b[a+188>>1]=0;c[a+208>>2]=0;c[a+212>>2]=16;c[a+220>>2]=0;c[a+224>>2]=0;c[a+228>>2]=0;b[a+216>>1]=0;c[a+236>>2]=0;c[a+240>>2]=16;c[a+248>>2]=0;c[a+252>>2]=0;c[a+256>>2]=0;b[a+244>>1]=0;return}case 68:{c[a+40+((c[a+36>>2]|0)*28|0)>>2]=e&1;return}case 80:{if(e>>>0>=8)return;Ob(a,e);return}case 100:{d=a+24|0;f=c[d>>2]&~e;c[d>>2]=f;if(f|0)return;f=c[a+12>>2]|0;fb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,0);return}default:return}while(0)}function Mb(a,b,d){a=a|0;b=b|0;d=d|0;return Je(c[a>>2]|0,b,0,d)|0}function Nb(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;switch(f|0){case 0:{if((c[b+284>>2]|0)>>>0<=d>>>0)return;a[b+288+d>>0]=e;d=c[b+280>>2]|0;if(!d)return;db[d&15](b);return}case 1:{if(((c[b+284>>2]|0)+-1|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=(e&65535)>>>8;d=c[b+280>>2]|0;if(!d)return;db[d&15](b);return}case 2:{if(((c[b+284>>2]|0)+-3|0)>>>0<=d>>>0)return;d=b+288+d|0;a[d>>0]=e;a[d+1>>0]=e>>>8;a[d+2>>0]=e>>>16;a[d+3>>0]=e>>>24;d=c[b+280>>2]|0;if(!d)return;db[d&15](b);return}default:return}}function Ob(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;p=l;l=l+16|0;k=p+4|0;m=p;if(c[a+40+(d*28|0)+24>>2]|0){l=p;return}o=a+40+(d*28|0)+16|0;f=(c[o>>2]|0)+2|0;if((f&1|0)==0?(e=Ya[c[a+16>>2]&63](a,f,0)|0,(e|0)!=0):0)f=b[e>>1]|0;else f=0;g=a+276|0;h=a+40+(d*28|0)+8|0;e=b[h>>1]|0;if(e<<16>>16==f<<16>>16){l=p;return}i=a+40+(d*28|0)+4|0;j=a+16|0;while(1){e=(c[o>>2]|0)+4+(((c[i>>2]|0)+65535&(e&65535))<<1)|0;if((e&1|0)==0?(n=Ya[c[j>>2]&63](a,e,0)|0,(n|0)!=0):0)e=b[n>>1]|0;else e=0;e=e&65535;if((Pb(a,k,m,d,e)|0)==0?(_a[c[g>>2]&7](a,d,e,c[k>>2]|0,c[m>>2]|0)|0)<0:0){e=13;break}e=(b[h>>1]|0)+1<<16>>16;b[h>>1]=e;if(e<<16>>16==f<<16>>16){e=13;break}}if((e|0)==13){l=p;return}}function Pb(a,d,f,g,h){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;Qb(a,p,g,h);o=p+12|0;j=e[o>>1]|0;a:do if(!(j&2)){i=p+8|0;k=p+14|0;h=0;do{h=(c[i>>2]|0)+h|0;if(!(j&1)){i=0;break a}Qb(a,p,g,e[k>>1]|0);m=b[o>>1]|0;j=m&65535}while(!(j&2|0));j=m&65535;n=6}else{h=0;n=6}while(0);b:do if((n|0)==6){k=p+8|0;m=p+14|0;i=0;while(1){i=(c[k>>2]|0)+i|0;if(!(j&1))break b;Qb(a,p,g,e[m>>1]|0);j=e[o>>1]|0;if(!(j&2)){h=-1;break}}l=q;return h|0}while(0);c[d>>2]=h;c[f>>2]=i;f=0;l=q;return f|0}function Qb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=a+16|0;g=16;e=(c[a+40+(d*28|0)+12>>2]|0)+(e<<4)|0;while(1){d=4096-(e&4095)|0;d=(g|0)<(d|0)?g:d;f=Ya[c[h>>2]&63](a,e,0)|0;if(!f){b=4;break}Ll(b|0,f|0,d|0)|0;g=g-d|0;if((g|0)<=0){b=4;break}else{b=b+d|0;e=d+e|0}}if((b|0)==4)return}function Rb(a,d,f,g,h,i,j){a=a|0;d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;z=l;l=l+16|0;y=z;if(!i){y=0;l=z;return y|0}x=a+40+(f*28|0)+12|0;w=a+16|0;m=y;n=16;g=(c[x>>2]|0)+(g<<4)|0;while(1){f=4096-(g&4095)|0;f=(n|0)<(f|0)?n:f;k=Ya[c[w>>2]&63](a,g,0)|0;if(!k)break;Ll(m|0,k|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{m=m+f|0;g=f+g|0}}u=(j|0)!=0;v=y+12|0;k=b[v>>1]|0;f=k&65535;g=f&2;a:do if(u)if(!g){j=y+14|0;while(1){if(!(f&1)){q=-1;break}g=y;k=16;m=((e[j>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Ya[c[w>>2]&63](a,m,0)|0;if(!n)break;Ll(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}k=b[v>>1]|0;f=k&65535;g=f&2;if(g){t=2;break a}}l=z;return q|0}else t=2;else t=0;while(0);if((g|0)!=(t|0)){y=-1;l=z;return y|0}r=y+8|0;s=y+14|0;m=h;while(1){p=c[r>>2]|0;if(m>>>0<p>>>0){f=21;break}if(!(f&1)){q=-1;f=40;break}o=m-p|0;g=y;n=16;j=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(j&4095)|0;f=(n|0)<(f|0)?n:f;h=Ya[c[w>>2]&63](a,j,0)|0;if(!h)break;Ll(g|0,h|0,f|0)|0;n=n-f|0;if((n|0)<=0)break;else{g=g+f|0;j=f+j|0}}g=b[v>>1]|0;f=g&65535;if((f&2|0)!=(t|0)){q=-1;f=40;break}else{m=o;k=g}}if((f|0)==21){n=d;g=i;f=k;b:while(1){q=n;d=g;do{o=p-m|0;o=(d|0)<(o|0)?d:o;k=m+(c[y>>2]|0)|0;g=(o|0)>0;c:do if(u){if(g){n=o;j=q;while(1){g=4096-(k&4095)|0;g=(n|0)<(g|0)?n:g;h=Ya[c[w>>2]&63](a,k,1)|0;if(!h)break c;Ll(h|0,j|0,g|0)|0;n=n-g|0;if((n|0)<=0)break;else{k=g+k|0;j=j+g|0}}}}else if(g){j=q;h=o;while(1){g=4096-(k&4095)|0;g=(h|0)<(g|0)?h:g;n=Ya[c[w>>2]&63](a,k,0)|0;if(!n)break c;Ll(j|0,n|0,g|0)|0;h=h-g|0;if((h|0)<=0)break;else{j=j+g|0;k=g+k|0}}}while(0);d=d-o|0;if(!d){q=0;f=40;break b}m=o+m|0;q=q+o|0}while((m|0)!=(p|0));if(!(f&1)){q=-1;f=40;break}g=y;k=16;m=((e[s>>1]|0)<<4)+(c[x>>2]|0)|0;while(1){f=4096-(m&4095)|0;f=(k|0)<(f|0)?k:f;n=Ya[c[w>>2]&63](a,m,0)|0;if(!n)break;Ll(g|0,n|0,f|0)|0;k=k-f|0;if((k|0)<=0)break;else{g=g+f|0;m=f+m|0}}f=b[v>>1]|0;if((t|0)!=(f&2|0)){q=-1;f=40;break}n=q;g=d;m=0;p=c[r>>2]|0}if((f|0)==40){l=z;return q|0}}else if((f|0)==40){l=z;return q|0}return 0}function Sb(a,b){a=a|0;b=b|0;Tb(a,b);c[a+548>>2]=0;Ob(a,c[a+564>>2]|0);return}function Tb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+16|0;e=i;f=b+552|0;g=c[f+12>>2]|0;h=c[f+16>>2]|0;switch(c[f>>2]|0){case 0:{e=c[f+8>>2]|0;f=c[f+4>>2]|0;a[f+(e+-1)>>0]=d>>>31;Rb(b,f,g,h,0,e,1)|0;Uj(f);Ub(b,g,h,e);l=i;return}case 1:{a[e>>0]=d>>>31;Rb(b,e,g,h,0,1,1)|0;Ub(b,g,h,1);l=i;return}default:ra()}}function Ub(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=a+40+(d*28|0)+20|0;h=(c[j>>2]|0)+2|0;if(!(h&1)){i=a+16|0;g=Ya[c[i>>2]&63](a,h,0)|0;if(!g)g=0;else g=b[g>>1]|0;g=g&65535;h=Ya[c[i>>2]&63](a,h,1)|0;if(h)b[h>>1]=g+1}else g=0;g=(c[j>>2]|0)+4+(((c[a+40+(d*28|0)+4>>2]|0)+65535&g)<<3)|0;if((g&3|0)==0?(k=Ya[c[a+16>>2]&63](a,g,1)|0,k|0):0)c[k>>2]=e;g=g+4|0;if((g&3|0)==0?(l=Ya[c[a+16>>2]&63](a,g,1)|0,l|0):0)c[l>>2]=f;l=a+24|0;c[l>>2]=c[l>>2]|1;l=c[a+12>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}function Vb(d,e){d=d|0;e=e|0;var f=0;f=Le(552)|0;Fb(f,d,1,8,2);c[f+272>>2]=32;c[f+64>>2]=1;c[f+544>>2]=e;d=f+288|0;c[d>>2]=c[e>>2];b[d+4>>1]=b[e+4>>1]|0;a[f+294>>0]=0;a[f+295>>0]=0;c[f+548>>2]=12;c[e+16>>2]=f;c[e+20>>2]=4;c[e+24>>2]=4;c[e+28>>2]=3;return f|0}function Wb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=l;l=l+16|0;g=c[a+544>>2]|0;if((b|0)!=1){l=h;return 0}f=a+548|0;if((Rb(a,h,1,d,0,c[f>>2]|0,0)|0)<0){l=h;return 0}f=c[f>>2]|0;b=e-f|0;e=Tj(b)|0;Rb(a,e,1,d,f,b,0)|0;fb[c[g+8>>2]&15](g,e,b);Uj(e);Ub(a,1,d,0);l=h;return 0}function Xb(a){a=a|0;var d=0,e=0;e=c[a+16>>2]|0;if(!(c[e+40>>2]|0)){e=0;return e|0}a=(c[e+56>>2]|0)+2|0;if((a&1|0)==0?(d=Ya[c[e+16>>2]&63](e,a,0)|0,(d|0)!=0):0)a=b[d>>1]|0;else a=0;e=(b[e+48>>1]|0)!=a<<16>>16&1;return e|0}function Yb(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+32|0;m=o+8|0;j=o+4|0;n=o;k=c[a+16>>2]|0;if(!(c[k+40>>2]|0)){l=o;return}g=k+56|0;a=(c[g>>2]|0)+2|0;if((a&1|0)==0?(f=Ya[c[k+16>>2]&63](k,a,0)|0,(f|0)!=0):0)a=b[f>>1]|0;else a=0;i=k+48|0;f=b[i>>1]|0;if(f<<16>>16==a<<16>>16){l=o;return}a=(c[g>>2]|0)+4+(((c[k+44>>2]|0)+65535&(f&65535))<<1)|0;if((a&1|0)==0?(h=Ya[c[k+16>>2]&63](k,a,0)|0,(h|0)!=0):0)a=b[h>>1]|0;else a=0;h=a&65535;if(Pb(k,j,n,0,h)|0){l=o;return}a=k+548|0;f=c[a>>2]|0;g=f+e|0;if((g|0)>(c[n>>2]|0)){l=o;return}Nl(m|0,0,f|0)|0;Rb(k,m,0,h,0,f,1)|0;Rb(k,d,0,h,c[a>>2]|0,e,1)|0;Ub(k,0,h,g);b[i>>1]=(b[i>>1]|0)+1<<16>>16;l=o;return}function Zb(a,b){a=a|0;b=b|0;return}function _b(a){a=a|0;var d=0,e=0;if(!(c[a+40>>2]|0)){a=0;return a|0}e=(c[a+56>>2]|0)+2|0;if((e&1|0)==0?(d=Ya[c[a+16>>2]&63](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;a=(b[a+48>>1]|0)!=d<<16>>16&1;return a|0}function $b(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;h=j+4|0;i=j;if(!(c[a+40>>2]|0)){i=0;l=j;return i|0}f=a+56|0;e=(c[f>>2]|0)+2|0;if((e&1|0)==0?(d=Ya[c[a+16>>2]&63](a,e,0)|0,(d|0)!=0):0)d=b[d>>1]|0;else d=0;e=b[a+48>>1]|0;if(e<<16>>16==d<<16>>16){i=0;l=j;return i|0}d=(c[f>>2]|0)+4+(((c[a+44>>2]|0)+65535&(e&65535))<<1)|0;if((d&1|0)==0?(g=Ya[c[a+16>>2]&63](a,d,0)|0,(g|0)!=0):0)d=b[g>>1]|0;else d=0;h=(Pb(a,h,i,0,d&65535)|0)==0;i=h?c[i>>2]|0:0;l=j;return i|0}function ac(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(!(c[a+40>>2]|0)){e=0;return e|0}i=a+56|0;g=(c[i>>2]|0)+2|0;if((g&1|0)==0?(f=Ya[c[a+16>>2]&63](a,g,0)|0,(f|0)!=0):0)f=b[f>>1]|0;else f=0;h=a+48|0;g=b[h>>1]|0;if(g<<16>>16==f<<16>>16){e=0;return e|0}f=(c[i>>2]|0)+4+(((c[a+44>>2]|0)+65535&(g&65535))<<1)|0;if((f&1|0)==0?(j=Ya[c[a+16>>2]&63](a,f,0)|0,(j|0)!=0):0)f=b[j>>1]|0;else f=0;j=f&65535;Rb(a,d,0,j,0,e,1)|0;Ub(a,0,j,e);b[h>>1]=(b[h>>1]|0)+1<<16>>16;return e|0}function bc(b,d,e){b=b|0;d=d|0;e=e|0;a[b+288>>0]=d;a[b+289>>0]=(d&65535)>>>8;a[b+290>>0]=e;a[b+291>>0]=(e&65535)>>>8;e=b+24|0;c[e>>2]=c[e>>2]|2;e=c[b+12>>2]|0;fb[c[e>>2]&15](c[e+4>>2]|0,c[e+8>>2]|0,1);return}function cc(a,b){a=a|0;b=b|0;var d=0;d=Le(548)|0;Fb(d,a,3,4,3);c[d+272>>2]=1;c[d+64>>2]=1;c[d+544>>2]=b;return d|0}function dc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=c[a+544>>2]|0;if((b|0)!=1)return 0;b=Tj(e)|0;Rb(a,b,1,d,0,e,0)|0;fb[c[f+4>>2]&15](c[f>>2]|0,b,e);Uj(b);Ub(a,1,d,0);return 0}function ec(a,b,d){a=a|0;b=b|0;d=d|0;if(c[a+544>>2]|0){a=-1;return a|0}b=fc(a,1,d,b)|0;if(b|0){a=b;return a|0}a=fc(a,0,0,0)|0;return a|0}function fc(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k;if(!(c[d+40>>2]|0)){j=-1;l=k;return j|0}a[j>>0]=e;a[j+1>>0]=(e&65535)>>>8;a[j+2>>0]=f;a[j+3>>0]=(f&65535)>>>8;a[j+4>>0]=g;a[j+5>>0]=g>>>8;a[j+6>>0]=g>>>16;a[j+7>>0]=g>>>24;g=d+56|0;e=(c[g>>2]|0)+2|0;if((e&1|0)==0?(h=Ya[c[d+16>>2]&63](d,e,0)|0,(h|0)!=0):0)e=b[h>>1]|0;else e=0;h=d+48|0;f=b[h>>1]|0;if(f<<16>>16==e<<16>>16){j=-1;l=k;return j|0}e=(c[g>>2]|0)+4+(((c[d+44>>2]|0)+65535&(f&65535))<<1)|0;if((e&1|0)==0?(i=Ya[c[d+16>>2]&63](d,e,0)|0,(i|0)!=0):0)e=b[i>>1]|0;else e=0;i=e&65535;Rb(d,j,0,i,0,8,1)|0;Ub(d,0,i,8);b[h>>1]=(b[h>>1]|0)+1<<16>>16;j=0;l=k;return j|0}function gc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=c[a+544>>2]|0;if((g+-1|0)>>>0>=2){i=-1;return i|0}if((g|0)==1){b=fc(a,2,0,b)|0;if(b|0){i=b;return i|0}b=fc(a,2,1,d)|0;if(b|0){i=b;return i|0}}else{b=fc(a,3,0,b)|0;if(b|0){i=b;return i|0}b=fc(a,3,1,d)|0;if(b|0){i=b;return i|0}}if(e|0?(h=fc(a,2,8,e)|0,h|0):0){i=h;return i|0}d=a+548|0;b=c[d>>2]|0;if((b|0)!=(f|0)){g=f&1;do if((g|0)!=(b&1|0)){b=fc(a,1,272,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>1&1;do if((g|0)!=(b>>>1&1|0)){b=fc(a,1,273,g)|0;if(!b){b=c[d>>2]|0;break}else{i=b;return i|0}}while(0);g=f>>>2&1;if((g|0)!=(b>>>2&1|0)?(i=fc(a,1,274,g)|0,i|0):0)return i|0;c[d>>2]=f}i=fc(a,0,0,0)|0;return i|0}function hc(a,b){a=a|0;b=b|0;var d=0;d=Le(552)|0;Fb(d,a,18,256,4);c[d+64>>2]=1;c[d+272>>2]=0;c[d+280>>2]=7;c[d+544>>2]=b;return d|0}function ic(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;if((b|0)!=1)return 0;Ub(a,1,c,0);return 0}function jc(b){b=b|0;var e=0,f=0;switch(a[b+288>>0]|0){case 1:{switch(c[b+544>>2]|0){case 0:{e=15474;break}case 1:{e=15461;break}case 2:{e=15447;break}default:ra()}f=gk(e)|0;a[b+290>>0]=f;Ll(b+296|0,e|0,f|0)|0;return}case 18:{if((c[b+544>>2]|0)!=2)return;if((d[b+289>>0]|0)>=2)return;a[b+290>>0]=20;e=b+296|0;a[e>>0]=0;a[e+1>>0]=0;a[e+2>>0]=0;a[e+3>>0]=0;a[b+300>>0]=-1;a[b+301>>0]=127;e=b+302|0;f=e+14|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));return}case 17:{e=b+290|0;a[e>>0]=0;switch(c[b+544>>2]|0){case 0:switch(a[b+289>>0]|0){case 1:{a[e>>0]=16;e=b+296|0;f=e+16|0;do{a[e>>0]=255;e=e+1|0}while((e|0)<(f|0));return}case 20:{a[e>>0]=1;return}default:return}case 1:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=3;a[b+297>>0]=1;return}default:return}case 2:switch(a[b+289>>0]|0){case 1:{a[e>>0]=64;e=b+296|0;f=e+64|0;do{a[e>>0]=0;e=e+1|0}while((e|0)<(f|0));a[b+330>>0]=7;return}case 2:{a[e>>0]=2;a[b+296>>0]=0;a[b+297>>0]=1;return}case 3:{a[e>>0]=1;a[b+296>>0]=3;return}default:return}default:ra()}break}case 0:return;default:{a[b+290>>0]=0;return}}}function kc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=gk(e)|0;f=Le(564)|0;Fb(f,b,9,g+2|0,5);c[f+272>>2]=1;a[f+288>>0]=g;a[f+289>>0]=g>>>8;Ll(f+290|0,e|0,g|0)|0;c[f+544>>2]=d;c[f+548>>2]=8192;e=f+552|0;c[e>>2]=e;c[f+556>>2]=e;return f|0}function lc(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0;Va=l;l=l+3008|0;Ta=Va+2984|0;A=Va+2976|0;z=Va+2968|0;fa=Va+2960|0;y=Va+2944|0;x=Va+2928|0;Ia=Va+2920|0;Ga=Va+2912|0;Ea=Va+2904|0;w=Va+2888|0;v=Va+2880|0;za=Va+2872|0;u=Va+2848|0;t=Va+2840|0;s=Va+2832|0;r=Va+2816|0;q=Va+2800|0;Q=Va+2792|0;o=Va+2776|0;n=Va+2760|0;Aa=Va+2736|0;ea=Va+2712|0;xa=Va+2704|0;J=Va+2672|0;I=Va+2664|0;G=Va+2648|0;F=Va+2608|0;R=Va+2464|0;E=Va+2456|0;qa=Va+2448|0;D=Va+2440|0;pa=Va+2432|0;C=Va+2408|0;oa=Va+2400|0;B=Va+2384|0;na=Va+2376|0;p=Va+2352|0;H=Va+2344|0;m=Va+2288|0;Sa=Va+2240|0;Ha=Va+2992|0;Oa=Va+1024|0;Pa=Va;Na=Va+2120|0;Ma=Va+2988|0;Ka=Va+2104|0;Ja=Va+2088|0;Fa=Va+2072|0;ja=Va+2064|0;ka=Va+2056|0;la=Va+2048|0;La=f+544|0;Qa=c[La>>2]|0;if(g|0){h=0;l=Va;return h|0}P=f+560|0;if(c[P>>2]|0){h=-1;l=Va;return h|0}c[Ha>>2]=0;a:do if(!(Rb(f,Oa,0,h,0,7,0)|0)){Ra=a[Oa+4>>0]|0;i=a[Oa+5>>0]|0;g=(d[Oa+6>>0]<<8|i&255)&65535;c[Ha>>2]=(c[Ha>>2]|0)+7;Ra=Ra&255;Wa=Ra+-8|0;j=(g&65535)>>>8&255;do switch(Wa>>>1|Wa<<31|0){case 11:{k=-524;break a}case 0:{eb[c[Qa+8>>2]&15](Qa,Sa);Ta=c[Sa>>2]|0;Ja=Sa+8|0;Ia=c[Ja>>2]|0;Ja=c[Ja+4>>2]|0;La=Sa+16|0;Ka=c[La>>2]|0;La=c[La+4>>2]|0;Na=Sa+24|0;Ma=c[Na>>2]|0;Na=c[Na+4>>2]|0;Qa=Sa+32|0;Pa=c[Qa>>2]|0;Qa=c[Qa+4>>2]|0;Ua=Sa+40|0;Wa=c[Ua>>2]|0;Ua=c[Ua+4>>2]|0;c[m>>2]=0;c[m+4>>2]=Ta;Ta=m+8|0;c[Ta>>2]=Ia;c[Ta+4>>2]=Ja;Ta=m+16|0;c[Ta>>2]=Ka;c[Ta+4>>2]=La;Ta=m+24|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Na;Ta=m+32|0;c[Ta>>2]=Pa;c[Ta+4>>2]=Qa;Ta=m+40|0;c[Ta>>2]=Wa;c[Ta+4>>2]=Ua;c[m+48>>2]=0;c[m+52>>2]=256;Ta=mc(0,Oa,1024,15490,m)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}case 2:{c[H>>2]=Sa;c[H+4>>2]=Pa;b:do if((nc(f,0,h,Ha,15500,H)|0)==0?(W=c[Sa>>2]|0,X=f+552|0,k=c[f+556>>2]|0,(k|0)!=(X|0)):0){while(1){if((c[k+8>>2]|0)==(W|0))break;k=c[k+4>>2]|0;if((k|0)==(X|0))break b}if(k|0?(ia=c[k+12>>2]|0,ia|0):0){j=Tj(16)|0;c[j>>2]=f;c[j+4>>2]=0;c[j+8>>2]=h;b[j+12>>1]=g;i=$a[c[Qa+24>>2]&15](Qa,Na,ia,c[Pa>>2]|0,4,j)|0;if((i|0)<1)pc(Na,i,j);else c[P>>2]=1;Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 3:{c[p>>2]=Sa;c[p+4>>2]=Ka;c[p+8>>2]=Pa;c[p+12>>2]=Na;c[p+16>>2]=Ma;if(nc(f,0,h,Ha,15503,p)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;c:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=25;break c}}if((k|0)!=0?(ra=c[k+12>>2]|0,(ra|0)!=0):0){k=ab[c[Qa+28>>2]&3](Qa,Ja,ra,c[Ka>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0)|0;Uj(c[Ka>>2]|0);if(!k){Ta=(c[f+548>>2]|0)+-24|0;c[na>>2]=Ja;c[na+4>>2]=Ta;Ta=mc(0,Oa,1024,15509,na)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=25}else Ua=25;while(0);if((Ua|0)==25){Uj(c[Ka>>2]|0);k=-71}break a}case 4:{c[B>>2]=Sa;c[B+4>>2]=Na;c[B+8>>2]=Ma;c[B+12>>2]=Pa;if(nc(f,0,h,Ha,15512,B)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;d:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break d}}if((k|0)!=0?(sa=c[k+12>>2]|0,(sa|0)!=0):0)k=$a[c[Qa+60>>2]&15](Qa,Ka,sa,c[Na>>2]|0,c[Ma>>2]|0,c[Pa>>2]|0)|0;else k=-71}else k=-71;while(0);Uj(c[Na>>2]|0);Uj(c[Ma>>2]|0);if(k|0)break a;c[oa>>2]=Ka;Ta=mc(0,Oa,1024,15517,oa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}case 5:{c[C>>2]=Sa;c[C+4>>2]=Ja;c[C+8>>2]=Pa;c[C+12>>2]=Na;c[C+16>>2]=Ma;c[C+20>>2]=Ka;e:do if(!(nc(f,0,h,Ha,15519,C)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;f:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break f}if(k|0?(ta=c[k+12>>2]|0,ta|0):0){k=bb[c[Qa+64>>2]&1](Qa,Fa,ta,c[Ja>>2]|0,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;Uj(c[Ja>>2]|0);if(k|0){g=5;break e}c[pa>>2]=Fa;Wa=mc(0,Oa,1024,15517,pa)|0;k=Wa+7|0;g=Tj(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ll(g+7|0,Oa|0,Wa|0)|0;Rb(f,g,0,h,0,k,1)|0;Ub(f,0,h,k);Uj(g);g=0;k=0;break e}}while(0);Uj(c[Ja>>2]|0);g=5;k=-71}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 7:{c[D>>2]=Sa;if(nc(f,0,h,Ha,15526,D)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;g:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break g}}if((k|0)!=0?(ua=c[k+12>>2]|0,(ua|0)!=0):0){k=Za[c[Qa+68>>2]&3](Qa,Pa,1024,ua)|0;if(!k){c[qa>>2]=Pa;Ta=mc(0,Oa,1024,15528,qa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);break a}case 8:{c[E>>2]=Sa;c[E+4>>2]=Pa;h:do if((nc(f,0,h,Ha,15530,E)|0)==0?(Y=c[Sa>>2]|0,Z=f+552|0,K=c[f+556>>2]|0,(K|0)!=(Z|0)):0){k=K;while(1){if((c[k+8>>2]|0)==(Y|0))break;k=c[k+4>>2]|0;if((k|0)==(Z|0))break h}if(k|0?(_=c[k+12>>2]|0,_|0):0){k=Ya[c[Qa+32>>2]&63](Qa,_,Na)|0;if(k|0)break a;ua=Pa;va=c[ua+4>>2]|0;xa=c[Na+16>>2]|0;ya=c[Na+20>>2]|0;Ta=c[Na+24>>2]|0;Aa=Na+32|0;za=c[Aa>>2]|0;Aa=c[Aa+4>>2]|0;Ca=Na+40|0;Ba=c[Ca>>2]|0;Ca=c[Ca+4>>2]|0;Ea=Na+48|0;Da=c[Ea>>2]|0;Ea=c[Ea+4>>2]|0;Ga=Na+56|0;Fa=c[Ga>>2]|0;Ga=c[Ga+4>>2]|0;Ia=Na+64|0;Ha=c[Ia>>2]|0;Ia=c[Ia+4>>2]|0;Ka=Na+72|0;Ja=c[Ka>>2]|0;Ka=c[Ka+4>>2]|0;La=c[Na+80>>2]|0;Pa=Na+88|0;Ma=c[Pa>>2]|0;Pa=c[Pa+4>>2]|0;Qa=c[Na+96>>2]|0;Wa=Na+104|0;Sa=c[Wa>>2]|0;Wa=c[Wa+4>>2]|0;Ua=c[Na+112>>2]|0;wa=R;c[wa>>2]=c[ua>>2];c[wa+4>>2]=va;c[R+8>>2]=Na;c[R+12>>2]=xa;c[R+16>>2]=ya;c[R+20>>2]=Ta;Ta=R+24|0;c[Ta>>2]=za;c[Ta+4>>2]=Aa;Ta=R+32|0;c[Ta>>2]=Ba;c[Ta+4>>2]=Ca;Ta=R+40|0;c[Ta>>2]=Da;c[Ta+4>>2]=Ea;Ta=R+48|0;c[Ta>>2]=Fa;c[Ta+4>>2]=Ga;Ta=R+56|0;c[Ta>>2]=Ha;c[Ta+4>>2]=Ia;Ta=R+64|0;c[Ta>>2]=Ja;c[Ta+4>>2]=Ka;Ta=R+72|0;c[Ta>>2]=La;c[Ta+4>>2]=0;Ta=R+80|0;c[Ta>>2]=Ma;c[Ta+4>>2]=Pa;Ta=R+88|0;c[Ta>>2]=Qa;c[Ta+4>>2]=0;Ta=R+96|0;c[Ta>>2]=Sa;c[Ta+4>>2]=Wa;Ta=R+104|0;c[Ta>>2]=Ua;c[Ta+4>>2]=0;Ta=R+112|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+120|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+128|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=R+136|0;c[Ta>>2]=0;c[Ta+4>>2]=0;Ta=mc(0,Oa,1024,15533,R)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 9:{c[F>>2]=Sa;c[F+4>>2]=Pa;c[F+8>>2]=Na;c[F+12>>2]=Ma;c[F+16>>2]=Ka;c[F+20>>2]=Ja;c[F+24>>2]=Fa;c[F+28>>2]=ja;c[F+32>>2]=ka;c[F+36>>2]=la;i:do if(!(nc(f,0,h,Ha,15554,F)|0)){g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){g=4;k=0;break i}}if((k|0)!=0?(va=c[k+12>>2]|0,(va|0)!=0):0){La=Fa;Oa=ja;Wa=ka;k=la;k=cb[c[Qa+36>>2]&1](Qa,va,c[Pa>>2]|0,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0,c[Ja>>2]|0,c[Ja+4>>2]|0,c[La>>2]|0,c[La+4>>2]|0,c[Oa>>2]|0,c[Oa+4>>2]|0,c[Wa>>2]|0,c[Wa+4>>2]|0,c[k>>2]|0,c[k+4>>2]|0)|0;if(!k){g=Tj(7)|0;a[g>>0]=7;a[g+1>>0]=0;a[g+2>>0]=0;a[g+3>>0]=0;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Rb(f,g,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(g);g=0;k=0}else g=5}else{g=4;k=0}}else{g=4;k=0}}else{g=2;k=0}while(0);switch(g&7){case 5:break a;case 2:case 4:{Ua=262;break a}default:i=0}l=Va;return i|0}case 16:{c[G>>2]=Sa;c[G+4>>2]=Na;c[G+8>>2]=Pa;j:do if((nc(f,0,h,Ha,15565,G)|0)==0?($=c[Sa>>2]|0,aa=f+552|0,L=c[f+556>>2]|0,(L|0)!=(aa|0)):0){k=L;while(1){if((c[k+8>>2]|0)==($|0))break;k=c[k+4>>2]|0;if((k|0)==(aa|0))break j}if(k|0?(ma=c[k+12>>2]|0,ma|0):0){k=c[Pa>>2]|0;g=Tj(k+4|0)|0;Wa=Na;k=$a[c[Qa+44>>2]&15](Qa,ma,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0)break a;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,g|0,k+4|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Uj(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 21:{c[I>>2]=Sa;if(nc(f,0,h,Ha,15526,I)|0){Ua=262;break a}Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}case 22:{n=Pa+28|0;c[J>>2]=Sa;c[J+4>>2]=Pa;c[J+8>>2]=Pa+4;c[J+12>>2]=Pa+8;c[J+16>>2]=Pa+16;c[J+20>>2]=Pa+24;c[J+24>>2]=n;if(nc(f,0,h,Ha,15569,J)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;k:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=106;break k}}if((k|0)!=0?(ya=c[k+12>>2]|0,(ya|0)!=0):0){k=Ya[c[Qa+80>>2]&63](Qa,ya,Pa)|0;Uj(c[n>>2]|0);if((k|0)>=0){c[xa>>2]=k;Ta=mc(0,Oa,1024,15577,xa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=106}else Ua=106;while(0);if((Ua|0)==106){Uj(c[n>>2]|0);k=-71}break a}case 23:{n=Pa+8|0;o=Pa+16|0;p=Pa+24|0;q=Pa+28|0;c[ea>>2]=Sa;c[ea+4>>2]=Pa;c[ea+8>>2]=n;c[ea+12>>2]=o;c[ea+16>>2]=p;c[ea+20>>2]=q;if(nc(f,0,h,Ha,15579,ea)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;l:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){k=-71;break l}}if((k|0)!=0?(Ba=c[k+12>>2]|0,(Ba|0)!=0):0){k=Ya[c[Qa+84>>2]&63](Qa,Ba,Pa)|0;if((k|0)>=0){c[Aa>>2]=Pa;c[Aa+4>>2]=n;c[Aa+8>>2]=o;c[Aa+12>>2]=p;c[Aa+16>>2]=q;Ta=mc(0,Oa,1024,15586,Aa)|0;Uj(c[q>>2]|0);Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}else k=-71}else k=-71;while(0);Uj(c[q>>2]|0);break a}case 31:{c[n>>2]=Sa;c[n+4>>2]=Pa;c[n+8>>2]=Na;if(nc(f,0,h,Ha,15592,n)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;m:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=127;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==127)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=134;break m}}if((k|0)!=0?(Ca=c[k+12>>2]|0,(m|0)!=0&(Ca|0)!=0):0){k=Za[c[Qa+56>>2]&3](Qa,m,Ca,c[Na>>2]|0)|0;Uj(c[Na>>2]|0);if(!k){Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=134}else Ua=134;while(0);if((Ua|0)==134){Uj(c[Na>>2]|0);k=-71}break a}case 32:{c[o>>2]=Sa;c[o+4>>2]=Ma;c[o+8>>2]=Pa;c[o+12>>2]=Na;n:do if((nc(f,0,h,Ha,15596,o)|0)==0?(ba=c[Sa>>2]|0,ca=f+552|0,M=c[f+556>>2]|0,(M|0)!=(ca|0)):0){k=M;while(1){if((c[k+8>>2]|0)==(ba|0))break;k=c[k+4>>2]|0;if((k|0)==(ca|0))break n}if(k|0?(da=c[k+12>>2]|0,da|0):0){k=$a[c[Qa+20>>2]&15](Qa,Ka,da,c[Ma>>2]|0,c[Pa>>2]|0,c[Na>>2]|0)|0;if(k|0)break a;c[Q>>2]=Ka;Ta=mc(0,Oa,1024,15517,Q)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 33:{c[q>>2]=Sa;c[q+4>>2]=Na;c[q+8>>2]=Pa;c[q+12>>2]=Ma;if(nc(f,0,h,Ha,15601,q)|0){Ua=262;break a}m=c[Sa>>2]|0;n=f+552|0;k=c[f+556>>2]|0;o:do if((k|0)!=(n|0)){g=k;while(1){if((c[g+8>>2]|0)==(m|0)){Ua=156;break}g=c[g+4>>2]|0;if((g|0)==(n|0)){m=0;break}}if((Ua|0)==156)if(!g)m=0;else m=c[g+12>>2]|0;g=c[Pa>>2]|0;while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){k=-71;break o}}if((k|0)!=0?(Da=c[k+12>>2]|0,(m|0)!=0&(Da|0)!=0):0)k=_a[c[Qa+72>>2]&7](Qa,m,c[Na>>2]|0,Da,c[Ma>>2]|0)|0;else k=-71}else k=-71;while(0);Uj(c[Na>>2]|0);Uj(c[Ma>>2]|0);if(k|0)break a;Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}case 34:{c[r>>2]=Sa;c[r+4>>2]=Na;c[r+8>>2]=Pa;if(nc(f,0,h,Ha,15606,r)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;p:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0)){Ua=174;break p}}if((k|0)!=0?(wa=c[k+12>>2]|0,(wa|0)!=0):0){k=Ya[c[Qa+76>>2]&63](Qa,wa,c[Na>>2]|0)|0;Uj(c[Na>>2]|0);if(!k){Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}}else Ua=174}else Ua=174;while(0);if((Ua|0)==174){Uj(c[Na>>2]|0);k=-71}break a}case 46:{c[s>>2]=Sa;c[s+4>>2]=Pa;if(nc(f,0,h,Ha,15610,s)|0){Ua=262;break a}Ta=f+548|0;c[Ta>>2]=c[Sa>>2];Uj(c[Pa>>2]|0);c[t>>2]=c[Ta>>2];c[t+4>>2]=15613;Ta=mc(0,Oa,1024,15610,t)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}case 48:{c[u>>2]=Sa;c[u+4>>2]=Pa;c[u+8>>2]=Ma;c[u+12>>2]=Ka;c[u+16>>2]=Na;if(!(nc(f,0,h,Ha,15622,u)|0)){k=$a[c[Qa+12>>2]&15](Qa,Fa,Ja,c[Na>>2]|0,c[Ma>>2]|0,c[Ka>>2]|0)|0;if(!k){p=c[Sa>>2]|0;m=c[Fa>>2]|0;n=f+552|0;o=f+556|0;g=c[o>>2]|0;q:do if((g|0)!=(n|0)){k=g;while(1){if((c[k+8>>2]|0)==(p|0))break;k=c[k+4>>2]|0;if((k|0)==(n|0)){Ua=190;break q}}if(k){Qa=c[La>>2]|0;Wa=k+12|0;eb[c[Qa+4>>2]&15](Qa,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=190}else Ua=190;while(0);if((Ua|0)==190){Wa=Tj(16)|0;c[Wa+8>>2]=p;c[Wa+12>>2]=m;c[o>>2]=Wa;c[Wa>>2]=n;c[Wa+4>>2]=g;c[g>>2]=Wa}Uj(c[Ma>>2]|0);Uj(c[Ka>>2]|0);c[za>>2]=Ja;Wa=mc(0,Oa,1024,15517,za)|0;k=Wa+7|0;g=Tj(k)|0;a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;a[g+4>>0]=Ra+1;a[g+5>>0]=i;a[g+6>>0]=j;Ll(g+7|0,Oa|0,Wa|0)|0;Rb(f,g,0,h,0,k,1)|0;Ub(f,0,h,k);Uj(g);g=0;k=0}else g=5}else{g=2;k=0}switch(g&7){case 5:break a;case 2:{Ua=262;break a}default:i=0}l=Va;return i|0}case 50:{c[v>>2]=Sa;if(nc(f,0,h,Ha,15628,v)|0){Ua=262;break a}Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}case 51:{c[w>>2]=Sa;c[w+4>>2]=Pa;c[w+8>>2]=Na;r:do if(!(nc(f,0,h,Ha,15630,w)|0)){g=c[Sa>>2]|0;p=f+552|0;q=f+556|0;k=c[q>>2]|0;s:do if((k|0)!=(p|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0))break s}if(k|0){k=c[k+12>>2]|0;c[Ma>>2]=k;if(!k)break r;m=Le(e[Na>>1]<<2)|0;Wa=b[Na>>1]|0;n=Tj((Wa&65535)<<4)|0;t:do if(!(Wa<<16>>16)){g=0;Ua=209}else{k=0;do{c[Ea>>2]=m+(k<<2);k=k+1|0;if(nc(f,0,h,Ha,15528,Ea)|0){k=-71;break t}g=b[Na>>1]|0}while(k>>>0<(g&65535)>>>0);g=g&65535;k=c[Ma>>2]|0;Ua=209}while(0);if((Ua|0)==209)k=$a[c[Qa+16>>2]&15](Qa,Ma,n,k,g,m)|0;if(b[Na>>1]|0){g=0;do{Uj(c[m+(g<<2)>>2]|0);g=g+1|0}while(g>>>0<(e[Na>>1]|0)>>>0)}Uj(m);if((k|0)<0){Uj(n);break a}c[Ga>>2]=k;g=mc(0,Oa,1024,15628,Ga)|0;if(!k)o=g;else{m=0;do{c[Ia>>2]=n+(m<<4);g=(mc(0,Oa+g|0,1024-g|0,15517,Ia)|0)+g|0;m=m+1|0}while((m|0)<(k|0));o=g}Uj(n);n=c[Pa>>2]|0;m=c[Ma>>2]|0;g=c[q>>2]|0;u:do if((g|0)!=(p|0)){k=g;while(1){if((c[k+8>>2]|0)==(n|0))break;k=c[k+4>>2]|0;if((k|0)==(p|0)){Ua=223;break u}}if(k){Ta=c[La>>2]|0;Wa=k+12|0;eb[c[Ta+4>>2]&15](Ta,c[Wa>>2]|0);c[Wa>>2]=m}else Ua=223}else Ua=223;while(0);if((Ua|0)==223){Wa=Tj(16)|0;c[Wa+8>>2]=n;c[Wa+12>>2]=m;c[q>>2]=Wa;c[Wa>>2]=p;c[Wa+4>>2]=g;c[g>>2]=Wa}Ua=o+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,o|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);c[Ma>>2]=0}while(0);Ua=262;break a}case 54:{c[x>>2]=Sa;c[x+4>>2]=Na;c[x+8>>2]=Pa;v:do if((nc(f,0,h,Ha,15565,x)|0)==0?(S=c[Sa>>2]|0,T=f+552|0,N=c[f+556>>2]|0,(N|0)!=(T|0)):0){k=N;while(1){if((c[k+8>>2]|0)==(S|0))break;k=c[k+4>>2]|0;if((k|0)==(T|0))break v}if(k|0?(ga=c[k+12>>2]|0,ga|0):0){k=c[Pa>>2]|0;g=Tj(k+4|0)|0;Wa=Na;k=$a[c[Qa+48>>2]&15](Qa,ga,c[Wa>>2]|0,c[Wa+4>>2]|0,g+4|0,k)|0;if((k|0)<0){Uj(g);break a}a[g>>0]=k;a[g+1>>0]=k>>>8;a[g+2>>0]=k>>>16;a[g+3>>0]=k>>>24;Ua=k+11|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,g|0,k+4|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Uj(g);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 55:{c[y>>2]=Sa;c[y+4>>2]=Na;c[y+8>>2]=Pa;w:do if((nc(f,0,h,Ha,15565,y)|0)==0?(U=c[Sa>>2]|0,V=f+552|0,O=c[f+556>>2]|0,(O|0)!=(V|0)):0){k=O;while(1){if((c[k+8>>2]|0)==(U|0))break;k=c[k+4>>2]|0;if((k|0)==(V|0))break w}if(k|0?(ha=c[k+12>>2]|0,ha|0):0){Wa=c[Pa>>2]|0;g=Tj(Wa)|0;if(Rb(f,g,0,h,c[Ha>>2]|0,Wa,0)|0){Uj(g);break}k=Na;k=$a[c[Qa+52>>2]&15](Qa,ha,c[k>>2]|0,c[k+4>>2]|0,g,c[Pa>>2]|0)|0;Uj(g);if((k|0)<0)break a;c[fa>>2]=k;Ta=mc(0,Oa,1024,15526,fa)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Oa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}}while(0);Ua=262;break a}case 56:{c[z>>2]=Sa;if(nc(f,0,h,Ha,15526,z)|0){Ua=262;break a}g=c[Sa>>2]|0;m=f+552|0;k=c[f+556>>2]|0;x:do if((k|0)!=(m|0)){while(1){if((c[k+8>>2]|0)==(g|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break x}if(k|0){Ua=c[La>>2]|0;eb[c[Ua+4>>2]&15](Ua,c[k+12>>2]|0);Ua=c[k>>2]|0;Wa=c[k+4>>2]|0;c[Ua+4>>2]=Wa;c[Wa>>2]=Ua;Uj(k)}}while(0);Wa=Tj(7)|0;a[Wa>>0]=7;a[Wa+1>>0]=0;a[Wa+2>>0]=0;a[Wa+3>>0]=0;a[Wa+4>>0]=Ra+1;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Rb(f,Wa,0,h,0,7,1)|0;Ub(f,0,h,7);Uj(Wa);Wa=0;l=Va;return Wa|0}default:{c[A>>2]=Ra;pl(15634,A)|0;Ua=262;break a}}while(0)}else{i=0;j=0;Ua=262}while(0);if((Ua|0)==262)k=-71;c[Ta>>2]=0-k;Ta=mc(0,Sa,4,15526,Ta)|0;Ua=Ta+7|0;Wa=Tj(Ua)|0;a[Wa>>0]=Ua;a[Wa+1>>0]=Ua>>>8;a[Wa+2>>0]=Ua>>>16;a[Wa+3>>0]=Ua>>>24;a[Wa+4>>0]=7;a[Wa+5>>0]=i;a[Wa+6>>0]=j;Ll(Wa+7|0,Sa|0,Ta|0)|0;Rb(f,Wa,0,h,0,Ua,1)|0;Ub(f,0,h,Ua);Uj(Wa);Wa=0;l=Va;return Wa|0}function mc(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;k=m;c[k>>2]=g;j=d+e|0;e=a[f>>0]|0;if(!(e<<24>>24)){k=d;d=k-d|0;l=m;return d|0}b=d;a:while(1){f=f+1|0;switch(e<<24>>24|0){case 98:{e=b+1|0;if(e>>>0>j>>>0){e=5;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;b=e;break}case 104:{e=b+2|0;if(e>>>0>j>>>0){e=8;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;b=e;break}case 119:{e=b+4|0;if(e>>>0>j>>>0){e=11;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=i;a[b+1>>0]=i>>>8;a[b+2>>0]=i>>>16;a[b+3>>0]=i>>>24;b=e;break}case 100:{e=b+8|0;if(e>>>0>j>>>0){e=14;break a}g=(c[k>>2]|0)+(8-1)&~(8-1);i=g;h=c[i>>2]|0;i=c[i+4>>2]|0;c[k>>2]=g+8;a[b>>0]=h;a[b+1>>0]=h>>>8;a[b+2>>0]=h>>>16;a[b+3>>0]=h>>>24;a[b+4>>0]=i;a[b+5>>0]=Il(h|0,i|0,40)|0;a[b+6>>0]=Il(h|0,i|0,48)|0;a[b+7>>0]=Il(h|0,i|0,56)|0;b=e;break}case 115:{i=(c[k>>2]|0)+(4-1)&~(4-1);h=c[i>>2]|0;c[k>>2]=i+4;i=gk(h)|0;if((i|0)>=65536){e=17;break a}e=b+2|0;g=e+i|0;if(g>>>0>j>>>0){e=19;break a}a[b>>0]=i;a[b+1>>0]=(i&65535)>>>8;Ll(e|0,h|0,i|0)|0;b=g;break}case 81:{e=b+13|0;if(e>>>0>j>>>0){e=22;break a}h=(c[k>>2]|0)+(4-1)&~(4-1);i=c[h>>2]|0;c[k>>2]=h+4;a[b>>0]=a[i>>0]|0;h=c[i+4>>2]|0;a[b+1>>0]=h;a[b+2>>0]=h>>>8;a[b+3>>0]=h>>>16;a[b+4>>0]=h>>>24;i=i+8|0;h=c[i>>2]|0;i=c[i+4>>2]|0;a[b+5>>0]=h;a[b+6>>0]=h>>>8;a[b+7>>0]=h>>>16;a[b+8>>0]=h>>>24;a[b+9>>0]=i;a[b+10>>0]=Il(h|0,i|0,40)|0;a[b+11>>0]=Il(h|0,i|0,48)|0;a[b+12>>0]=Il(h|0,i|0,56)|0;b=e;break}default:{e=24;break a}}e=a[f>>0]|0;if(!(e<<24>>24)){e=26;break}}if((e|0)==5)ja(15667,15412,1783,15686);else if((e|0)==8)ja(15695,15412,1793,15686);else if((e|0)==11)ja(15714,15412,1803,15686);else if((e|0)==14)ja(15733,15412,1813,15686);else if((e|0)==17)ja(15752,15412,1832,15686);else if((e|0)==19)ja(15765,15412,1833,15686);else if((e|0)==22)ja(15790,15412,1843,15686);else if((e|0)==24)ra();else if((e|0)==26){k=b;d=k-d|0;l=m;return d|0}return 0}function nc(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;x=l;l=l+32|0;u=x+16|0;v=x;m=c[h>>2]|0;c[u>>2]=j;k=a[i>>0]|0;a:do if(k<<24>>24){n=v+1|0;o=v+2|0;p=v+3|0;q=v+4|0;r=v+5|0;s=v+6|0;t=v+7|0;j=m;b:while(1){i=i+1|0;switch(k<<24>>24|0){case 98:{if(Rb(e,v,f,g,j,1,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;a[m>>0]=a[v>>0]|0;j=j+1|0;break}case 104:{if(Rb(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;b[m>>1]=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;break}case 119:{if(Rb(e,v,f,g,j,4,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;j=j+4|0;break}case 100:{if(Rb(e,v,f,g,j,8,0)|0){j=-1;k=18;break b}k=(c[u>>2]|0)+(4-1)&~(4-1);m=c[k>>2]|0;c[u>>2]=k+4;k=(d[r>>0]|0)<<8|(d[q>>0]|0)|(d[s>>0]|0)<<16|(d[t>>0]|0)<<24;c[m>>2]=(d[n>>0]|0)<<8|(d[v>>0]|0)|(d[o>>0]|0)<<16|(d[p>>0]|0)<<24;c[m+4>>2]=k;j=j+8|0;break}case 115:{if(Rb(e,v,f,g,j,2,0)|0){j=-1;k=18;break b}m=(d[n>>0]|0)<<8|(d[v>>0]|0);j=j+2|0;k=Tj(m+1|0)|0;if(Rb(e,k,f,g,j,m,0)|0){j=-1;k=18;break b}a[k+m>>0]=0;z=(c[u>>2]|0)+(4-1)&~(4-1);y=c[z>>2]|0;c[u>>2]=z+4;c[y>>2]=k;j=m+j|0;break}default:{k=15;break b}}k=a[i>>0]|0;if(!(k<<24>>24)){w=j;break a}}if((k|0)==15)ra();else if((k|0)==18){l=x;return j|0}}else w=m;while(0);c[h>>2]=w;z=0;l=x;return z|0}function oc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[e>>2]|0;a=c[e+4>>2]|0;pc(b,d,e);c[f+560>>2]=0;Ob(f,a);return}function pc(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+64|0;k=m+40|0;j=m+32|0;g=m+48|0;h=m;i=c[f>>2]|0;if((e|0)<0){d=c[f+4>>2]|0;h=c[f+8>>2]|0;n=b[f+12>>1]|0;c[j>>2]=0-e;e=mc(0,g,4,15526,j)|0;j=e+7|0;k=Tj(j)|0;a[k>>0]=j;a[k+1>>0]=j>>>8;a[k+2>>0]=j>>>16;a[k+3>>0]=j>>>24;a[k+4>>0]=7;a[k+5>>0]=n;a[k+6>>0]=(n&65535)>>>8;Ll(k+7|0,g|0,e|0)|0;Rb(i,k,d,h,0,j,1)|0;Ub(i,d,h,j);Uj(k);Uj(f);l=m;return}else{e=(c[i+548>>2]|0)+-24|0;c[k>>2]=d;c[k+4>>2]=e;e=mc(0,h,32,15509,k)|0;g=c[f+4>>2]|0;j=c[f+8>>2]|0;d=b[f+12>>1]|0;k=e+7|0;n=Tj(k)|0;a[n>>0]=k;a[n+1>>0]=k>>>8;a[n+2>>0]=k>>>16;a[n+3>>0]=k>>>24;a[n+4>>0]=13;a[n+5>>0]=d;a[n+6>>0]=(d&65535)>>>8;Ll(n+7|0,h|0,e|0)|0;Rb(i,n,g,j,0,k,1)|0;Ub(i,g,j,k);Uj(n);Uj(f);l=m;return}}function qc(a,b){a=a|0;b=b|0;var d=0,e=0;e=l;l=l+32|0;d=e+16|0;c[d>>2]=b;$a[c[a+16>>2]&15](a,d,e,b,0,0)|0;l=e;return c[d>>2]|0}function rc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;r=l;l=l+32|0;p=r+20|0;j=r+24|0;k=r+16|0;q=r;c[p>>2]=d;i=(f|0)==0;n=b+16|0;o=b+4|0;m=1;g=(a[e>>0]|0)==47?e+1|0:e;while(1){h=kk(g,47)|0;if(!h){c[j>>2]=g;if(!i){e=5;break}g=1;e=$a[c[n>>2]&15](b,k,q,d,1,j)|0}else{e=h-g|0;s=Tj(e+1|0)|0;c[j>>2]=s;Ll(s|0,g|0,e|0)|0;a[s+e>>0]=0;e=$a[c[n>>2]&15](b,k,q,d,1,j)|0;Uj(c[j>>2]|0);g=0}if(!m)eb[c[o>>2]&15](b,c[p>>2]|0);d=c[k>>2]|0;c[p>>2]=d;if((e|0)<1){e=13;break}if(g){e=15;break}else{m=0;g=h+1|0}}if((e|0)==5){c[f>>2]=g;if(!m){s=d;l=r;return s|0}if(($a[c[n>>2]&15](b,p,q,d,0,0)|0)<0){c[p>>2]=0;s=0;l=r;return s|0}else{s=c[p>>2]|0;l=r;return s|0}}else if((e|0)==13){eb[c[o>>2]&15](b,d);c[p>>2]=0;s=0;l=r;return s|0}else if((e|0)==15){l=r;return d|0}return 0}function sc(a,b,c){a=a|0;b=b|0;c=c|0;return rc(a,b,c,0)|0}function tc(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=l;l=l+16|0;e=m;b=Le(208)|0;c[b>>2]=8;c[b+4>>2]=4;c[b+8>>2]=5;c[b+12>>2]=1;c[b+16>>2]=2;c[b+20>>2]=3;c[b+24>>2]=4;c[b+28>>2]=1;c[b+32>>2]=10;c[b+36>>2]=1;c[b+40>>2]=6;c[b+44>>2]=5;c[b+48>>2]=6;c[b+52>>2]=7;c[b+56>>2]=1;c[b+60>>2]=8;c[b+64>>2]=1;c[b+68>>2]=2;c[b+72>>2]=6;c[b+76>>2]=11;c[b+80>>2]=12;c[b+84>>2]=13;n=b+88|0;c[n>>2]=n;o=b+92|0;c[o>>2]=n;j=b+128|0;f=j;c[f>>2]=1;c[f+4>>2]=0;f=b+136|0;c[f>>2]=12;g=b+140|0;c[g>>2]=4096;h=b+104|0;c[h>>2]=1048576;c[h+4>>2]=0;h=b+120|0;c[h>>2]=262144;c[h+4>>2]=0;h=b+148|0;c[h>>2]=h;c[b+152>>2]=h;h=b+168|0;c[h>>2]=67108864;c[h+4>>2]=0;h=b+176|0;c[h>>2]=h;c[b+180>>2]=h;h=b+184|0;c[h>>2]=h;c[b+188>>2]=h;h=b+192|0;c[h>>2]=h;c[b+196>>2]=h;h=Le(104)|0;i=h+16|0;c[i>>2]=1;c[h+20>>2]=0;p=j;d=c[p+4>>2]|0;k=h+8|0;c[k>>2]=c[p>>2];c[k+4>>2]=d;k=j;k=xl(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[j>>2]=k;c[j+4>>2]=y;j=h+24|0;c[j>>2]=4;c[h+28>>2]=511;c[h+32>>2]=0;c[h+36>>2]=0;k=h+56|0;c[k>>2]=k;c[h+60>>2]=k;d=c[o>>2]|0;c[o>>2]=h;c[h>>2]=n;c[h+4>>2]=d;c[d>>2]=h;d=b+96|0;n=d;n=xl(c[n>>2]|0,c[n+4>>2]|0,1,0)|0;c[d>>2]=n;c[d+4>>2]=y;Oa(e|0,0)|0;d=c[e>>2]|0;c[h+40>>2]=d;e=(c[e+4>>2]|0)*1e3|0;c[h+48>>2]=e;c[h+44>>2]=d;c[h+52>>2]=e;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)!=4)ja(15810,15828,456,15837);p=Le(18)|0;c[p+8>>2]=h;d=p+13|0;a[d>>0]=46;a[d+1>>0]=0;d=h+64|0;e=c[d>>2]|0;o=e+18|0;t=xl(c[g>>2]|0,0,-1,-1)|0;s=y;n=xl(t|0,s|0,o|0,((o|0)<0)<<31>>31|0)|0;r=c[f>>2]|0;n=Il(n|0,y|0,r|0)|0;q=y;e=xl(t|0,s|0,e|0,((e|0)<0)<<31>>31|0)|0;r=Il(e|0,y|0,r|0)|0;e=b+112|0;s=e;r=yl(c[s>>2]|0,c[s+4>>2]|0,r|0,y|0)|0;q=xl(r|0,y|0,n|0,q|0)|0;n=e;c[n>>2]=q;c[n+4>>2]=y;c[d>>2]=o;o=c[k>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[p+4>>2]=k;c[k>>2]=p;c[i>>2]=(c[i>>2]|0)+1;if((c[j>>2]|0)==4){t=Le(19)|0;c[t+8>>2]=h;o=t+13|0;a[o>>0]=a[15851]|0;a[o+1>>0]=a[15852]|0;a[o+2>>0]=a[15853]|0;o=c[d>>2]|0;s=o+19|0;j=xl(c[g>>2]|0,0,-1,-1)|0;n=y;r=xl(j|0,n|0,s|0,((s|0)<0)<<31>>31|0)|0;p=c[f>>2]|0;r=Il(r|0,y|0,p|0)|0;q=y;o=xl(j|0,n|0,o|0,((o|0)<0)<<31>>31|0)|0;p=Il(o|0,y|0,p|0)|0;o=e;p=yl(c[o>>2]|0,c[o+4>>2]|0,p|0,y|0)|0;q=xl(p|0,y|0,r|0,q|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;c[d>>2]=s;s=c[k>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[t+4>>2]=k;c[k>>2]=t;c[b+144>>2]=h;l=m;return b|0}else ja(15810,15828,456,15837);return 0}function uc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=a+88|0;b=c[a+92>>2]|0;if((b|0)!=(h|0))do{e=b;b=c[b+4>>2]|0;c[e+16>>2]=0;if((c[e+24>>2]|0)==4){g=e+56|0;f=e+60|0;d=c[f>>2]|0;if((d|0)!=(g|0))do{j=d+4|0;i=d;d=c[j>>2]|0;k=c[i>>2]|0;c[k+4>>2]=d;c[d>>2]=k;c[i>>2]=0;c[j>>2]=0;Uj(i)}while((d|0)!=(g|0));c[g>>2]=g;c[f>>2]=g}Rc(a,e)}while((b|0)!=(h|0));k=a+148|0;if((c[k+4>>2]|0)==(k|0)){Uj(c[a+200>>2]|0);return}else ja(16653,15828,1527,16687)}function vc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=b+8|0;if(c[d>>2]|0)c[d>>2]=0;d=b+16|0;e=c[d>>2]|0;if(e|0){f=c[e+4>>2]|0;if(f|0)c[f>>2]=0;Uj(e);c[d>>2]=0}d=c[b+4>>2]|0;e=d+20|0;f=c[e>>2]|0;if((f|0)<=0)ja(16501,15828,397,16520);c[e>>2]=f+-1;if((f|0)!=1){Uj(b);return}if((c[d+16>>2]|0)>=1){Uj(b);return}Rc(a,d);Uj(b);return}function wc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;c[b>>2]=1024;d=a+120|0;e=d;f=a+136|0;e=Jl(c[e>>2]|0,c[e+4>>2]|0,(c[f>>2]|0)+-10|0)|0;g=b+8|0;c[g>>2]=e;c[g+4>>2]=y;g=a+112|0;g=yl(c[d>>2]|0,c[d+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0)|0;f=Jl(g|0,y|0,(c[f>>2]|0)+-10|0)|0;g=y;d=b+16|0;c[d>>2]=f;c[d+4>>2]=g;d=b+24|0;c[d>>2]=f;c[d+4>>2]=g;d=a+104|0;g=d;f=c[g+4>>2]|0;e=b+32|0;c[e>>2]=c[g>>2];c[e+4>>2]=f;a=a+96|0;a=yl(c[d>>2]|0,c[d+4>>2]|0,c[a>>2]|0,c[a+4>>2]|0)|0;b=b+40|0;c[b>>2]=a;c[b+4>>2]=y;return}function xc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;b=b+144|0;g=c[b>>2]|0;h=Le(20)|0;i=g+20|0;c[i>>2]=(c[i>>2]|0)+1;c[h+4>>2]=g;c[h>>2]=f;c[d>>2]=h;b=c[b>>2]|0;d=c[b+24>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;g=b+8|0;h=c[g+4>>2]|0;i=e+8|0;c[i>>2]=c[g>>2];c[i+4>>2]=h;return 0}function yc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;i=c[f+4>>2]|0;a:do if((g|0)>0){b=0;do{k=c[h+(b<<2)>>2]|0;if((c[i+24>>2]|0)!=4)break a;l=i+56|0;j=c[i+60>>2]|0;if((j|0)==(l|0))break a;while(1){if(!(fk(j+13|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(l|0))break a}if(!j)break a;i=c[j+8>>2]|0;j=e+(b<<4)|0;k=c[i+24>>2]|0;do if((k|0)!=4)if((k|0)==10){a[j>>0]=2;break}else{a[j>>0]=0;break}else a[j>>0]=-128;while(0);c[e+(b<<4)+4>>2]=0;j=i+8|0;k=c[j+4>>2]|0;l=e+(b<<4)+8|0;c[l>>2]=c[j>>2];c[l+4>>2]=k;b=b+1|0}while((b|0)<(g|0))}else b=0;while(0);h=c[f>>2]|0;f=Le(20)|0;g=i+20|0;c[g>>2]=(c[g>>2]|0)+1;c[f+4>>2]=i;c[f>>2]=h;c[d>>2]=f;return b|0}function zc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;s=l;l=l+16|0;n=s;q=c[e+4>>2]|0;r=q+24|0;if((c[r>>2]|0)!=4){d=-20;l=s;return d|0}p=q+56|0;i=c[q+60>>2]|0;a:do if((i|0)!=(p|0)){while(1){if(!(fk(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(p|0))break a}if(i|0){d=-17;l=s;return d|0}}while(0);j=c[e>>2]|0;k=Le(104)|0;e=k+16|0;c[e>>2]=1;c[k+20>>2]=0;m=b+128|0;u=m;t=c[u+4>>2]|0;o=k+8|0;i=o;c[i>>2]=c[u>>2];c[i+4>>2]=t;i=m;i=xl(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[m>>2]=i;c[m+4>>2]=y;m=k+24|0;c[m>>2]=4;c[k+28>>2]=g&4095;c[k+32>>2]=j;c[k+36>>2]=h;j=k+56|0;c[j>>2]=j;c[k+60>>2]=j;g=b+92|0;h=c[g>>2]|0;c[g>>2]=k;c[k>>2]=b+88;c[k+4>>2]=h;c[h>>2]=k;h=b+96|0;g=h;g=xl(c[g>>2]|0,c[g+4>>2]|0,1,0)|0;c[h>>2]=g;c[h+4>>2]=y;Oa(n|0,0)|0;h=c[n>>2]|0;c[k+40>>2]=h;n=(c[n+4>>2]|0)*1e3|0;c[k+48>>2]=n;c[k+44>>2]=h;c[k+52>>2]=n;c[e>>2]=(c[e>>2]|0)+1;if((c[m>>2]|0)!=4)ja(15810,15828,456,15837);u=Le(18)|0;c[u+8>>2]=k;e=u+13|0;a[e>>0]=46;a[e+1>>0]=0;e=k+64|0;i=c[e>>2]|0;t=i+18|0;g=b+140|0;z=xl(c[g>>2]|0,0,-1,-1)|0;x=y;v=xl(z|0,x|0,t|0,((t|0)<0)<<31>>31|0)|0;h=b+136|0;w=c[h>>2]|0;v=Il(v|0,y|0,w|0)|0;n=y;i=xl(z|0,x|0,i|0,((i|0)<0)<<31>>31|0)|0;w=Il(i|0,y|0,w|0)|0;i=b+112|0;b=i;b=yl(c[b>>2]|0,c[b+4>>2]|0,w|0,y|0)|0;n=xl(b|0,y|0,v|0,n|0)|0;b=i;c[b>>2]=n;c[b+4>>2]=y;c[e>>2]=t;t=c[j>>2]|0;c[t+4>>2]=u;c[u>>2]=t;c[u+4>>2]=j;c[j>>2]=u;u=q+16|0;c[u>>2]=(c[u>>2]|0)+1;if((c[m>>2]|0)!=4)ja(15810,15828,456,15837);z=Le(19)|0;c[z+8>>2]=q;t=z+13|0;a[t>>0]=a[15851]|0;a[t+1>>0]=a[15852]|0;a[t+2>>0]=a[15853]|0;t=c[e>>2]|0;x=t+19|0;n=xl(c[g>>2]|0,0,-1,-1)|0;b=y;w=xl(n|0,b|0,x|0,((x|0)<0)<<31>>31|0)|0;u=c[h>>2]|0;w=Il(w|0,y|0,u|0)|0;v=y;t=xl(n|0,b|0,t|0,((t|0)<0)<<31>>31|0)|0;u=Il(t|0,y|0,u|0)|0;t=i;u=yl(c[t>>2]|0,c[t+4>>2]|0,u|0,y|0)|0;v=xl(u|0,y|0,w|0,v|0)|0;w=i;c[w>>2]=v;c[w+4>>2]=y;c[e>>2]=x;x=c[j>>2]|0;c[x+4>>2]=z;c[z>>2]=x;c[z+4>>2]=j;c[j>>2]=z;if((c[r>>2]|0)!=4)ja(15810,15828,456,15837);x=gk(f)|0;w=x+17|0;z=Le(w)|0;c[z+8>>2]=k;Ll(z+13|0,f|0,x+1|0)|0;x=q+64|0;r=c[x>>2]|0;w=r+w|0;f=xl(c[g>>2]|0,0,-1,-1)|0;q=y;u=xl(f|0,q|0,w|0,((w|0)<0)<<31>>31|0)|0;t=c[h>>2]|0;u=Il(u|0,y|0,t|0)|0;v=y;r=xl(f|0,q|0,r|0,((r|0)<0)<<31>>31|0)|0;t=Il(r|0,y|0,t|0)|0;r=i;t=yl(c[r>>2]|0,c[r+4>>2]|0,t|0,y|0)|0;v=xl(t|0,y|0,u|0,v|0)|0;c[i>>2]=v;c[i+4>>2]=y;c[x>>2]=w;i=c[p>>2]|0;c[i+4>>2]=z;c[z>>2]=i;c[z+4>>2]=p;c[p>>2]=z;i=c[m>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;w=o;x=c[w+4>>2]|0;z=d+8|0;c[z>>2]=c[w>>2];c[z+4>>2]=x;z=0;l=s;return z|0}function Ac(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;u=c[e+4>>2]|0;l=e+8|0;if(c[l>>2]|0)c[l>>2]=0;i=e+16|0;j=c[i>>2]|0;if(j|0){k=c[j+4>>2]|0;if(k|0)c[k>>2]=0;Uj(j);c[i>>2]=0}j=u+24|0;i=c[j>>2]|0;a:do if(f&65536){if((i|0)!=4){h=-20;return h|0}}else{switch(i|0){case 4:case 8:break a;default:i=-22}return i|0}while(0);c[e+12>>2]=f;b:do if((c[j>>2]|0)==8){if(!((f&512|0)==0|(f&3|0)==0))Xc(b,u,0,0)|0;t=u+56|0;c:do switch(c[t>>2]|0){case 0:break b;case 1:{k=u+80|0;j=c[k>>2]|0;k=c[k+4>>2]|0;f=b+176|0;i=c[b+180>>2]|0;d:do if((i|0)!=(f|0)){while(1){s=i+8|0;if((c[s>>2]|0)==(j|0)?(c[s+4>>2]|0)==(k|0):0)break;i=c[i+4>>2]|0;if((i|0)==(f|0))break d}s=i+16|0;i=c[i+20>>2]|0;if((i|0)!=(s|0)){q=b+184|0;r=b+188|0;do{k=c[i+12>>2]|0;e:do if(!(c[i+8>>2]|0)){j=Vc(b,k)|0;if((j|0?(c[j+24>>2]|0)==8:0)?(c[j+56>>2]|0)==1:0)Yc(b,j,0)|0}else{j=c[r>>2]|0;if((j|0)!=(q|0)){while(1){if(!(fk(c[j+8>>2]|0,k)|0))break;j=c[j+4>>2]|0;if((j|0)==(q|0))break e}if(j|0){o=Vc(b,k)|0;do if((o|0?(c[o+24>>2]|0)==8:0)?(c[o+56>>2]|0)==1:0){p=j+12|0;n=j+16|0;k=c[n>>2]|0;if((k|0)==(p|0))break e;f=0;d=0;m=0;do{l=Vc(b,c[k+24>>2]|0)|0;do if(l){if((c[l+24>>2]|0)!=8)break;f=(c[l+56>>2]|0)==1?1:f}while(0);l=k+16|0;m=xl(c[l>>2]|0,c[l+4>>2]|0,m|0,d|0)|0;d=y;k=c[k+4>>2]|0}while((k|0)!=(p|0));if(!f)break e;if(!((d|0)==0?(m|0)==(c[o+60>>2]|0):0))break;Yc(b,o,1)|0;j=c[n>>2]|0;if((j|0)==(p|0))break e;m=o+96|0;l=0;d=0;while(1){k=j+24|0;f=Vc(b,c[k>>2]|0)|0;f:do if(f|0){if((c[f+24>>2]|0)!=8)break;if((c[f+56>>2]|0)!=1)break;o=j+16|0;do if((c[o+4>>2]|0)==0?(c[o>>2]|0)==(c[f+60>>2]|0):0){n=f+80|0;o=j+8|0;if(!((c[n>>2]|0)==(c[o>>2]|0)?(c[n+4>>2]|0)==(c[o+4>>2]|0):0))break;Yc(b,f,2)|0;o=f+96|0;k=c[o>>2]|0;f=k+24|0;n=(c[m>>2]|0)+40|0;v=c[n>>2]|0;c[v+4>>2]=f;c[f>>2]=v;c[k+28>>2]=n;c[n>>2]=f;o=(c[o>>2]|0)+32|0;c[o>>2]=l;c[o+4>>2]=d;break f}while(0);k=Vc(b,c[k>>2]|0)|0;if(!k)break;if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Yc(b,k,0)|0}while(0);v=j+16|0;l=xl(c[v>>2]|0,c[v+4>>2]|0,l|0,d|0)|0;j=c[j+4>>2]|0;if((j|0)==(p|0))break e;else d=y}}while(0);f=j+12|0;j=c[j+16>>2]|0;if((j|0)!=(f|0))do{k=Vc(b,c[j+24>>2]|0)|0;do if(k|0){if((c[k+24>>2]|0)!=8)break;if((c[k+56>>2]|0)!=1)break;Yc(b,k,0)|0}while(0);j=c[j+4>>2]|0}while((j|0)!=(f|0))}}}while(0);i=c[i+4>>2]|0}while((i|0)!=(s|0));if((c[t>>2]|0)==2)break c}}while(0);i=Yc(b,u,0)|0;if(i|0){v=i;return v|0}v=c[u+96>>2]|0;c[v+48>>2]=e;c[v+52>>2]=g;c[v+56>>2]=h;v=1;return v|0}case 2:break;case 3:{h=u+88|0;v=c[h>>2]|0;g=u+92|0;e=c[g>>2]|0;c[v+4>>2]=e;c[e>>2]=v;c[h>>2]=0;c[g>>2]=0;e=b+148|0;b=e+4|0;v=c[b>>2]|0;c[b>>2]=h;c[h>>2]=e;c[g>>2]=v;c[v>>2]=h;break b}default:ra()}while(0);i=c[u+96>>2]|0;j=i+52|0;if(c[j>>2]|0){v=-5;return v|0}c[i+48>>2]=e;c[j>>2]=g;c[i+56>>2]=h;v=1;return v|0}while(0);c[l>>2]=1;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=u+8|0;h=c[g+4>>2]|0;v=d+8|0;c[v>>2]=c[g>>2];c[v+4>>2]=h;v=0;return v|0}function Bc(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;x=l;l=l+16|0;u=x;w=e+4|0;v=c[w>>2]|0;r=v+24|0;if((c[r>>2]|0)!=4){d=-20;l=x;return d|0}s=v+56|0;j=c[v+60>>2]|0;a:do if((j|0)!=(s|0)){while(1){if(!(fk(j+13|0,f)|0))break;j=c[j+4>>2]|0;if((j|0)==(s|0))break a}if(j|0){d=-17;l=x;return d|0}}while(0);t=e+8|0;if(c[t>>2]|0)c[t>>2]=0;j=e+16|0;k=c[j>>2]|0;if(k|0){m=c[k+4>>2]|0;if(m|0)c[m>>2]=0;Uj(k);c[j>>2]=0}m=c[e>>2]|0;n=Le(104)|0;c[n+16>>2]=1;o=n+20|0;c[o>>2]=0;p=b+128|0;z=p;j=c[z+4>>2]|0;q=n+8|0;k=q;c[k>>2]=c[z>>2];c[k+4>>2]=j;k=p;k=xl(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[p>>2]=k;c[p+4>>2]=y;p=n+24|0;c[p>>2]=8;c[n+28>>2]=h&4095;c[n+32>>2]=m;c[n+36>>2]=i;Ga(n+64|0);h=b+92|0;i=c[h>>2]|0;c[h>>2]=n;c[n>>2]=b+88;c[n+4>>2]=i;c[i>>2]=n;i=b+96|0;h=i;h=xl(c[h>>2]|0,c[h+4>>2]|0,1,0)|0;c[i>>2]=h;c[i+4>>2]=y;Oa(u|0,0)|0;i=c[u>>2]|0;c[n+40>>2]=i;u=(c[u+4>>2]|0)*1e3|0;c[n+48>>2]=u;c[n+44>>2]=i;c[n+52>>2]=u;if((c[r>>2]|0)!=4)ja(15810,15828,456,15837);k=gk(f)|0;m=k+17|0;j=Le(m)|0;c[j+8>>2]=n;Ll(j+13|0,f|0,k+1|0)|0;k=v+64|0;z=c[k>>2]|0;m=z+m|0;f=xl(c[b+140>>2]|0,0,-1,-1)|0;h=y;u=xl(f|0,h|0,m|0,((m|0)<0)<<31>>31|0)|0;i=c[b+136>>2]|0;u=Il(u|0,y|0,i|0)|0;v=y;z=xl(f|0,h|0,z|0,((z|0)<0)<<31>>31|0)|0;i=Il(z|0,y|0,i|0)|0;z=b+112|0;h=z;i=yl(c[h>>2]|0,c[h+4>>2]|0,i|0,y|0)|0;v=xl(i|0,y|0,u|0,v|0)|0;c[z>>2]=v;c[z+4>>2]=y;c[k>>2]=m;k=c[s>>2]|0;c[k+4>>2]=j;c[j>>2]=k;c[j+4>>2]=s;c[s>>2]=j;j=c[w>>2]|0;k=j+20|0;m=c[k>>2]|0;if((m|0)<=0)ja(16501,15828,397,16520);c[k>>2]=m+-1;if((m|0)==1?(c[j+16>>2]|0)<1:0)Rc(b,j);c[o>>2]=(c[o>>2]|0)+1;c[w>>2]=n;c[t>>2]=1;c[e+12>>2]=g;j=c[p>>2]|0;do if((j|0)!=4)if((j|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;g=q;w=c[g+4>>2]|0;z=d+8|0;c[z>>2]=c[g>>2];c[z+4>>2]=w;z=0;l=x;return z|0}function Cc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=c[d+4>>2]|0;h=i+24|0;d=c[h>>2]|0;do if((d|0)!=4)if((d|0)==10){a[e>>0]=2;break}else{a[e>>0]=0;break}else a[e>>0]=-128;while(0);c[e+4>>2]=0;d=i+8|0;g=c[d+4>>2]|0;f=e+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=g;c[e+16>>2]=c[h>>2]<<12|c[i+28>>2];c[e+20>>2]=c[i+32>>2];c[e+24>>2]=c[i+36>>2];f=c[i+16>>2]|0;g=e+32|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;switch(c[h>>2]|0){case 2:case 6:{d=c[i+56>>2]<<8|c[i+60>>2];f=0;break}default:{d=0;f=0}}g=e+40|0;c[g>>2]=d;c[g+4>>2]=f;g=b+140|0;f=e+56|0;c[f>>2]=c[g>>2];c[f+4>>2]=0;switch(c[h>>2]|0){case 8:{d=c[i+60>>2]|0;f=0;break}case 10:{d=gk(c[i+56>>2]|0)|0;f=0;break}case 4:{f=c[i+64>>2]|0;d=f;f=((f|0)<0)<<31>>31;break}default:{d=0;f=0}}h=e+48|0;c[h>>2]=d;c[h+4>>2]=f;g=c[g>>2]|0;h=xl(d|0,f|0,-1,-1)|0;g=xl(h|0,y|0,g|0,0)|0;b=c[b+136>>2]|0;g=Il(g|0,y|0,b|0)|0;b=Jl(g|0,y|0,b+-9|0)|0;g=e+64|0;c[g>>2]=b;c[g+4>>2]=y;g=i+40|0;b=e+72|0;c[b>>2]=c[g>>2];c[b+4>>2]=0;b=i+48|0;c[e+80>>2]=c[b>>2];h=e+88|0;c[h>>2]=c[g>>2];c[h+4>>2]=0;c[e+96>>2]=c[b>>2];b=e+104|0;c[b>>2]=c[i+44>>2];c[b+4>>2]=0;c[e+112>>2]=c[i+52>>2];return 0}function Dc(a,b,d,e,f,g,h,i,j,k,m,n,o,p,q,r){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;var s=0;p=l;l=l+16|0;n=p;m=c[b+4>>2]|0;if(d&1|0)c[m+28>>2]=e;if(d&2|0)c[m+32>>2]=f;if(d&4|0)c[m+36>>2]=g;if(d&8|0?(s=Xc(a,m,h,i)|0,s|0):0){i=s;l=p;return i|0}do if(d&32|0)if(!(d&256)){Oa(n|0,0)|0;c[m+40>>2]=c[n>>2];c[m+48>>2]=(c[n+4>>2]|0)*1e3;break}else{c[m+40>>2]=o;c[m+48>>2]=q;break}while(0);if(!(d&64)){i=0;l=p;return i|0}Oa(n|0,0)|0;c[m+44>>2]=c[n>>2];c[m+52>>2]=(c[n+4>>2]|0)*1e3;i=0;l=p;return i|0}function Ec(a,b){a=a|0;b=b|0;var d=0;a=b+8|0;if(c[a>>2]|0)c[a>>2]=0;a=b+16|0;b=c[a>>2]|0;if(!b)return;d=c[b+4>>2]|0;if(d|0)c[d>>2]=0;Uj(b);c[a>>2]=0;return}function Fc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;return h|0}if((c[b+24>>2]|0)!=4){h=-71;return h|0}m=b+56|0;b=c[b+60>>2]|0;a:do if((e|0)==0&(f|0)==0){e=b;i=0;d=0}else{i=0;d=0;while(1){if((b|0)==(m|0)){b=0;break}i=xl(i|0,d|0,1,0)|0;d=y;b=c[b+4>>2]|0;if(!(d>>>0<f>>>0|(d|0)==(f|0)&i>>>0<e>>>0)){e=b;break a}}return b|0}while(0);if((e|0)==(m|0)){h=0;return h|0}b=0;while(1){f=e+13|0;j=gk(f)|0;k=b+24|0;l=k+j|0;if((l|0)>(h|0)){d=11;break}i=xl(i|0,d|0,1,0)|0;d=y;p=c[e+8>>2]|0;n=p+24|0;o=c[n>>2]|0;a[g+b>>0]=(o|0)==4?-128:(o|0)==10?2:0;o=g+(b+1)|0;a[o>>0]=0;a[o+1>>0]=0;a[o+2>>0]=0;a[o+3>>0]=0;o=g+(b+5)|0;p=p+8|0;q=c[p>>2]|0;p=c[p+4>>2]|0;a[o>>0]=q;a[o+1>>0]=q>>>8;a[o+2>>0]=q>>>16;a[o+3>>0]=q>>>24;a[o+4>>0]=p;r=Il(q|0,p|0,40)|0;a[o+5>>0]=r;r=Il(q|0,p|0,48)|0;a[o+6>>0]=r;p=Il(q|0,p|0,56)|0;a[o+7>>0]=p;o=g+(b+13)|0;a[o>>0]=i;a[o+1>>0]=i>>>8;a[o+2>>0]=i>>>16;a[o+3>>0]=i>>>24;a[o+4>>0]=d;p=Il(i|0,d|0,40)|0;a[o+5>>0]=p;p=Il(i|0,d|0,48)|0;a[o+6>>0]=p;p=Il(i|0,d|0,56)|0;a[o+7>>0]=p;a[g+(b+21)>>0]=c[n>>2];b=g+(b+22)|0;a[b>>0]=j;a[b+1>>0]=(j&65535)>>>8;Ll(g+k|0,f|0,j|0)|0;e=c[e+4>>2]|0;if((e|0)==(m|0)){b=l;d=11;break}else b=l}if((d|0)==11)return b|0;return 0}function Gc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=c[b+4>>2]|0;if(!(c[b+8>>2]|0)){g=-71;return g|0}if((c[h+24>>2]|0)!=8){g=-5;return g|0}if((c[b+12>>2]&3|0)==1){g=-5;return g|0}if(!(c[h+100>>2]|0)){i=c[h+60>>2]|0;a=yl(i|0,0,d|0,e|0)|0;b=y;if(!(0>e>>>0|0==(e|0)&i>>>0>d>>>0)){i=0;return i|0}i=((g|0)<0)<<31>>31;i=b>>>0<i>>>0|(b|0)==(i|0)&a>>>0<g>>>0?a:g;Ha(h+64|0,d|0,f|0,i|0);return i|0}else{a=c[b+16>>2]|0;if(!a){i=-5;return i|0}i=c[a+8>>2]|0;i=(i|0)<(g|0)?i:g;Ll(f|0,a+12|0,i|0)|0;return i|0}return 0}function Hc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=l;l=l+4480|0;k=L+4448|0;A=L+4472|0;F=L+3408|0;H=L+2384|0;B=L+1360|0;J=L+336|0;x=L+208|0;v=L+80|0;z=L+4432|0;I=L+4464|0;w=L+4460|0;G=L+64|0;q=L+4456|0;m=L+4452|0;j=L;s=c[d+4>>2]|0;if(!(c[d+8>>2]|0)){h=-71;l=L;return h|0}if((c[s+24>>2]|0)!=8){h=-5;l=L;return h|0}if(!(c[d+12>>2]&3)){h=-5;l=L;return h|0}if(!h){h=0;l=L;return h|0}if(!(c[s+100>>2]|0)){f=xl(h|0,((h|0)<0)<<31>>31|0,e|0,f|0)|0;i=y;j=s+60|0;if(i>>>0>0|((i|0)==0?f>>>0>(c[j>>2]|0)>>>0:0)?(p=Xc(b,s,f,i)|0,p|0):0){h=p;l=L;return h|0}Oa(A|0,0)|0;c[s+40>>2]=c[A>>2];c[s+48>>2]=(c[A+4>>2]|0)*1e3;f=s+56|0;do if((c[f>>2]|0)==3){K=s+88|0;H=c[K>>2]|0;J=s+92|0;I=c[J>>2]|0;c[H+4>>2]=I;c[I>>2]=H;c[K>>2]=0;c[J>>2]=0;J=b+160|0;K=J;K=yl(c[K>>2]|0,c[K+4>>2]|0,c[j>>2]|0,0)|0;b=y;c[J>>2]=K;c[J+4>>2]=b;if((b|0)>-1|(b|0)==-1&K>>>0>4294967295){c[f>>2]=0;break}else ja(15979,15828,1283,16445)}while(0);La(s+64|0,e|0,g|0,h|0);l=L;return h|0}e=Tj(h+1|0)|0;Ll(e|0,g|0,h|0)|0;a[e+h>>0]=0;c[m>>2]=e;a:do if((zd(j,64,m)|0)<0)K=104;else{do if(!(fk(j,16197)|0)){f=c[d>>2]|0;c[A>>2]=c[m>>2];p=d+16|0;b:do if((((((c[p>>2]|0)==0?(zd(J,1024,A)|0)>=0:0)?(zd(x,128,A)|0)>=0:0)?(zd(v,128,A)|0)>=0:0)?(zd(H,1024,A)|0)>=0:0)?(zd(F,1024,A)|0)>=0:0){do if(((zd(B,1024,A)|0)>=0?(r=gk(B)|0,(r&1|0)==0):0)?(t=r>>1,(r|0)<=33):0){if((Gd(G,B,t)|0)<0)break;if((r|0)<0){f=-5;break b}if((Cd(q,A)|0)<0){f=-5;break b}o=(t|0)==0;if((t|16|0)!=16){f=-5;break b}m=(a[x>>0]|0)==0?0:x;k=(a[v>>0]|0)==0?0:v;if($a[c[b+12>>2]&15](b,I,z,f,16809164,16809164)|0)ja(16201,15828,2526,16249);n=rc(b,c[I>>2]|0,F,w)|0;do if(!n){f=-2;i=b+4|0}else{Ya[c[b+76>>2]&63](b,n,c[w>>2]|0)|0;f=ab[c[b+28>>2]&3](b,z,n,c[w>>2]|0,514,384,0)|0;c:do if((f|0)<0)j=0;else{do if(a[H>>0]|0){j=sc(b,c[I>>2]|0,H)|0;if(!j){j=0;f=-2;break c}f=$a[c[b+24>>2]&15](b,z,j,0,0,0)|0;if((f|0)<0)break c;f=c[j+4>>2]|0;if((c[f+24>>2]|0)!=8)ja(16260,15828,2555,16249);if(!(c[f+56>>2]|0)){C=j;D=c[f+60>>2]|0;E=0;break}else ja(16260,15828,2555,16249)}else{C=0;D=0;E=0}while(0);i=Le(260)|0;c[i+4>>2]=c[I>>2];c[i+8>>2]=n;c[i+12>>2]=C;if(o)f=0;else{f=i+16|0;Re(G,128,f)|0}I=Le(76)|0;c[I>>2]=0;c[I+8>>2]=0;c[I+4>>2]=i;c[i>>2]=d;c[p>>2]=I;sd(b,n,J,m,k,C,D,E,2,i,f);f=0;break b}while(0);i=b+4|0;eb[c[i>>2]&15](b,n);if(!j)break;eb[c[i>>2]&15](b,j)}while(0);eb[c[i>>2]&15](b,c[I>>2]|0);break b}while(0);f=-5}else f=-5;while(0)}else{if(!(fk(j,16315)|0)){c[A>>2]=c[m>>2];d:do if((((zd(H,1024,A)|0)>=0?(zd(J,1024,A)|0)>=0:0)?(zd(x,128,A)|0)>=0:0)?(zd(v,128,A)|0)>=0:0){do if(((zd(B,1024,A)|0)>=0?(i=gk(B)|0,(i&1|0)==0):0)?(o=i>>1,(i|0)<=33):0){if((Gd(G,B,o)|0)<0)break;if((i|0)<0){f=-22;break d}j=(a[x>>0]|0)==0?0:x;i=(a[v>>0]|0)==0?0:v;switch(o|0){case 0:{f=0;break}case 16:{Re(G,128,F)|0;f=F;break}default:{f=-22;break d}}Uc(b,H,J,j,i,f);f=0;break d}while(0);f=-22}else f=-22;while(0);break}if(!(fk(j,16328)|0)){c[A>>2]=c[m>>2];e:do if((zd(B,1024,A)|0)>=0){if((c[b>>2]|0)!=8)ja(16343,15828,1665,16358);i=b+192|0;f=c[i+4>>2]|0;if((f|0)!=(i|0)){while(1){if(!(fk(c[f+12>>2]|0,B)|0))break;f=c[f+4>>2]|0;if((f|0)==(i|0)){f=0;break e}}if(f){Sc(f);f=0}else f=0}else f=0}else f=-22;while(0);break}if(!(fk(j,16380)|0)){c[A>>2]=c[m>>2];if((((zd(J,1024,A)|0)>=0?(zd(B,1024,A)|0)>=0:0)?(Ed(F,A)|0)>=0:0)?(Bd(H,A)|0)>=0:0){f=Vc(b,J)|0;if(!f)f=-2;else{I=F;J=H;f=Wc(b,f,B,c[I>>2]|0,c[I+4>>2]|0,c[J>>2]|0,c[J+4>>2]|0)|0}}else f=-22;break}if(!(fk(j,16388)|0)){c[A>>2]=c[m>>2];f:do if((zd(B,1024,A)|0)>=0){f=Vc(b,B)|0;if(f)if((c[f+24>>2]|0)==8){switch(c[f+56>>2]|0){case 3:case 0:break;default:{f=-5;break f}}I=Rk(B,47)|0;J=f+60|0;b=Tj(c[J>>2]|0)|0;Ha(f+64|0,0,b|0,c[J>>2]|0);Ma(((I|0)==0?B:I+1|0)|0,b|0,c[J>>2]|0);Uj(b);f=0}else f=-5;else f=-2}else f=-5;while(0);break}if(fk(j,16400)|0){if(fk(j,16407)|0){c[k>>2]=j;pl(16422,k)|0;K=104;break a}c[A>>2]=c[m>>2];if((zd(B,1024,A)|0)<0)f=-22;else{f=b+200|0;Uj(c[f>>2]|0);c[f>>2]=Tk(B)|0;f=0}break}c[A>>2]=c[m>>2];j=d+16|0;g:do if(!(c[j>>2]|0)){do if(((zd(B,1024,A)|0)>=0?(n=gk(B)|0,(n&1|0)==0):0)?(u=n>>1,(n|0)<=2049):0){if((Gd(J,B,u)|0)<0)break;if((n|0)<0){f=-22;break g}do if((zd(B,1024,A)|0)<0)f=-1;else{f=gk(B)|0;if(f&1|0){f=-1;break}i=f>>1;if((f|0)>257){f=-1;break}f=(Gd(x,B,i)|0)<0;f=f?-1:i}while(0);if((Cd(F,A)|0)<0){f=-22;break g}if((Cd(H,A)|0)<0){f=-22;break g}if(((c[H>>2]|0)+-1|0)>>>0>63){f=-22;break g}b=Le(76)|0;c[b>>2]=1;I=c[H>>2]|0;c[b+8>>2]=I;vd(J,u,x,f,c[F>>2]|0,I,b+12|0);c[j>>2]=b;f=0;break g}while(0);f=-22}else f=-5;while(0)}while(0);Uj(e);f=(f|0)==0?h:f}while(0);if((K|0)==104){Uj(e);f=-5}h=f;l=L;return h|0}function Ic(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[b+4>>2]|0;g=c[d+4>>2]|0;if((c[g+24>>2]|0)==4){e=-1;return e|0}d=h+24|0;a:do if((c[d>>2]|0)==4?(i=h+56|0,f=c[h+60>>2]|0,(f|0)!=(i|0)):0){b=f;while(1){if(!(fk(b+13|0,e)|0))break;b=c[b+4>>2]|0;if((b|0)==(i|0))break a}if(b|0){e=-17;return e|0}}while(0);i=g+16|0;c[i>>2]=(c[i>>2]|0)+1;if((c[d>>2]|0)!=4)ja(15810,15828,456,15837);j=gk(e)|0;l=j+17|0;i=Le(l)|0;c[i+8>>2]=g;Ll(i+13|0,e|0,j+1|0)|0;e=h+56|0;h=h+64|0;j=c[h>>2]|0;g=j+l|0;l=xl(c[a+140>>2]|0,0,-1,-1)|0;k=y;d=xl(l|0,k|0,g|0,((g|0)<0)<<31>>31|0)|0;b=c[a+136>>2]|0;d=Il(d|0,y|0,b|0)|0;f=y;j=xl(l|0,k|0,j|0,((j|0)<0)<<31>>31|0)|0;b=Il(j|0,y|0,b|0)|0;a=a+112|0;j=a;b=yl(c[j>>2]|0,c[j+4>>2]|0,b|0,y|0)|0;f=xl(b|0,y|0,d|0,f|0)|0;c[a>>2]=f;c[a+4>>2]=y;c[h>>2]=g;a=c[e>>2]|0;c[a+4>>2]=i;c[i>>2]=a;c[i+4>>2]=e;c[e>>2]=i;e=0;return e|0}function Jc(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=l;l=l+16|0;k=o;m=c[e+4>>2]|0;n=m+24|0;a:do if((c[n>>2]|0)==4?(j=m+56|0,i=c[m+60>>2]|0,(i|0)!=(j|0)):0){while(1){if(!(fk(i+13|0,f)|0))break;i=c[i+4>>2]|0;if((i|0)==(j|0))break a}if(i|0){d=-17;l=o;return d|0}}while(0);p=c[e>>2]|0;i=Le(104)|0;c[i+16>>2]=1;c[i+20>>2]=0;j=b+128|0;s=j;r=c[s+4>>2]|0;e=i+8|0;q=e;c[q>>2]=c[s>>2];c[q+4>>2]=r;q=j;q=xl(c[q>>2]|0,c[q+4>>2]|0,1,0)|0;c[j>>2]=q;c[j+4>>2]=y;j=i+24|0;c[j>>2]=10;c[i+28>>2]=511;c[i+32>>2]=p;c[i+36>>2]=h;p=b+92|0;h=c[p>>2]|0;c[p>>2]=i;c[i>>2]=b+88;c[i+4>>2]=h;c[h>>2]=i;h=b+96|0;p=h;p=xl(c[p>>2]|0,c[p+4>>2]|0,1,0)|0;c[h>>2]=p;c[h+4>>2]=y;Oa(k|0,0)|0;h=c[k>>2]|0;c[i+40>>2]=h;k=(c[k+4>>2]|0)*1e3|0;c[i+48>>2]=k;c[i+44>>2]=h;c[i+52>>2]=k;c[i+56>>2]=Tk(g)|0;if((c[n>>2]|0)!=4)ja(15810,15828,456,15837);r=gk(f)|0;q=r+17|0;s=Le(q)|0;c[s+8>>2]=i;Ll(s+13|0,f|0,r+1|0)|0;i=m+56|0;r=m+64|0;p=c[r>>2]|0;q=p+q|0;g=xl(c[b+140>>2]|0,0,-1,-1)|0;h=y;m=xl(g|0,h|0,q|0,((q|0)<0)<<31>>31|0)|0;k=c[b+136>>2]|0;m=Il(m|0,y|0,k|0)|0;n=y;p=xl(g|0,h|0,p|0,((p|0)<0)<<31>>31|0)|0;k=Il(p|0,y|0,k|0)|0;p=b+112|0;h=p;k=yl(c[h>>2]|0,c[h+4>>2]|0,k|0,y|0)|0;n=xl(k|0,y|0,m|0,n|0)|0;c[p>>2]=n;c[p+4>>2]=y;c[r>>2]=q;r=c[i>>2]|0;c[r+4>>2]=s;c[s>>2]=r;c[s+4>>2]=i;c[i>>2]=s;i=c[j>>2]|0;do if((i|0)!=4)if((i|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;q=e;r=c[q+4>>2]|0;s=d+8|0;c[s>>2]=c[q>>2];c[s+4>>2]=r;s=0;l=o;return s|0}function Kc(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;s=l;l=l+16|0;q=s;n=c[e+4>>2]|0;r=g>>>12;o=r&15;r=r&255;switch(r&15){case 1:case 2:case 6:case 8:case 12:break;default:{d=-22;l=s;return d|0}}p=n+24|0;a:do if((c[p>>2]|0)==4?(m=n+56|0,k=c[n+60>>2]|0,(k|0)!=(m|0)):0){while(1){if(!(fk(k+13|0,f)|0))break;k=c[k+4>>2]|0;if((k|0)==(m|0))break a}if(k|0){d=-17;l=s;return d|0}}while(0);t=c[e>>2]|0;k=Le(104)|0;c[k+16>>2]=1;c[k+20>>2]=0;m=b+128|0;w=m;v=c[w+4>>2]|0;e=k+8|0;u=e;c[u>>2]=c[w>>2];c[u+4>>2]=v;u=m;u=xl(c[u>>2]|0,c[u+4>>2]|0,1,0)|0;c[m>>2]=u;c[m+4>>2]=y;m=k+24|0;c[m>>2]=o;c[k+28>>2]=g&4095;c[k+32>>2]=t;c[k+36>>2]=j;switch(r&15){case 8:{Ga(k+64|0);break}case 4:{w=k+56|0;c[w>>2]=w;c[k+60>>2]=w;break}default:{}}w=b+92|0;v=c[w>>2]|0;c[w>>2]=k;c[k>>2]=b+88;c[k+4>>2]=v;c[v>>2]=k;v=b+96|0;w=v;w=xl(c[w>>2]|0,c[w+4>>2]|0,1,0)|0;c[v>>2]=w;c[v+4>>2]=y;Oa(q|0,0)|0;v=c[q>>2]|0;c[k+40>>2]=v;w=(c[q+4>>2]|0)*1e3|0;c[k+48>>2]=w;c[k+44>>2]=v;c[k+52>>2]=w;if((o|4|0)==6){c[k+56>>2]=h;c[k+60>>2]=i}if((c[p>>2]|0)!=4)ja(15810,15828,456,15837);v=gk(f)|0;u=v+17|0;w=Le(u)|0;c[w+8>>2]=k;Ll(w+13|0,f|0,v+1|0)|0;k=n+56|0;v=n+64|0;t=c[v>>2]|0;u=t+u|0;h=xl(c[b+140>>2]|0,0,-1,-1)|0;i=y;q=xl(h|0,i|0,u|0,((u|0)<0)<<31>>31|0)|0;j=c[b+136>>2]|0;q=Il(q|0,y|0,j|0)|0;r=y;t=xl(h|0,i|0,t|0,((t|0)<0)<<31>>31|0)|0;j=Il(t|0,y|0,j|0)|0;t=b+112|0;i=t;j=yl(c[i>>2]|0,c[i+4>>2]|0,j|0,y|0)|0;r=xl(j|0,y|0,q|0,r|0)|0;c[t>>2]=r;c[t+4>>2]=y;c[v>>2]=u;v=c[k>>2]|0;c[v+4>>2]=w;c[w>>2]=v;c[w+4>>2]=k;c[k>>2]=w;k=c[m>>2]|0;do if((k|0)!=4)if((k|0)==10){a[d>>0]=2;break}else{a[d>>0]=0;break}else a[d>>0]=-128;while(0);c[d+4>>2]=0;u=e;v=c[u+4>>2]|0;w=d+8|0;c[w>>2]=c[u>>2];c[w+4>>2]=v;w=0;l=s;return w|0}function Lc(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[f+4>>2]|0;if((c[b+24>>2]|0)!=10){e=-5;return e|0}f=c[b+56>>2]|0;b=gk(f)|0;e=e+-1|0;e=(b|0)<(e|0)?b:e;Ll(d|0,f|0,e|0)|0;a[d+e>>0]=0;e=0;return e|0}function Mc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=b+4|0;b=c[l>>2]|0;if((c[b+24>>2]|0)!=4){a=-2;return a|0}h=b+56|0;b=c[b+60>>2]|0;if((b|0)==(h|0)){a=-2;return a|0}k=b;while(1){if(!(fk(k+13|0,d)|0))break;b=c[k+4>>2]|0;if((b|0)==(h|0)){b=-2;i=28;break}else k=b}if((i|0)==28)return b|0;if(!k){a=-2;return a|0}e=e+4|0;h=c[e>>2]|0;d=h+24|0;a:do if((c[d>>2]|0)==4?(j=h+56|0,g=c[h+60>>2]|0,(g|0)!=(j|0)):0){while(1){if(!(fk(g+13|0,f)|0))break;b=c[g+4>>2]|0;if((b|0)==(j|0)){e=0;break a}else g=b}if(g){b=c[g+8>>2]|0;if((c[b+24>>2]|0)==4){a=-17;return a|0}else{Qc(a,h,g);h=c[e>>2]|0;e=b;d=h+24|0;break}}else e=0}else e=0;while(0);b=k+8|0;g=c[b>>2]|0;j=g+16|0;c[j>>2]=(c[j>>2]|0)+1;if((c[d>>2]|0)!=4)ja(15810,15828,456,15837);i=gk(f)|0;p=i+17|0;j=Le(p)|0;c[j+8>>2]=g;Ll(j+13|0,f|0,i+1|0)|0;g=h+56|0;h=h+64|0;i=c[h>>2]|0;f=i+p|0;p=xl(c[a+140>>2]|0,0,-1,-1)|0;o=y;m=xl(p|0,o|0,f|0,((f|0)<0)<<31>>31|0)|0;n=c[a+136>>2]|0;m=Il(m|0,y|0,n|0)|0;d=y;i=xl(p|0,o|0,i|0,((i|0)<0)<<31>>31|0)|0;n=Il(i|0,y|0,n|0)|0;i=a+112|0;o=i;n=yl(c[o>>2]|0,c[o+4>>2]|0,n|0,y|0)|0;d=xl(n|0,y|0,m|0,d|0)|0;c[i>>2]=d;c[i+4>>2]=y;c[h>>2]=f;h=c[g>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[j+4>>2]=g;c[g>>2]=j;h=c[b>>2]|0;Qc(a,c[l>>2]|0,k);b=h+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(15854,15828,389,15871);c[b>>2]=g+-1;if((g|0)==1?(c[h+20>>2]|0)<1:0)Rc(a,h);if(!e){p=0;return p|0}b=e+16|0;g=c[b>>2]|0;if((g|0)<=0)ja(15854,15828,389,15871);c[b>>2]=g+-1;if((g|0)!=1){p=0;return p|0}if((c[e+20>>2]|0)>=1){p=0;return p|0}Rc(a,e);p=0;return p|0}function Nc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!(fk(d,20119)|0)){o=-2;return o|0}if(!(fk(d,15851)|0)){o=-2;return o|0}m=b+4|0;g=c[m>>2]|0;if((c[g+24>>2]|0)!=4){o=-2;return o|0}f=g+56|0;b=c[g+60>>2]|0;if((b|0)==(f|0)){o=-2;return o|0}while(1){if(!(fk(b+13|0,d)|0))break;e=c[b+4>>2]|0;if((e|0)==(f|0)){k=-2;l=30;break}else b=e}if((l|0)==30)return k|0;if(!b){o=-2;return o|0}i=b+8|0;j=c[i>>2]|0;do if((c[j+24>>2]|0)==4){h=j+56|0;e=c[j+60>>2]|0;a:do if((e|0)!=(h|0)){f=e;do{d=f+13|0;if(fk(d,20119)|0?fk(d,15851)|0:0){k=-39;l=30;break}f=c[f+4>>2]|0}while((f|0)!=(h|0));if((l|0)==30)return k|0;while(1){d=e;e=c[e+4>>2]|0;f=c[d+8>>2]|0;Qc(a,j,d);d=f+16|0;g=c[d>>2]|0;if((g|0)<=0)break;c[d>>2]=g+-1;if((g|0)==1?(c[f+20>>2]|0)<1:0)Rc(a,f);if((e|0)==(h|0))break a}ja(15854,15828,389,15871)}while(0);if(!(c[j+64>>2]|0)){n=c[m>>2]|0;o=c[i>>2]|0;break}else ja(15884,15828,576,15903)}else{n=g;o=j}while(0);Qc(a,n,b);b=o+16|0;e=c[b>>2]|0;if((e|0)<=0)ja(15854,15828,389,15871);c[b>>2]=e+-1;if((e|0)!=1){o=0;return o|0}if((c[o+20>>2]|0)>=1){o=0;return o|0}Rc(a,o);o=0;return o|0}function Oc(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Pc(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[b+8>>2]|0)){d=-71;return d|0}d=(c[(c[b+4>>2]|0)+24>>2]|0)==8?0:-5;return d|0}function Qc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=gk(d+13|0)|0;e=b+64|0;i=c[e>>2]|0;b=-17-k+i|0;k=xl(c[a+140>>2]|0,0,-1,-1)|0;j=y;f=xl(k|0,j|0,b|0,((b|0)<0)<<31>>31|0)|0;h=c[a+136>>2]|0;f=Il(f|0,y|0,h|0)|0;g=y;i=xl(k|0,j|0,i|0,((i|0)<0)<<31>>31|0)|0;h=Il(i|0,y|0,h|0)|0;a=a+112|0;i=a;h=yl(c[i>>2]|0,c[i+4>>2]|0,h|0,y|0)|0;g=xl(h|0,y|0,f|0,g|0)|0;f=a;c[f>>2]=g;c[f+4>>2]=y;c[e>>2]=b;if((b|0)<=-1)ja(16148,15828,554,16167);k=a;j=c[k+4>>2]|0;if((j|0)>-1|(j|0)==-1&(c[k>>2]|0)>>>0>4294967295){j=c[d>>2]|0;k=c[d+4>>2]|0;c[j+4>>2]=k;c[k>>2]=j;Uj(d);return}else ja(15960,15828,555,16167)}function Rc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c[b+16>>2]|0)ja(15913,15828,334,15930);if(c[b+20>>2]|0)ja(15941,15828,335,15930);a:do switch(c[b+24>>2]|0){case 8:{d=b+60|0;k=c[a+140>>2]|0;k=Il(xl(xl(c[d>>2]|0,0,-1,-1)|0,y|0,k|0,0)|0,y|0,c[a+136>>2]|0)|0;h=a+112|0;i=h;k=yl(c[i>>2]|0,c[i+4>>2]|0,k|0,y|0)|0;i=y;c[h>>2]=k;c[h+4>>2]=i;if(!((i|0)>-1|(i|0)==-1&k>>>0>4294967295))ja(15960,15828,339,15930);Ia(b+64|0);switch(c[b+56>>2]|0){case 0:break a;case 3:{k=b+88|0;h=c[k>>2]|0;i=b+92|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[k>>2]=0;c[i>>2]=0;i=a+160|0;k=i;k=yl(c[k>>2]|0,c[k+4>>2]|0,c[d>>2]|0,0)|0;j=y;c[i>>2]=k;c[i+4>>2]=j;if((j|0)>-1|(j|0)==-1&k>>>0>4294967295){Sc(c[b+72>>2]|0);break a}else ja(15979,15828,348,15930);break}case 2:{k=c[b+96>>2]|0;d=c[k+8>>2]|0;if(d|0)md(d);i=k+4|0;d=c[i>>2]|0;do if((d|0)==1){h=k+40|0;d=c[k+44>>2]|0;if((d|0)!=(h|0)){while(1){e=d;d=c[d+4>>2]|0;e=c[e+-12>>2]|0;f=e+56|0;if((c[f>>2]|0)!=2){e=18;break}g=c[e+96>>2]|0;c[f>>2]=1;Ia(e+64|0);e=c[g+52>>2]|0;if(e|0)gb[e&63](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){e=g+24|0;m=c[e>>2]|0;f=g+28|0;l=c[f>>2]|0;c[m+4>>2]=l;c[l>>2]=m;c[e>>2]=0;c[f>>2]=0}e=c[g+16>>2]|0;if(e|0)rd(e);Uj(g);if((d|0)==(h|0)){e=26;break}}if((e|0)==18)ja(16005,15828,754,16041);else if((e|0)==26){j=c[i>>2]|0;e=27;break}}}else{j=d;e=27}while(0);if((e|0)==27?(j|0)==2:0){l=k+24|0;i=c[l>>2]|0;m=k+28|0;j=c[m>>2]|0;c[i+4>>2]=j;c[j>>2]=i;c[l>>2]=0;c[m>>2]=0}d=c[k+16>>2]|0;if(d|0)rd(d);Uj(k);Sc(c[b+72>>2]|0);break a}case 1:{Sc(c[b+72>>2]|0);break a}default:ra()}break}case 10:{Uj(c[b+56>>2]|0);break}case 4:{if((c[b+60>>2]|0)!=(b+56|0))ja(16059,15828,376,15930);break}default:{}}while(0);m=c[b>>2]|0;l=c[b+4>>2]|0;c[m+4>>2]=l;c[l>>2]=m;Uj(b);b=a+96|0;l=b;m=c[l>>2]|0;l=c[l+4>>2]|0;a=xl(m|0,l|0,-1,-1)|0;c[b>>2]=a;c[b+4>>2]=y;if((l|0)>0|(l|0)==0&m>>>0>0)return;else ja(16089,15828,384,15930)}function Sc(a){a=a|0;var b=0,d=0;b=a+8|0;d=c[b>>2]|0;if((d|0)<=0)ja(16110,15828,1609,16129);d=d+-1|0;c[b>>2]=d;if(d|0)return;Uj(c[a+12>>2]|0);Uj(c[a+16>>2]|0);Uj(c[a+20>>2]|0);Uj(c[a+24>>2]|0);b=c[a>>2]|0;d=c[a+4>>2]|0;c[b+4>>2]=d;c[d>>2]=b;Uj(a);return}function Tc(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;d=c[g+8>>2]|0;if(d|0)eb[c[b+4>>2]&15](b,d);h=c[g+12>>2]|0;d=b+4|0;if(h|0)eb[c[d>>2]&15](b,h);eb[c[d>>2]&15](b,c[g+4>>2]|0);d=c[g>>2]|0;if(!d){Uj(g);return}b=c[d+16>>2]|0;h=(f|0)<0;e=h?e:0;a[b+12>>0]=e;a[b+13>>0]=e>>>8;a[b+14>>0]=e>>>16;a[b+15>>0]=e>>>24;c[b+8>>2]=4;c[b+4>>2]=0;Uj(g);return}function Uc(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;if((c[a>>2]|0)!=8)ja(16343,15828,1629,16481);h=a+192|0;a=c[h+4>>2]|0;a:do if((a|0)!=(h|0)){while(1){if(!(fk(c[a+12>>2]|0,b)|0))break;a=c[a+4>>2]|0;if((a|0)==(h|0)){i=8;break a}}if(a){Uj(c[a+16>>2]|0);Uj(c[a+20>>2]|0);Uj(c[a+24>>2]|0);h=a}else i=8}else i=8;while(0);if((i|0)==8){i=Le(276)|0;c[i+12>>2]=Tk(b)|0;c[i+8>>2]=1;b=c[h>>2]|0;c[b+4>>2]=i;c[i>>2]=b;c[i+4>>2]=h;c[h>>2]=i;h=i}c[h+16>>2]=Tk(d)|0;if(!e)a=0;else a=Tk(e)|0;c[h+20>>2]=a;if(!f)a=0;else a=Tk(f)|0;c[h+24>>2]=a;a=h+28|0;if(!g){c[a>>2]=0;return}else{c[a>>2]=1;Ll(h+32|0,g|0,244)|0;return}}function Vc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;h=l;l=l+1024|0;g=h;if(!b){g=0;l=h;return g|0}b=c[b+144>>2]|0;d=(a[d>>0]|0)==47?d+1|0:d;a:do if(a[d>>0]|0)while(1){e=kk(d,47)|0;if(!e){f=gk(d)|0;e=0}else{f=e-d|0;e=e+1|0}if(f>>>0>1023){b=0;break a}Ll(g|0,d|0,f|0)|0;a[g+f>>0]=0;if((c[b+24>>2]|0)!=4){b=0;break a}d=b+56|0;b=c[b+60>>2]|0;if((b|0)==(d|0)){b=0;break a}while(1){if(!(fk(b+13|0,g)|0))break;b=c[b+4>>2]|0;if((b|0)==(d|0)){b=0;break a}}if(!b){b=0;break a}b=c[b+8>>2]|0;if(!e)break;else d=e}while(0);g=b;l=h;return g|0}function Wc(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0;if((c[a>>2]|0)!=8)ja(16343,15828,1687,16466);k=a+192|0;i=c[k+4>>2]|0;if((i|0)==(k|0)){l=-2;return l|0}j=i;while(1){if(!(fk(c[j+12>>2]|0,d)|0))break;i=c[j+4>>2]|0;if((i|0)==(k|0)){i=-2;l=13;break}else j=i}if((l|0)==13)return i|0;if(!j){l=-2;return l|0}if((c[b+24>>2]|0)!=8){l=-5;return l|0}i=b+56|0;if(c[i>>2]|0){l=-5;return l|0}if(c[b+68>>2]|0){l=-5;return l|0}if((g|0)==0&(h|0)==0){l=0;return l|0}c[i>>2]=1;c[b+72>>2]=j;l=j+8|0;c[l>>2]=(c[l>>2]|0)+1;c[b+60>>2]=g;l=c[a+140>>2]|0;g=xl(g|0,h|0,-1,-1)|0;g=xl(g|0,y|0,l|0,0)|0;g=Il(g|0,y|0,c[a+136>>2]|0)|0;l=a+112|0;h=l;h=xl(g|0,y|0,c[h>>2]|0,c[h+4>>2]|0)|0;c[l>>2]=h;c[l+4>>2]=y;l=b+80|0;c[l>>2]=e;c[l+4>>2]=f;l=0;return l|0}function Xc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((c[b+24>>2]|0)!=8){l=-22;return l|0}if(e>>>0>0|(e|0)==0&d>>>0>4294967295){l=-28;return l|0}j=b+60|0;f=c[j>>2]|0;h=d-f|0;if(!h){l=0;return l|0}m=xl(c[a+140>>2]|0,0,-1,-1)|0;g=y;i=xl(m|0,g|0,d|0,e|0)|0;k=c[a+136>>2]|0;i=Il(i|0,y|0,k|0)|0;l=y;g=xl(m|0,g|0,f|0,0)|0;k=Il(g|0,y|0,k|0)|0;k=yl(i|0,l|0,k|0,y|0)|0;l=b+56|0;a:do switch(c[l>>2]|0){case 1:{if((d|0)==0&(e|0)==0)c[l>>2]=0;break}case 0:case 3:{if((h|0)<=0){f=(c[b+68>>2]<<2>>>0)/5|0;if(!(0<e>>>0|0==(e|0)&f>>>0<d>>>0)?(Ja(b+64|0,f|0)|0)<0:0){m=-28;return m|0}}else{i=a+112|0;i=xl(c[i>>2]|0,c[i+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;n=y;m=a+120|0;g=c[m+4>>2]|0;if(n>>>0>g>>>0|((n|0)==(g|0)?i>>>0>(c[m>>2]|0)>>>0:0)){n=-28;return n|0}i=b+64|0;g=c[b+68>>2]|0;do if(0<e>>>0|0==(e|0)&g>>>0<d>>>0){n=(g*5|0)>>>2;if((Ja(i|0,(0<e>>>0|0==(e|0)&n>>>0<d>>>0?d:n)|0)|0)<0){n=-28;return n|0}else{f=c[j>>2]|0;break}}while(0);Ka(i|0,f|0,0,h|0)}if((c[l>>2]|0)==3){n=b+88|0;i=c[n>>2]|0;b=b+92|0;m=c[b>>2]|0;c[i+4>>2]=m;c[m>>2]=i;c[n>>2]=0;c[b>>2]=0;b=a+160|0;n=b;n=yl(c[n>>2]|0,c[n+4>>2]|0,c[j>>2]|0,0)|0;m=y;c[b>>2]=n;c[b+4>>2]=m;if((m|0)>-1|(m|0)==-1&n>>>0>4294967295){c[l>>2]=0;break a}else ja(15979,15828,1240,16454)}break}case 2:{n=-5;return n|0}default:ra()}while(0);l=a+112|0;n=l;n=xl(c[n>>2]|0,c[n+4>>2]|0,k|0,((k|0)<0)<<31>>31|0)|0;m=y;c[l>>2]=n;c[l+4>>2]=m;if(!((m|0)>-1|(m|0)==-1&n>>>0>4294967295))ja(15960,15828,1248,16454);c[j>>2]=d;n=0;return n|0}function Yc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=l;l=l+32|0;p=q;j=b+56|0;if((c[j>>2]|0)!=1)ja(16535,15828,848,16572);k=b+60|0;m=c[k>>2]|0;o=a+160|0;r=o;r=xl(c[r>>2]|0,c[r+4>>2]|0,m|0,0)|0;t=y;h=a+168|0;g=h;s=c[g+4>>2]|0;do if((t|0)>(s|0)|((t|0)==(s|0)?r>>>0>(c[g>>2]|0)>>>0:0)?(i=a+148|0,e=c[i>>2]|0,(e|0)!=(i|0)):0){f=e+-32|0;if((c[f>>2]|0)!=3)ja(16585,15828,684,16620);g=e;while(1){e=g;g=c[g>>2]|0;if(!(c[e+-68>>2]|0)){Ia(e+-24|0);c[f>>2]=1;s=c[e>>2]|0;f=e+4|0;t=c[f>>2]|0;c[s+4>>2]=t;c[t>>2]=s;c[e>>2]=0;c[f>>2]=0;f=o;e=yl(c[f>>2]|0,c[f+4>>2]|0,c[e+-28>>2]|0,0)|0;f=y;t=o;c[t>>2]=e;c[t+4>>2]=f;if(!((f|0)>-1|(f|0)==-1&e>>>0>4294967295)){f=10;break}s=xl(e|0,f|0,m|0,0)|0;f=y;t=h;r=c[t+4>>2]|0;if((g|0)==(i|0)|((f|0)<(r|0)|((f|0)==(r|0)?s>>>0<=(c[t>>2]|0)>>>0:0))){f=14;break}}else if((g|0)==(i|0)){f=14;break}f=g+-32|0;if((c[f>>2]|0)!=3){f=7;break}}if((f|0)==7)ja(16585,15828,684,16620);else if((f|0)==10)ja(15979,15828,697,16620);else if((f|0)==14){n=c[k>>2]|0;break}}else n=m;while(0);if((Ja(b+64|0,n|0)|0)<0){t=-5;l=q;return t|0}c[j>>2]=2;g=Le(64)|0;c[g+20>>2]=0;c[g>>2]=a;c[g+12>>2]=b;c[g+4>>2]=d;switch(d|0){case 2:break;case 1:{f=g+40|0;c[f>>2]=f;c[g+44>>2]=f;f=18;break}default:f=18}if((f|0)==18){f=b+80|0;Fd(p,c[f>>2]|0,c[f+4>>2]|0)|0;f=c[b+72>>2]|0;e=wd(c[f+16>>2]|0,p)|0;if(c[f+28>>2]|0)c[g+16>>2]=od(f+32|0,14,g)|0;c[g+8>>2]=nd(e,c[f+20>>2]|0,c[f+24>>2]|0,g,5,0)|0}c[b+96>>2]=g;t=0;l=q;return t|0}function Zc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a+12>>2]|0;a=a+20|0;e=c[a>>2]|0;g=(c[f+60>>2]|0)-e|0;d=g>>>0>d>>>0?d:g;La(f+64|0,e|0,b|0,d|0);c[a>>2]=d+(c[a>>2]|0);return 0}function _c(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=l;l=l+1024|0;n=q;j=a+12|0;p=c[j>>2]|0;do if((b|0)>=0){f=a+16|0;g=c[f>>2]|0;if(!g){g=p+60|0;m=a+20|0;r=c[m>>2]|0;f=(c[g>>2]|0)-r|0;f=f>>>0>e>>>0?e:f;La(p+64|0,r|0,d|0,f|0);f=f+(c[m>>2]|0)|0;c[m>>2]=f;if(b){l=q;return}}else{if((pd(g,d,e)|0)<0)break;if(b|0){l=q;return}if((qd(c[f>>2]|0)|0)<0)break;g=p+60|0;f=c[a+20>>2]|0}if((f|0)==(c[g>>2]|0)){if((c[a+4>>2]|0)==1?(o=a+40|0,i=c[a+44>>2]|0,(i|0)!=(o|0)):0){m=(c[j>>2]|0)+64|0;do{f=i;i=c[i+4>>2]|0;j=c[f+-12>>2]|0;k=j+60|0;g=c[k>>2]|0;if(g|0){b=f+8|0;a=j+64|0;f=0;h=0;d=0;e=c[b>>2]|0;b=c[b+4>>2]|0;while(1){f=yl(g|0,f|0,h|0,d|0)|0;r=y;s=r>>>0<0|(r|0)==0&f>>>0<1024;f=s?f:1024;r=s?r:0;Ha(m|0,e|0,n|0,f|0);La(a|0,h|0,n|0,f|0);e=xl(f|0,r|0,e|0,b|0)|0;b=y;h=xl(f|0,r|0,h|0,d|0)|0;d=y;g=c[k>>2]|0;if(!(d>>>0<0|(d|0)==0&h>>>0<g>>>0))break;else f=0}}$c(j)}while((i|0)!=(o|0))}$c(p);l=q;return}}while(0);a:do if((c[a+4>>2]|0)==1?(k=a+40|0,h=c[a+44>>2]|0,(h|0)!=(k|0)):0){while(1){f=h;h=c[h+4>>2]|0;f=c[f+-12>>2]|0;g=f+56|0;if((c[g>>2]|0)!=2)break;d=c[f+96>>2]|0;c[g>>2]=1;Ia(f+64|0);f=c[d+52>>2]|0;if(f|0)gb[f&63](c[d>>2]|0,0,-5,c[d+56>>2]|0);if((c[d+4>>2]|0)==2){r=d+24|0;n=c[r>>2]|0;s=d+28|0;o=c[s>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[r>>2]=0;c[s>>2]=0}f=c[d+16>>2]|0;if(f|0)rd(f);Uj(d);if((h|0)==(k|0))break a}ja(16005,15828,754,16041)}while(0);f=p+56|0;if((c[f>>2]|0)!=2)ja(16005,15828,754,16041);g=c[p+96>>2]|0;c[f>>2]=1;Ia(p+64|0);f=c[g+52>>2]|0;if(f|0)gb[f&63](c[g>>2]|0,0,-5,c[g+56>>2]|0);if((c[g+4>>2]|0)==2){r=g+24|0;o=c[r>>2]|0;s=g+28|0;p=c[s>>2]|0;c[o+4>>2]=p;c[p>>2]=o;c[r>>2]=0;c[s>>2]=0}f=c[g+16>>2]|0;if(f|0)rd(f);Uj(g);l=q;return}function $c(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=l;l=l+16|0;e=g;d=b+56|0;if((c[d>>2]|0)!=2)ja(16005,15828,735,16634);f=c[b+96>>2]|0;h=c[f>>2]|0;c[d>>2]=3;i=b+88|0;j=h+152|0;d=c[j>>2]|0;c[j>>2]=i;c[i>>2]=h+148;c[b+92>>2]=d;c[d>>2]=i;d=h+160|0;h=d;h=xl(c[h>>2]|0,c[h+4>>2]|0,c[b+60>>2]|0,0)|0;c[d>>2]=h;c[d+4>>2]=y;d=f+52|0;if(c[d>>2]|0){c[(c[f+48>>2]|0)+8>>2]=1;h=c[b+24>>2]|0;a[e>>0]=(h|0)==4?-128:(h|0)==10?2:0;c[e+4>>2]=0;h=b+8|0;i=c[h+4>>2]|0;j=e+8|0;c[j>>2]=c[h>>2];c[j+4>>2]=i;gb[c[d>>2]&63](c[f>>2]|0,e,0,c[f+56>>2]|0)}if((c[f+4>>2]|0)==2){i=f+24|0;e=c[i>>2]|0;j=f+28|0;h=c[j>>2]|0;c[e+4>>2]=h;c[h>>2]=e;c[i>>2]=0;c[j>>2]=0}d=c[f+16>>2]|0;if(!d){Uj(f);l=g;return}rd(d);Uj(f);l=g;return}function ad(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+160|0;i=o+144|0;m=o+128|0;g=o;h=o+152|0;n=tc()|0;if(!(c[4202143]|0))c[4202143]=n;c[n+200>>2]=Tk(16698)|0;e=n+12|0;if($a[c[e>>2]&15](n,m,g,0,16809164,16809164)|0)ja(16703,15828,2070,16749);j=n+28|0;if(ab[c[j>>2]&3](n,g,c[m>>2]|0,16763,514,438,0)|0)ja(16770,15828,2072,16749);k=c[m>>2]|0;c[(c[k+4>>2]|0)+100>>2]=1;eb[c[n+4>>2]&15](n,k);if(!a){l=o;return n|0}k=Le(28)|0;c[k>>2]=n;f=k+4|0;c[f>>2]=Tk(a)|0;c[k+8>>2]=b;c[k+12>>2]=d;a=k+16|0;if($a[c[e>>2]&15](n,a,m,0,16809164,16809164)|0)ja(16849,15828,2145,16898);Oa(h|0,0)|0;b=c[h>>2]|0;b=Dl(b|0,((b|0)<0)<<31>>31|0,1e6,0)|0;h=c[h+4>>2]|0;h=xl(b|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;b=i;c[b>>2]=h;c[b+4>>2]=y;nk(g,128,16914,i)|0;b=xd(c[f>>2]|0,g)|0;a=qc(n,c[a>>2]|0)|0;if(ab[c[j>>2]&3](n,m,a,16932,514,420,0)|0)ja(16938,15828,2154,16898);sd(n,a,b,0,0,0,0,0,3,k,0);Uj(b);l=o;return n|0}function bd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+96|0;h=n+64|0;j=n;k=n+56|0;m=n+40|0;i=n+32|0;if((f|0)<0){c[h>>2]=0-e;cd(17014,h)}f=Tj(e+1|0)|0;$a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;eb[c[b+4>>2]&15](b,d);d=g+16|0;Ya[c[b+76>>2]&63](b,c[d>>2]|0,16932)|0;if((Ld(f)|0)!=1)cd(17057,n+72|0);if((Kd(k,f,17078)|0)<0)cd(17085,n+80|0);e=(Jd(i,f,17105)|0)==0;h=i;f=c[h>>2]|0;h=c[h+4>>2]|0;do if(e&(h>>>0>0|(h|0)==0&f>>>0>1048575))if((c[b>>2]|0)==8){e=c[b+140>>2]|0;i=xl(f|0,h|0,-1,-1)|0;e=xl(i|0,y|0,e|0,0)|0;e=Il(e|0,y|0,c[b+136>>2]|0)|0;i=b+120|0;c[i>>2]=e;c[i+4>>2]=y;break}else ja(16343,15828,1677,17115);while(0);h=xd(c[g+4>>2]|0,17138)|0;Uc(b,17144,h,0,0,0);f=qc(b,c[d>>2]|0)|0;if(!(ab[c[b+28>>2]&3](b,m,f,17146,514,420,0)|0)){m=k;Fd(j,c[m>>2]|0,c[m+4>>2]|0)|0;m=xd(h,j)|0;sd(b,f,m,0,0,0,0,0,4,g,0);Uj(h);Uj(m);l=n;return}else ja(17160,15828,2196,17252)}function cd(a,b){a=a|0;b=b|0;var d=0;d=l;l=l+16|0;c[d>>2]=b;b=c[3662]|0;ll(17579,7,1,b)|0;pk(b,a,d)|0;ql(10,b)|0;Da(1)}function dd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;k=l;l=l+16|0;j=k+8|0;h=k;i=k+12|0;if((f|0)<0){c[h>>2]=0-e;cd(17264,h)}f=Tj(e+1|0)|0;$a[c[b+48>>2]&15](b,d,0,0,f,e)|0;a[f+e>>0]=0;eb[c[b+4>>2]&15](b,d);Ya[c[b+76>>2]&63](b,c[g+16>>2]|0,17146)|0;if((Ld(f)|0)==1?(e=Hd(f)|0,c[i>>2]=e,e|0):0)if(!(ed(b,i,c[b+144>>2]|0,16809164)|0)){c[g+24>>2]=0;fd(b,0,0,g);l=k;return}else cd(17305,j);cd(17305,j)}function ed(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;K=l;l=l+2080|0;D=K+2056|0;E=K+1024|0;F=K;J=K+2076|0;G=K+2072|0;H=K+2068|0;o=K+2064|0;p=K+2048|0;c[J>>2]=c[d>>2];q=b+128|0;r=b+88|0;s=b+92|0;t=b+96|0;u=D+4|0;v=b+140|0;w=b+136|0;x=b+112|0;z=e+16|0;A=e+24|0;B=e+56|0;C=e+64|0;a:while(1){g=c[J>>2]|0;b:do switch(a[g>>0]|0){case 0:{h=44;break a}case 46:{h=5;break a}case 35:{yd(J);break}default:{if((Ad(G,J,8)|0)<0){h=7;break a}m=c[G>>2]|0;n=m>>>12;c[G>>2]=m&4095;if((Cd(H,J)|0)<0){h=9;break a}if((Cd(o,J)|0)<0){h=11;break a}h=c[G>>2]|0;k=c[H>>2]|0;m=c[o>>2]|0;i=Le(104)|0;g=i+16|0;c[g>>2]=1;c[i+20>>2]=0;M=q;j=c[M+4>>2]|0;L=i+8|0;c[L>>2]=c[M>>2];c[L+4>>2]=j;L=q;j=q;c[j>>2]=xl(c[L>>2]|0,c[L+4>>2]|0,1,0)|0;c[j+4>>2]=y;j=i+24|0;c[j>>2]=n;c[i+28>>2]=h&4095;c[i+32>>2]=k;c[i+36>>2]=m;switch(n&1048575|0){case 8:{Ga(i+64|0);break}case 4:{M=i+56|0;c[M>>2]=M;c[i+60>>2]=M;break}default:{}}k=c[s>>2]|0;c[s>>2]=i;c[i>>2]=r;c[i+4>>2]=k;c[k>>2]=i;k=t;L=t;c[L>>2]=xl(c[k>>2]|0,c[k+4>>2]|0,1,0)|0;c[L+4>>2]=y;Oa(D|0,0)|0;L=c[D>>2]|0;k=i+40|0;c[k>>2]=L;M=(c[u>>2]|0)*1e3|0;m=i+48|0;c[m>>2]=M;c[i+44>>2]=L;c[i+52>>2]=M;M=p;c[M>>2]=0;c[M+4>>2]=0;switch(n&1048575|0){case 6:case 2:{if((Cd(i+56|0,J)|0)<0){h=17;break a}if((Cd(i+60|0,J)|0)<0){h=19;break a}break}case 8:{if((Bd(p,J)|0)<0){h=21;break a}break}case 4:{c[g>>2]=(c[g>>2]|0)+1;if((c[j>>2]|0)!=4){h=23;break a}M=Le(18)|0;c[M+8>>2]=i;g=M+13|0;a[g>>0]=46;a[g+1>>0]=0;g=i+56|0;h=i+64|0;R=c[h>>2]|0;L=R+18|0;S=xl(c[v>>2]|0,0,-1,-1)|0;N=y;P=xl(S|0,N|0,L|0,((L|0)<0)<<31>>31|0)|0;Q=c[w>>2]|0;P=Il(P|0,y|0,Q|0)|0;O=y;Q=Il(xl(S|0,N|0,R|0,((R|0)<0)<<31>>31|0)|0,y|0,Q|0)|0;R=x;N=x;c[N>>2]=xl(yl(c[R>>2]|0,c[R+4>>2]|0,Q|0,y|0)|0,y|0,P|0,O|0)|0;c[N+4>>2]=y;c[h>>2]=L;L=c[g>>2]|0;c[L+4>>2]=M;c[M>>2]=L;c[M+4>>2]=g;c[g>>2]=M;c[z>>2]=(c[z>>2]|0)+1;if((c[j>>2]|0)!=4){h=25;break a}S=Le(19)|0;c[S+8>>2]=e;M=S+13|0;a[M>>0]=a[15851]|0;a[M+1>>0]=a[15852]|0;a[M+2>>0]=a[15853]|0;M=c[h>>2]|0;R=M+19|0;L=xl(c[v>>2]|0,0,-1,-1)|0;Q=y;O=xl(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Il(O|0,y|0,N|0)|0;P=y;N=Il(xl(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=xl(yl(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[h>>2]=R;R=c[g>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=g;c[g>>2]=S;break}default:{}}if((Dd(k,m,J)|0)<0){h=28;break a}if((zd(E,1024,J)|0)<0){h=30;break a}if((c[A>>2]|0)!=4){h=32;break a}M=gk(E)|0;R=M+17|0;S=Le(R)|0;c[S+8>>2]=i;Ll(S+13|0,E|0,M+1|0)|0;M=c[C>>2]|0;R=M+R|0;L=xl(c[v>>2]|0,0,-1,-1)|0;Q=y;O=xl(L|0,Q|0,R|0,((R|0)<0)<<31>>31|0)|0;N=c[w>>2]|0;O=Il(O|0,y|0,N|0)|0;P=y;N=Il(xl(L|0,Q|0,M|0,((M|0)<0)<<31>>31|0)|0,y|0,N|0)|0;M=x;Q=x;c[Q>>2]=xl(yl(c[M>>2]|0,c[M+4>>2]|0,N|0,y|0)|0,y|0,O|0,P|0)|0;c[Q+4>>2]=y;c[C>>2]=R;R=c[B>>2]|0;c[R+4>>2]=S;c[S>>2]=R;c[S+4>>2]=B;c[B>>2]=S;do if((n|0)!=10){S=p;if(!((n|0)==8&((c[S>>2]|0)!=0|(c[S+4>>2]|0)!=0))){yd(J);if((n|0)!=4)break b;S=wd(f,E)|0;g=ed(b,J,i,S)|0;Uj(S);if(!g)break b;else{h=46;break a}}else{if((Ed(D,J)|0)<0){h=40;break a}R=D;S=p;Wc(b,i,17144,c[R>>2]|0,c[R+4>>2]|0,c[S>>2]|0,c[S+4>>2]|0)|0;break}}else{if((zd(F,1024,J)|0)<0){h=35;break a}c[i+56>>2]=Tk(F)|0}while(0);yd(J)}}while(0)}switch(h|0){case 5:{c[J>>2]=g+1;yd(J);I=c[J>>2]|0;break}case 7:{ll(17472,13,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 9:{ll(17486,12,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 11:{ll(17499,12,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 17:{ll(17512,14,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 19:{ll(17527,14,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 21:{ll(17441,13,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 23:{ja(15810,15828,456,15837);break}case 25:{ja(15810,15828,456,15837);break}case 28:{ll(17542,14,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 30:{ll(17366,17,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 32:{ja(15810,15828,456,15837);break}case 35:{ll(17557,21,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 40:{ll(17455,16,1,c[3662]|0)|0;S=-1;l=K;return S|0}case 44:{I=g;break}case 46:{l=K;return g|0}}c[d>>2]=I;S=0;l=K;return S|0}function fd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=l;l=l+16|0;f=h;g=e+20|0;b=c[g>>2]|0;if(b|0){eb[c[a+4>>2]&15](a,b);c[g>>2]=0}b=e+24|0;d=c[b>>2]|0;if((d|0)<=1){i=c[e+16>>2]|0;c[b>>2]=d+1;b=sc(a,i,c[14592+(d<<2)>>2]|0)|0;c[g>>2]=b;if(b|0?($a[c[a+24>>2]&15](a,f,b,0,6,e)|0)>=1:0){l=h;return}fd(a,0,0,e);l=h;return}if((gd(a,17335,1)|0)<0)gd(a,17357,0)|0;eb[c[a+4>>2]&15](a,c[e+16>>2]|0);b=c[e+8>>2]|0;if(b|0)db[b&15](c[e+12>>2]|0);Uj(e);l=h;return}function gd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;t=l;l=l+1072|0;h=t+1056|0;o=t+1048|0;n=t+1040|0;q=t+1060|0;r=t;k=t+1032|0;m=t+1024|0;d=Vc(b,d)|0;if(!d){s=-1;l=t;return s|0}if((c[d+24>>2]|0)!=8){s=-1;l=t;return s|0}if((c[d+56>>2]|0)!=3){s=-1;l=t;return s|0}j=c[d+60>>2]|0;p=Tj(j+1|0)|0;Ha(d+64|0,0,p|0,j|0);a[p+j>>0]=0;if(!e){c[q>>2]=p;f=c[3662]|0;g=b+176|0;d=p;a:while(1)b:do switch(a[d>>0]|0){case 0:break a;case 9:case 32:{d=d+1|0;c[q>>2]=d;break}case 10:{d=d+1|0;c[q>>2]=d;break}default:{if((zd(r,1024,q)|0)<0){s=49;break a}d=Vc(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0){o=Le(24)|0;m=d+80|0;n=c[m+4>>2]|0;e=o+8|0;c[e>>2]=c[m>>2];c[e+4>>2]=n;e=o+16|0;c[e>>2]=e;c[o+20>>2]=e;n=c[g>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=g;c[g>>2]=o;while(1){d=c[q>>2]|0;c:while(1){switch(a[d>>0]|0){case 10:case 0:break b;case 9:case 32:break;default:break c}o=d+1|0;c[q>>2]=o;d=o}if((zd(r,1024,q)|0)<0){s=61;break a}o=Le(16)|0;c[o+12>>2]=Tk(r)|0;n=c[e>>2]|0;c[n+4>>2]=o;c[o>>2]=n;c[o+4>>2]=e;c[e>>2]=o}}c[h>>2]=r;nl(f,17384,h)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:break b;default:{}}o=d+1|0;c[q>>2]=o;d=o}}}while(0);if((s|0)==49)ll(17366,17,1,f)|0;else if((s|0)==61)ll(17366,17,1,f)|0}else{c[q>>2]=p;h=c[3662]|0;i=b+176|0;j=b+184|0;e=0;g=0;d=p;d:while(1){f=e;e:while(1){f:while(1){e=a[d>>0]|0;g:while(1)switch(e<<24>>24){case 0:break d;case 64:{s=12;break e}case 10:break f;case 35:break;case 9:case 32:break g;default:{e=0;break e}}e=d+1|0;c[q>>2]=e;d=e}d=d+1|0;c[q>>2]=d;f=0}if((s|0)==12){c[q>>2]=d+1;e=1}if((zd(r,1024,q)|0)<0){s=14;break}d=c[q>>2]|0;h:while(1){switch(a[d>>0]|0){case 58:{s=18;break h}case 9:case 32:break;default:{s=27;break h}}s=d+1|0;c[q>>2]=s;d=s}i:do if((s|0)==18){s=0;c[q>>2]=d+1;d=Vc(b,r)|0;if((d|0?(c[d+24>>2]|0)==8:0)?c[d+56>>2]|0:0)if(!e){f=Le(24)|0;d=d+80|0;e=c[d+4>>2]|0;g=f+8|0;c[g>>2]=c[d>>2];c[g+4>>2]=e;g=f+16|0;c[g>>2]=g;c[f+20>>2]=g;g=c[i>>2]|0;c[g+4>>2]=f;c[f>>2]=g;c[f+4>>2]=i;c[i>>2]=f;g=0;break}else{g=Le(20)|0;c[g+8>>2]=Tk(r)|0;f=g+12|0;c[f>>2]=f;c[g+16>>2]=f;f=c[j>>2]|0;c[f+4>>2]=g;c[g>>2]=f;c[g+4>>2]=j;c[j>>2]=g;f=0;break}c[n>>2]=r;nl(h,17384,n)|0;d=c[q>>2]|0;while(1){switch(a[d>>0]|0){case 0:case 10:{f=0;g=0;break i}default:{}}g=d+1|0;c[q>>2]=g;d=g}}else if((s|0)==27){s=0;d=(g|0)!=0;if(!(d|(f|0)!=0)){s=28;break d}if(!d){d=Le(16)|0;c[d+12>>2]=Tk(r)|0;c[d+8>>2]=e;g=f+16|0;e=c[g>>2]|0;c[e+4>>2]=d;c[d>>2]=e;c[d+4>>2]=g;c[g>>2]=d;g=0;break}if((Bd(m,q)|0)<0){s=31;break d}if((Ed(k,q)|0)<0){s=33;break d}d=Le(32)|0;c[d+24>>2]=Tk(r)|0;e=k;u=c[e+4>>2]|0;v=d+8|0;c[v>>2]=c[e>>2];c[v+4>>2]=u;v=m;u=c[v+4>>2]|0;e=d+16|0;c[e>>2]=c[v>>2];c[e+4>>2]=u;e=g+12|0;u=c[e>>2]|0;c[u+4>>2]=d;c[d>>2]=u;c[d+4>>2]=e;c[e>>2]=d}while(0);d=c[q>>2]|0;v=a[d>>0]|0;e=v<<24>>24==10;if(e^v<<24>>24!=0)do{d=d+1|0;c[q>>2]=d;v=a[d>>0]|0;e=v<<24>>24==10}while(e^v<<24>>24!=0);if(e){d=d+1|0;c[q>>2]=d}e=f}if((s|0)==14)ll(17366,17,1,h)|0;else if((s|0)==28){c[o>>2]=r;nl(h,17412,o)|0}else if((s|0)==31)ll(17441,13,1,h)|0;else if((s|0)==33)ll(17455,16,1,h)|0}Uj(p);v=0;l=t;return v|0}function hd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=l;l=l+32|0;d=f+16|0;e=f;if((c[a>>2]|0)!=8)ja(17587,15828,2865,17601);if($a[c[a+12>>2]&15](a,d,e,0,16809164,16809164)|0)ja(16703,15828,2867,17601);if(!(ab[c[a+28>>2]&3](a,e,c[d>>2]|0,17616,514,384,0)|0)){h=c[a+52>>2]|0;g=c[d>>2]|0;e=gk(b)|0;$a[h&15](a,g,0,0,b,e)|0;eb[c[a+4>>2]&15](a,c[d>>2]|0);l=f;return}else ja(17627,15828,2869,17601)}function id(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;i=l;l=l+32|0;f=i+16|0;g=i;h=c[4202143]|0;if(!h){Uj(b);l=i;return}if($a[c[h+12>>2]&15](h,f,g,1e3,16809164,16809164)|0)ja(17708,15828,2892,17757);e=sc(h,c[f>>2]|0,c[h+200>>2]|0)|0;if(e|0){Nc(h,c[f>>2]|0,a)|0;if((ab[c[h+28>>2]&3](h,g,e,a,514,384,0)|0)>=0)$a[c[h+52>>2]&15](h,e,0,0,b,d)|0;eb[c[h+4>>2]&15](h,e)}a=c[f>>2]|0;if(a|0)eb[c[h+4>>2]&15](h,a);Uj(b);l=i;return}function jd(){return}function kd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[4202144]|0;c[4202144]=f+-1;a=(f|0)>1;if((f|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;gb[a&63](c[b>>2]|0,0,d,e);return}function ld(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;e=c[4202144]|0;c[4202144]=e+-1;a=(e|0)>1;if((e|0)>0^a)Na(a&1|0);a=c[b+4>>2]|0;if(!a)return;gb[a&63](c[b>>2]|0,(d|0)<1?-404:0-d|0,0,0);return}function md(a){a=a|0;c[a+4>>2]=0;c[a>>2]=0;return}function nd(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;g=Le(8)|0;c[g>>2]=e;c[g+4>>2]=f;f=c[4202144]|0;c[4202144]=f+1;if(!f)Na(1);wa(a|0,17777,b|0,d|0,0,0,g|0,1,7,8,0)|0;return g|0}function od(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Le(4132)|0;c[e>>2]=b;c[e+4>>2]=d;c[e+16>>2]=a;return e|0}function pd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!e){q=0;return q|0}l=b+8|0;m=b+12|0;n=b+36|0;o=b+16|0;p=b+20|0;q=b+4|0;k=b+40|0;j=d;a:while(1){switch(c[l>>2]|0){case 0:{i=c[m>>2]|0;d=20-i|0;d=(e|0)<(d|0)?e:d;Ll(b+36+i|0,j|0,d|0)|0;i=d+(c[m>>2]|0)|0;c[m>>2]=i;if((i|0)>19){if(Zk(n,17835,4)|0){d=-1;e=12;break a}f=p;g=k;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[l>>2]=1;c[m>>2]=0}break}case 1:{d=c[m>>2]|0;i=4096-d|0;i=(e|0)<(i|0)?e:i;Ll(b+36+d|0,j|0,i|0)|0;d=i+(c[m>>2]|0)|0;c[m>>2]=d;if((d|0)>4095){d=d+-16|0;Ue(n,n,d,c[o>>2]|0,p,0);d=Ya[c[b>>2]&63](c[q>>2]|0,n,d)|0;if((d|0)<0){e=12;break a}f=n;g=(c[m>>2]|0)+(b+36)+-16|0;h=f+16|0;do{a[f>>0]=a[g>>0]|0;f=f+1|0;g=g+1|0}while((f|0)<(h|0));c[m>>2]=16;d=i}else d=i;break}default:{e=10;break a}}e=e-d|0;if(!e){d=0;e=12;break}else j=j+d|0}if((e|0)==10)ra();else if((e|0)==12)return d|0;return 0}function qd(b){b=b|0;var d=0,e=0,f=0,g=0;if((c[b+8>>2]|0)!=1){g=-1;return g|0}d=b+12|0;e=c[d>>2]|0;if(!((e|0)!=0&(e&15|0)==0)){g=-1;return g|0}g=b+36|0;Ue(g,g,e,c[b+16>>2]|0,b+20|0,0);d=a[(c[d>>2]|0)+-1+(b+36)>>0]|0;if((d+-1&255)>15){g=-1;return g|0}d=e-(d&255)|0;if(d|0?(f=Ya[c[b>>2]&63](c[b+4>>2]|0,g,d)|0,(f|0)<0):0){g=f;return g|0}g=0;return g|0}function rd(a){a=a|0;Uj(a);return}function sd(a,b,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0;m=Le(48)|0;c[m>>2]=a;c[m+4>>2]=b;b=m+8|0;c[b>>2]=0;c[b+4>>2]=0;c[m+16>>2]=j;c[m+20>>2]=k;b=m+24|0;c[b>>2]=g;k=m+32|0;g=k;c[g>>2]=0;c[g+4>>2]=0;if(l|0){g=Le(4132)|0;c[g>>2]=15;c[g+4>>2]=m;c[g+16>>2]=l;c[m+40>>2]=g}l=Le(8)|0;c[l>>2]=m;c[l+4>>2]=9;g=(h|0)!=0|(i|0)!=0;if(g){a=Tj(h)|0;j=c[m>>2]|0;b=c[b>>2]|0;if((b|0)!=0?(n=k,n=$a[c[j+48>>2]&15](j,b,c[n>>2]|0,c[n+4>>2]|0,a,h)|0,(n|0)>=0):0){b=k;n=xl(c[b>>2]|0,c[b+4>>2]|0,n|0,((n|0)<0)<<31>>31|0)|0;b=k;c[b>>2]=n;c[b+4>>2]=y;b=17772}else b=17772}else{a=0;b=17777}n=c[4202144]|0;c[4202144]=n+1;if(!n)Na(1);wa(d|0,b|0,e|0,f|0,a|0,h|0,l|0,1,7,8,0)|0;if(!g)return;Uj(a);return}function td(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;g=c[a>>2]|0;e=a+8|0;f=e;a=$a[c[g+52>>2]&15](g,c[a+4>>2]|0,c[f>>2]|0,c[f+4>>2]|0,b,d)|0;if((a|0)<0)return a|0;f=e;f=xl(c[f>>2]|0,c[f+4>>2]|0,a|0,((a|0)<0)<<31>>31|0)|0;g=e;c[g>>2]=f;c[g+4>>2]=y;return a|0}function ud(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=c[b>>2]|0;do if((d|0)<0){h=b+40|0;i=d;g=((d|0)<0)<<31>>31}else{h=b+40|0;g=c[h>>2]|0;do if(!g){i=b+8|0;g=i;g=$a[c[o+52>>2]&15](o,c[b+4>>2]|0,c[g>>2]|0,c[g+4>>2]|0,e,f)|0;if((g|0)<0)n=13;else{m=i;m=xl(c[m>>2]|0,c[m+4>>2]|0,g|0,((g|0)<0)<<31>>31|0)|0;n=i;c[n>>2]=m;c[n+4>>2]=y;n=14}}else{g=pd(g,e,f)|0;if(!((d|0)==0&(g|0)>-1))if((g|0)<0){n=13;break}else{n=14;break}g=c[h>>2]|0;if((((c[g+8>>2]|0)==1?(i=g+12|0,j=c[i>>2]|0,(j|0)!=0&(j&15|0)==0):0)?(k=g+36|0,Ue(k,k,j,c[g+16>>2]|0,g+20|0,0),l=a[(c[i>>2]|0)+-1+(g+36)>>0]|0,(l+-1&255)<=15):0)?(m=j-(l&255)|0,m|0):0)Ya[c[g>>2]&63](c[g+4>>2]|0,k,m)|0}while(0);if((n|0)==13){i=g;g=((g|0)<0)<<31>>31;break}if((n|0)==14?d|0:0)return;g=b+8|0;i=c[g>>2]|0;g=c[g+4>>2]|0}while(0);hb[c[b+16>>2]&7](o,c[b+4>>2]|0,i,g,c[b+20>>2]|0);g=c[h>>2]|0;if(g|0)Uj(g);Uj(b);return}function vd(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=l;l=l+288|0;x=A+48|0;y=A;z=A+80|0;if((f|0)>=33)ja(17781,17806,589,17816);if((h|0)<=0){l=A;return}o=y+f|0;p=y+(f+1)|0;q=y+(f+2)|0;r=y+(f+3)|0;s=f+4|0;t=(g|0)>0;u=(d|0)>64;v=z+112|0;w=z+176|0;n=1;while(1){c[x>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;c[x+16>>2]=0;c[x+20>>2]=0;c[x+24>>2]=0;c[x+28>>2]=0;Ll(y|0,e|0,f|0)|0;a[o>>0]=n>>>24;a[p>>0]=n>>>16;a[q>>0]=n>>>8;a[r>>0]=n;if(t){k=s;m=0;while(1){if(u){Ze(b,d,v);j=32}else{Ll(v|0,b|0,d|0)|0;j=d}Nl(z+112+j|0,0,64-j|0)|0;j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^54;j=j+1|0}while((j|0)!=64);Ve(z);We(z,v,64);We(z,y,k);Ye(w,z);j=0;do{B=z+112+j|0;a[B>>0]=a[B>>0]^106;j=j+1|0}while((j|0)!=64);Ze(v,96,y);j=0;do{B=x+j|0;a[B>>0]=a[B>>0]^a[y+j>>0];j=j+1|0}while((j|0)!=32);m=m+1|0;if((m|0)==(g|0))break;else k=32}}j=(h|0)<32?h:32;Ll(i|0,x|0,j|0)|0;h=h-j|0;if((h|0)<=0)break;else{i=i+j|0;n=n+1|0}}l=A;return}function wd(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(!(a[b>>0]|0)){f=Tk(c)|0;return f|0}g=gk(b)|0;e=gk(c)|0;f=Tj(g+2+e|0)|0;Ll(f|0,b|0,g|0)|0;d=f+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ll(d|0,c|0,e+1|0)|0;g=f;return g|0}function xd(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;if(kk(c,58)|0){f=Tk(c)|0;return f|0}if(!(a[b>>0]|0)){f=Tk(c)|0;return f|0}g=gk(b)|0;f=gk(c)|0;e=Tj(g+2+f|0)|0;Ll(e|0,b|0,g|0)|0;d=e+g|0;if((a[b+(g+-1)>>0]|0)!=47){a[d>>0]=47;d=d+1|0}Ll(d|0,c|0,f+1|0)|0;g=e;return g|0}function yd(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]|0;while(1){g=a[d>>0]|0;e=g<<24>>24==10;f=d+1|0;if(e^g<<24>>24!=0)d=f;else break}c[b>>2]=e?f:d;return}function zd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=c[e>>2]|0;a:while(1){f=a[h>>0]|0;switch(f<<24>>24){case 34:{j=4;break a}case 0:{i=-1;j=26;break a}case 9:case 32:break;default:{j=21;break a}}h=h+1|0}b:do if((j|0)==4){k=b+d+-1|0;f=h+1|0;c:while(1){d=f+1|0;j=a[f>>0]|0;h=j<<24>>24;d:do switch(j<<24>>24){case 34:{g=b;l=d;break b}case 0:case 10:{i=-1;j=26;break c}case 92:{i=f+2|0;h=a[d>>0]|0;switch(h|0){case 92:case 34:case 39:{f=i;break d}case 110:{h=10;f=i;break d}case 114:{h=13;f=i;break d}case 116:{h=9;f=i;break d}case 120:{i=a[i>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{j=d+-87|0;break}else{j=d+-55|0;break}else j=h;while(0);i=a[f+3>>0]|0;d=i<<24>>24;h=d+-48|0;do if(h>>>0>=10)if((d+-65|0)>>>0>=6)if(i<<24>>24<87|(d+-97|0)>>>0>5){i=-1;j=26;break c}else{h=d+-87|0;break}else{h=d+-55|0;break}while(0);h=h|j<<4;f=f+4|0;break d}default:{i=-1;j=26;break c}}}default:f=d}while(0);if(b>>>0>=k>>>0){i=-1;j=26;break}a[b>>0]=h;b=b+1|0}if((j|0)==26)return i|0}else if((j|0)==21){i=b+d+-1|0;g=b;while(1){switch(f<<24>>24){case 10:case 0:case 9:case 32:{l=h;break b}default:{}}if(g>>>0>=i>>>0){i=-1;break}l=h+1|0;a[g>>0]=f;g=g+1|0;h=l;f=a[l>>0]|0}return i|0}else if((j|0)==26)return i|0;while(0);a[g>>0]=0;c[e>>2]=l;e=0;return e|0}function Ad(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;g=c[d>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=_k(g,f,e)|0;b=c[f>>2]|0;if((b|0)==(g|0)){d=-1;l=h;return d|0}c[d>>2]=b;d=0;l=h;return d|0}function Bd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=il(f,e,0)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function Cd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}c[b>>2]=_k(f,e,0)|0;b=c[e>>2]|0;if((b|0)==(f|0)){d=-1;l=g;return d|0}c[d>>2]=b;d=0;l=g;return d|0}function Dd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=l;l=l+16|0;f=i;g=c[e>>2]|0;a:while(1){switch(a[g>>0]|0){case 9:case 32:break;default:break a}g=g+1|0}c[b>>2]=_k(g,f,0)|0;b=c[f>>2]|0;if((b|0)==(g|0)){e=-1;l=i;return e|0}if((a[b>>0]|0)==46){b=b+1|0;f=a[b>>0]|0;if((f+-48&255)<10){g=0;h=1e9;do{h=(h>>>0)/10|0;g=(N((f<<24>>24)+-48|0,h)|0)+g|0;b=b+1|0;f=a[b>>0]|0}while((f+-48&255)<10);f=g}else f=0}else f=0;c[d>>2]=f;c[e>>2]=b;e=0;l=i;return e|0}function Ed(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;g=l;l=l+16|0;e=g;f=c[d>>2]|0;a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}h=il(f,e,16)|0;c[b>>2]=h;c[b+4>>2]=y;b=c[e>>2]|0;if((b|0)==(f|0)){h=-1;l=g;return h|0}c[d>>2]=b;h=0;l=g;return h|0}function Fd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+16|0;f=e;g=f;c[g>>2]=b;c[g+4>>2]=d;$k(a,17839,f)|0;l=e;return a|0}function Gd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;if((d|0)<=0){d=0;return d|0}j=0;a:while(1){h=j<<1;f=a[c+h>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{i=g+-87|0;break}else{i=g+-55|0;break}else i=e;while(0);f=a[c+(h|1)>>0]|0;g=f<<24>>24;e=g+-48|0;do if(e>>>0>=10)if((g+-65|0)>>>0>=6)if(f<<24>>24<87|(g+-97|0)>>>0>5){e=-1;f=12;break a}else{e=g+-87|0;break}else{e=g+-55|0;break}while(0);a[b+j>>0]=e|i<<4;j=j+1|0;if((j|0)>=(d|0)){e=0;f=12;break}}if((f|0)==12)return e|0;return 0}function Hd(a){a=a|0;a=Uk(a,17847)|0;return ((a|0)==0?0:a+2|0)|0}function Id(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+128|0;i=k;j=i;a:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 10:case 0:{d=-1;f=18;break a}default:{}}f=i;b:while(1){switch(g<<24>>24){case 0:case 10:case 58:break b;default:{}}if((f-j|0)>>>0<127){a[f>>0]=g;f=f+1|0}g=d+1|0;d=g;g=a[g>>0]|0}a[f>>0]=0;if((a[d>>0]|0)!=58){d=-1;f=18;break}c:while(1){d=d+1|0;switch(a[d>>0]|0){case 9:case 32:break;default:break c}}f=kk(d,10)|0;g=(f|0)!=0;if(g)h=f-d|0;else h=gk(d)|0;if(!(fk(i,e)|0)){f=16;break}if(g)d=f+1|0;else{d=-1;f=18;break}}if((f|0)==16){c=(h|0)<(c|0)?h:c+-1|0;Ll(b|0,d|0,c|0)|0;a[b+c>>0]=0;c=0;l=k;return c|0}else if((f|0)==18){l=k;return d|0}return 0}function Jd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Id(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=il(f,g,0)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function Kd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+80|0;g=h+64|0;f=h;if(Id(f,64,d,e)|0){g=-1;l=h;return g|0}a:while(1){switch(a[f>>0]|0){case 9:case 32:break;default:break a}f=f+1|0}e=il(f,g,16)|0;c[b>>2]=e;c[b+4>>2]=y;g=((c[g>>2]|0)==(f|0))<<31>>31;l=h;return g|0}function Ld(b){b=b|0;var d=0,e=0,f=0;f=l;l=l+80|0;e=f+64|0;d=f;if(Id(d,64,b,17850)|0){l=f;return -1}a:while(1){switch(a[d>>0]|0){case 9:case 32:break;default:break a}d=d+1|0}b=il(d,e,0)|0;l=f;return ((c[e>>2]|0)==(d|0)?-1:b)|0}function Md(a){a=a|0;if(Me(a,17858,0)|0){a=1;return a|0}if(Me(a,17864,0)|0){a=1;return a|0}a=(Me(a,17871,0)|0)!=0&1;return a|0}function Nd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;o=c[e>>2]|0;o=Xa[c[o+2576>>2]&3](o,e)|0;if((f|0)<=0)return;m=a+8|0;n=a+4|0;l=0;h=0;e=0;while(1){g=c[o+(l>>>5<<2)>>2]|0;if(!g)g=h;else{i=0;k=e;while(1){j=i;while(1){e=1<<j;if(!(e&g))j=j+1|0;else break}g=g&~e;e=j+l<<12;p=c[m>>2]|0;i=(e|0)/(p|0)|0;p=((e|4095|0)/(p|0)|0)+1|0;e=c[n>>2]|0;e=(p|0)<(e|0)?p:e;if((k|0)!=(h|0)){if((i|0)>(k+3|0)){ib[b&1](a,d,0,h,c[a>>2]|0,k-h|0);h=i}}else h=i;if(!g){g=h;break}else{i=j;k=e}}}l=l+32|0;if((l|0)>=(f|0))break;else h=g}if((e|0)==(g|0))return;ib[b&1](a,d,0,g,c[a>>2]|0,e-g|0);return}function Od(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=Le(12)|0;c[h>>2]=e;c[e>>2]=f;c[e+4>>2]=g;f=f<<2;c[e+8>>2]=f;f=(N(f,g)|0)+65535&-65536;g=e+16|0;c[g>>2]=f;c[h+4>>2]=f>>12;g=c[g>>2]|0;g=$a[c[a+2568>>2]&15](a,b,d,g,((g|0)<0)<<31>>31,2)|0;c[h+8>>2]=g;c[e+12>>2]=c[g+40>>2];c[e+20>>2]=h;c[e+24>>2]=5;return h|0}function Pd(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+20>>2]|0;Nd(a,b,d,c[e+8>>2]|0,c[e+4>>2]|0);return}function Qd(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0;a:do if((e|0)>=0){j=b+4+(e<<2)|0;if(c[j>>2]|0){i=0;return i|0}}else{e=0;while(1){j=b+4+(e<<2)|0;if(!(c[j>>2]|0))break a;e=e+8|0;if(e>>>0>=256){e=0;break}}return e|0}while(0);k=Le(432)|0;c[k>>2]=b;c[k+316>>2]=Tk(d)|0;a[k+4>>0]=e;a[k+56>>0]=f;a[k+57>>0]=(f&65535)>>>8;a[k+58>>0]=g;a[k+59>>0]=(g&65535)>>>8;a[k+64>>0]=h;a[k+66>>0]=i;a[k+67>>0]=(i&65535)>>>8;a[k+70>>0]=0;a[k+312>>0]=64;Ke(k+8|0,6,k,0);Ke(k+20|0,6,k,1);Ke(k+32|0,6,k,2);Ke(k+44|0,6,k,3);c[j>>2]=k;i=k;return i|0}function Rd(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a>>2]|0;f=d[a+4>>0]|0;a=b+3+(f>>>3)&3;b=1<<(f&31);if(!e){e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]&~b}else{e=g+1036+(a<<5)+(f>>>5<<2)|0;c[e>>2]=c[e>>2]|b}fb[c[g+1164+(a*12|0)>>2]&15](c[g+1164+(a*12|0)+4>>2]|0,c[g+1164+(a*12|0)+8>>2]|0,(c[g+1036+(a<<5)+28>>2]|(c[g+1036+(a<<5)+24>>2]|(c[g+1036+(a<<5)+20>>2]|(c[g+1036+(a<<5)+16>>2]|(c[g+1036+(a<<5)+12>>2]|(c[g+1036+(a<<5)+8>>2]|(c[g+1036+(a<<5)+4>>2]|c[g+1036+(a<<5)>>2]))))))|0)!=0&1);return}function Sd(a,b){a=a|0;b=b|0;if(b>>>0<4)return a+8+(b*12|0)|0;else ja(17877,17889,140,17895);return 0}function Td(a){a=a|0;return c[(c[a>>2]|0)+1028>>2]|0}function Ud(a){a=a|0;return c[(c[a>>2]|0)+1032>>2]|0}function Vd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;if(d>>>0>=7)ja(17914,17889,190,17940);if(e+-1&e|0)ja(17957,17889,191,17940);if(e>>>0<=3)ja(17982,17889,192,17940);i=b+320+(d<<4)|0;if(!(c[i>>2]|0)){c[i>>2]=e;f=f&255;a[b+320+(d<<4)+4>>0]=f;a[b+320+(d<<4)+5>>0]=0;c[b+320+(d<<4)+8>>2]=g;c[b+320+(d<<4)+12>>2]=h;g=(d|0)==6;h=(g?48:(d<<2)+16|0)+(b+56)|0;a[h>>0]=g?0:f;a[h+1>>0]=0;a[h+2>>0]=0;a[h+3>>0]=0;return}else ja(17992,17889,194,17940)}function Wd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return Je(c[(c[a>>2]|0)+1028>>2]|0,b,d,e)|0}function Xd(b,c,d){b=b|0;c=c|0;d=d|0;a[(c&255)+(b+56)>>0]=d;return}function Yd(b,c,d){b=b|0;c=c|0;d=d|0;c=(c&255)+(b+56)|0;a[c>>0]=d;a[c+1>>0]=(d&65535)>>>8;return}function Zd(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+312|0;f=a[e>>0]|0;g=f&255;h=g+d|0;if((h|0)>256){h=-1;return h|0}a[e>>0]=h;h=b+62|0;a[h>>0]=a[h>>0]|16;Ll(b+56+g|0,c|0,d|0)|0;h=b+108|0;a[g+1+(b+56)>>0]=a[h>>0]|0;a[h>>0]=f;h=g;return h|0}function _d(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=Le(36)|0;j=Le(1212)|0;c[j>>2]=0;c[j+1028>>2]=f;c[j+1032>>2]=g;c[i+32>>2]=h;Ke(j+1164|0,7,i,0);Ke(j+1176|0,7,i,1);Ke(j+1188|0,7,i,2);Ke(j+1200|0,7,i,3);He(g,3320,0,1,0,i,16,10,4)|0;He(g,3324,0,4,0,i,17,11,7)|0;g=Qd(j,18005,0,-32634,4663,2,1536)|0;a[g+100>>0]=-12;a[g+101>>0]=26;a[g+102>>0]=0;a[g+103>>0]=17;c[i+4>>2]=g;c[i>>2]=j;g=Qd(j,18012,8,-32634,28672,0,1537)|0;h=i+8|0;c[h>>2]=g;a[g+70>>0]=-128;c[b>>2]=j;c[e>>2]=d[(c[h>>2]|0)+4>>0];return i|0}function $d(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;g=e+96+((c[b+8>>2]|0)+56)|0;h=a[g>>0]&127;a[g>>0]=h;g=h&255;if((h&255)>=16)return;e=1<<e;if(!f){h=b+16+g|0;e=(e^255)&(d[h>>0]|0)&255;a[h>>0]=e}else{h=b+16+g|0;e=(e|(d[h>>0]|0))&255;a[h>>0]=e}h=c[b+32>>2]|0;fb[c[h+(g*12|0)>>2]&15](c[h+(g*12|0)+4>>2]|0,c[h+(g*12|0)+8>>2]|0,e<<24>>24!=0&1);return}function ae(a,b,d){a=a|0;b=b|0;d=d|0;return c[a+12>>2]|0}function be(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+12>>2]=d;return}function ce(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;g=c[a+12>>2]|0;if((g|0)>=0){e=c[14600+(e<<2)>>2]|0;return e|0}f=c[a>>2]|0;if((e|0)==2){if((g>>>16&255|0)!=(c[f>>2]|0)){e=-1;return e|0}a=c[f+4+((g>>>8&255)<<2)>>2]|0;if(!a){e=-1;return e|0}e=(g&252)+(a+56)|0;e=(d[e+1>>0]|0)<<8|(d[e>>0]|0)|(d[e+2>>0]|0)<<16|(d[e+3>>0]|0)<<24;return e|0}a=g|b;if((a>>>16&255|0)!=(c[f>>2]|0)){e=c[14600+(e<<2)>>2]|0;return e|0}b=c[f+4+((a>>>8&255)<<2)>>2]|0;if(!b){e=c[14600+(e<<2)>>2]|0;return e|0}f=a&255;switch(e|0){case 0:{e=d[b+56+f>>0]|0;return e|0}case 1:{a=b+56+f|0;b=d[a>>0]|0;if((f|0)==255){e=b;return e|0}e=(d[a+1>>0]|0)<<8|b;return e|0}default:ra()}return 0}function de(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=c[a+12>>2]|0;if((f|0)>=0)return;a=c[a>>2]|0;if((e|0)==2){ee(a,f&-4,d,2);return}else{ee(a,f|b,d,e);return}}function ee(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if((e>>>16&255|0)!=(c[b>>2]|0))return;l=c[b+4+((e>>>8&255)<<2)>>2]|0;if(!l)return;k=e&255;switch(g|0){case 2:{b=k+-16|0;e=(k|0)==48;if(e|b>>>0<24?(j=e?6:b>>>2,i=c[l+320+(j<<4)>>2]|0,(i|0)!=0):0){b=0-i|0;if((j|0)==6)b=(b|1)&f;else b=b&f|d[l+320+(j<<4)+4>>0];f=l+56+k|0;a[f>>0]=b;a[f+1>>0]=b>>>8;a[f+2>>0]=b>>>16;a[f+3>>0]=b>>>24;fe(l);return}else h=10;break}case 31:{b=-2147483648;break}default:h=10}if((h|0)==10){b=1<<g;h=l+70|0;e=0;do{i=e+k|0;a:do if(i>>>0<256){g=f>>>(e<<3);if((i|1|0)==7){j=l+56+i|0;a[j>>0]=(g^255)&d[j>>0];break}switch(a[h>>0]|0){case -128:case 0:{switch(i|0){case 39:case 38:case 37:case 36:case 35:case 34:case 33:case 32:case 31:case 30:case 29:case 28:case 27:case 26:case 25:case 24:case 23:case 22:case 21:case 20:case 19:case 18:case 17:case 16:case 51:case 50:case 49:case 48:case 61:case 14:case 11:case 10:case 9:case 8:case 3:case 2:case 1:case 0:break a;default:{}}break}default:switch(i|0){case 59:case 58:case 57:case 56:case 61:case 14:case 11:case 10:case 9:case 8:case 3:case 2:case 1:case 0:break a;default:{}}}a[l+56+i>>0]=g}while(0);e=e+1|0}while((e|0)<(b|0))}if(!(k>>>0<5&(b+k|0)>>>0>4))return;fe(l);return}function fe(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=d[b+60>>0]|0;j=(k&1|0)==0;k=(k&2|0)==0;e=0;do{l=(e|0)==6;g=(l?48:(e<<2)+16|0)+(b+56)|0;f=d[g>>0]|0;g=d[g+1>>0]<<8|f|d[g+2>>0]<<16|d[g+3>>0]<<24;h=c[b+320+(e<<4)>>2]|0;do if(!h)m=6;else{if(j|(a[b+320+(e<<4)+4>>0]&1)==0?k|l&(f&1|0)==0:0){m=6;break}gb[c[b+320+(e<<4)+12>>2]&63](c[b+320+(e<<4)+8>>2]|0,e,g&0-h,1);a[b+320+(e<<4)+5>>0]=1}while(0);if((m|0)==6?(m=0,i=b+320+(e<<4)+5|0,a[i>>0]|0):0){gb[c[b+320+(e<<4)+12>>2]&63](c[b+320+(e<<4)+8>>2]|0,e,0,0);a[i>>0]=0}e=e+1|0}while((e|0)!=7);return}function ge(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;h=c[b>>2]|0;g=c[b+8>>2]|0;a[e>>0]=0;a[e+1>>0]=0;b=a[f>>0]|0;j=b&255;a[g+152>>0]=b;b=e+(j>>>3)|0;a[b>>0]=1<<(j&7)|d[b>>0];b=a[f+1>>0]|0;j=b&255;a[g+153>>0]=b;b=e+(j>>>3)|0;a[b>>0]=1<<(j&7)|d[b>>0];b=a[f+2>>0]|0;j=b&255;a[g+154>>0]=b;b=e+(j>>>3)|0;a[b>>0]=1<<(j&7)|d[b>>0];b=a[f+3>>0]|0;f=b&255;a[g+155>>0]=b;b=e+(f>>>3)|0;a[b>>0]=1<<(f&7)|d[b>>0];b=0;do{e=c[h+4+(b<<2)>>2]|0;if((e|0?a[e+117>>0]|0:0)?(i=a[(((d[e+4>>0]|0)>>>3)+3&3|96)+(g+56)>>0]|0,(i&255)<16):0)a[e+116>>0]=i;b=b+1|0}while((b|0)!=256);return}function he(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;if((c[b>>2]|0)!=2){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;f=c[b>>2]|0;a:do if((f|0)>0){e=c[b+8>>2]|0;b=0;while(1){if(!(fk((c[e+(b<<4)+4>>2]|0)+4|0,d)|0))break;b=b+1|0;if((b|0)>=(f|0))break a}if(e+(b<<4)|0){e=e+(b<<4)+8|0;f=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=f;return}}while(0);c[a>>2]=6;c[a+4>>2]=0;return}function ie(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=l;l=l+16|0;g=j;if((c[a>>2]|0)!=2){d=-1;l=j;return d|0}i=c[a+4>>2]|0;a=c[i>>2]|0;a:do if((a|0)>0){f=c[i+8>>2]|0;e=0;while(1){if(!(fk((c[f+(e<<4)+4>>2]|0)+4|0,b)|0))break;e=e+1|0;if((e|0)>=(a|0)){h=8;break a}}if(f+(e<<4)|0){a=f+(e<<4)+8|0;c[g>>2]=c[a>>2];c[g+4>>2]=c[a+4>>2];je(g)}else h=8}else h=8;while(0);if((h|0)==8){e=i+4|0;f=c[e>>2]|0;if((a|0)<(f|0))e=c[i+8>>2]|0;else{g=a+1|0;a=(f*3|0)/2|0;a=(g|0)>(a|0)?g:a;g=i+8|0;h=Vj(c[g>>2]|0,a<<4)|0;c[g>>2]=h;c[e>>2]=a;a=c[i>>2]|0;e=h}c[i>>2]=a+1;h=gk(b)|0;i=Tj(h+5|0)|0;c[i>>2]=h;Ll(i+4|0,b|0,h+1|0)|0;c[e+(a<<4)>>2]=0;c[e+(a<<4)+4>>2]=i;a=e+(a<<4)+8|0}i=d;b=c[i+4>>2]|0;d=a;c[d>>2]=c[i>>2];c[d+4>>2]=b;d=0;l=j;return d|0}function je(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;f=l;l=l+16|0;e=f;switch(c[a>>2]|0){case 7:case 0:{Uj(c[a+4>>2]|0);l=f;return}case 3:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=(c[d>>2]|0)+(a<<3)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];je(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Uj(b);l=f;return}case 2:{b=c[a+4>>2]|0;if((c[b>>2]|0)>0){d=b+8|0;a=0;do{g=c[d>>2]|0;h=g+(a<<4)|0;c[e>>2]=c[h>>2];c[e+4>>2]=c[h+4>>2];je(e);g=g+(a<<4)+8|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];je(e);a=a+1|0}while((a|0)<(c[b>>2]|0))}Uj(b);l=f;return}case 6:case 5:case 4:case 1:{l=f;return}default:ra()}}function ke(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;if((c[b>>2]|0)!=3){c[a>>2]=6;c[a+4>>2]=0;return}b=c[b+4>>2]|0;if((c[b>>2]|0)>>>0>d>>>0){e=(c[b+8>>2]|0)+(d<<3)|0;b=c[e+4>>2]|0;d=a;c[d>>2]=c[e>>2];c[d+4>>2]=b;return}else{c[a>>2]=6;c[a+4>>2]=0;return}}function le(a){a=a|0;return ((c[a>>2]|0)==7?(c[a+4>>2]|0)+4|0:0)|0}function me(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+272|0;g=e+256|0;f=e;c[g>>2]=d;ok(f,256,b,g)|0;b=gk(f)|0;d=Tj(b+5|0)|0;c[d>>2]=b;Ll(d+4|0,f|0,b+1|0)|0;c[a>>2]=7;c[a+4>>2]=d;l=e;return} +function qf(f){f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0;z=l;l=l+32|0;w=z;q=z+24|0;r=z+20|0;s=z+16|0;t=z+12|0;c[5756]=f+1;c[5759]=0;c[5758]=0;c[5761]=c[5640];c[5757]=0;v=((f|0)<0)<<31>>31;g=0;h=0;a:while(1){p=(c[5756]|0)+-1|0;c[5756]=p;if(!p){i=c[5757]|0;if(!i){x=2301;break}c[5756]=i;c[5757]=0}else{h=c[5758]|0;if(h>>>0<(c[5759]|0)>>>0){c[5760]=h;p=d[h>>0]|0;c[5758]=h+1;h=p}else{n=(c[5761]|0)+h|0;o=(c[5690]|0)+n|0;h=c[23084+((o>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|0)==-1){do if(!(wf(r,s,t,o,0,(a[22968]|0)==3&1)|0)){h=c[r>>2]|0;i=Ge(c[4202123]|0,h,0)|0;if(i|0?c[i+32>>2]|0:0){h=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;c[5758]=h;xf(o,h,c[s>>2]|0,c[t>>2]|0);h=0;break}c[5760]=c[5758];h=5}else{c[5760]=c[5758];h=4}while(0);if(h|0){x=29;break}i=c[5758]|0}else{i=h+o|0;c[5758]=i}c[5760]=i;c[5761]=n-i;j=o&4095;c[5759]=i+(4082-j);h=d[i>>0]|0;c[5758]=i+1;if(j>>>0>=4081){if(yf(q,o,h)|0){x=28;break}m=c[q>>2]|0;if((m+j|0)>4096){if((m|0)>0){k=0;do{i=k+o|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!(j&1))i=d[j+i>>0]|0;else{if(zf(i,0,0,2)|0){x=28;break a}i=c[5762]|0}a[23004+k>>0]=i;k=k+1|0}while((k|0)<(m|0))}c[5760]=23004;c[5761]=n-23004;c[5758]=23005;c[5759]=23004+m}}}p=c[5730]|0;c[5755]=p;h=p&256|h}b:do switch(h|0){case 251:{x=916;break a}case 244:{x=920;break a}case 241:{x=2303;break a}case 102:{h=c[5755]|0;i=c[5730]|0;if((h|0)==(i|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,102)|0){x=2304;break a}i=c[5730]|0;h=c[5755]|0}p=(i&256|0)==0?h|256:h&-257;c[5755]=p;o=c[5758]|0;h=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=p&256|h;break}case 103:{i=c[5755]|0;h=c[5730]|0;if((i|0)==(h|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,103)|0){x=2304;break a}h=c[5730]|0;i=c[5755]|0}p=(h&128|0)==0?i|128:i&-129;c[5755]=p;o=c[5758]|0;h=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=p&256|h;break}case 240:{h=c[5755]|0;if((h|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,240)|0){x=2304;break a}h=c[5755]|0}c[5755]=h|64;o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=h&256|p;break}case 242:{h=c[5755]|0;if((h|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,242)|0){x=2304;break a}h=c[5755]|0}c[5755]=h|32;o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=h&256|p;break}case 243:{h=c[5755]|0;if((h|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,243)|0){x=2304;break a}h=c[5755]|0}c[5755]=h|16;o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;c[5757]=c[5756];c[5756]=1;h=h&256|p;break}case 62:case 54:case 46:case 38:{i=c[5755]|0;if((i|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,h)|0){x=2304;break a}i=c[5755]|0}c[5755]=i&-16|(h>>>3&3)+1;p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5757]=c[5756];c[5756]=1;h=i&256|h;break}case 101:case 100:{i=c[5755]|0;if((i|0)==(c[5730]|0)){if(yf(q,(c[5760]|0)+(c[5690]|0)+(c[5761]|0)|0,h)|0){x=2304;break a}i=c[5755]|0}c[5755]=i&-16|(h&7)+1;p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5757]=c[5756];c[5756]=1;h=i&256|h;break}case 183:case 182:case 181:case 180:case 179:case 178:case 177:case 176:{p=c[5758]|0;g=d[p>>0]|0;c[5758]=p+1;p=h&7;h=22528+((h&3)<<2)|0;o=p<<1&8;c[h>>2]=c[h>>2]&~(255<<o)|g<<o;h=p;break}case 191:case 190:case 189:case 188:case 187:case 186:case 185:case 184:{p=c[5758]|0;g=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[22528+((h&7)<<2)>>2]=g;break}case 136:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3;j=c[22528+((j&3)<<2)>>2]>>(j<<1&8);g=j&255;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;c[p>>2]=c[p>>2]&~(255<<h)|g<<h;h=136;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(i&1)if(!(Bf(h,g,0,2)|0)){h=136;break b}else{x=2304;break a}else{a[i+h>>0]=j;h=136;break b}}case 137:{g=c[5758]|0;h=d[g>>0]|0;c[5758]=g+1;g=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){c[22528+((h&7)<<2)>>2]=g;h=137;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,g,2,2)|0)){h=137;break b}else{x=2304;break a}else{c[i+h>>2]=g;h=137;break b}}case 138:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&3)<<2)>>2]>>(i<<1&8)&255;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=i>>>3;h=22528+((p&3)<<2)|0;p=p<<1&8;c[h>>2]=c[h>>2]&~(255<<p)|(g&255)<<p;h=138;break}case 139:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)!=192){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;c[22528+((i>>>3&7)<<2)>>2]=g;h=139;break}case 160:{j=c[5755]|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0];g=i+2|0;if(!(j&128)){h=d[g>>0]<<16|h|d[i+3>>0]<<24;g=i+4|0}c[5758]=g;g=j&15;g=(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)+h|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!(h&1))g=d[h+g>>0]|0;else{if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}c[5632]=c[5632]&-256|g;h=160;break}case 161:{j=c[5755]|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0];g=i+2|0;if(!(j&128)){h=d[g>>0]<<16|h|d[i+3>>0]<<24;g=i+4|0}c[5758]=g;g=j&15;g=(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)+h|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=h+g|0;g=c[g>>2]|0;c[5632]=g;h=161;break}case 162:{k=c[5755]|0;j=c[5758]|0;i=d[j+1>>0]<<8|d[j>>0];h=j+2|0;if(!(k&128)){i=d[h>>0]<<16|i|d[j+3>>0]<<24;h=j+4|0}c[5758]=h;h=k&15;h=(c[22740+(((h|0)==0?3:h+-1|0)<<4)+4>>2]|0)+i|0;i=c[5632]|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(j&1)if(!(Bf(h,i,0,2)|0)){h=162;break b}else{x=2304;break a}else{a[j+h>>0]=i;h=162;break b}}case 163:{k=c[5755]|0;j=c[5758]|0;i=d[j+1>>0]<<8|d[j>>0];h=j+2|0;if(!(k&128)){i=d[h>>0]<<16|i|d[j+3>>0]<<24;h=j+4|0}c[5758]=h;h=k&15;h=(c[22740+(((h|0)==0?3:h+-1|0)<<4)+4>>2]|0)+i|0;i=c[5632]|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((j|h)&3)if(!(Bf(h,i,2,2)|0)){h=163;break b}else{x=2304;break a}else{c[j+h>>2]=i;h=163;break b}}case 215:{h=c[5632]|0;i=(h&255)+(c[5635]|0)|0;p=c[5755]|0;g=p&15;g=((p&128|0)==0?i:i&65535)+(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!(i&1))g=d[g+i>>0]|0;else{if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5632]|0}c[5632]=h&-256|g&255;h=215;break}case 198:{g=c[5758]|0;h=d[g>>0]|0;i=g+1|0;c[5758]=i;if((h&192|0)==192){p=d[i>>0]|0;c[5758]=g+2;g=22528+((h&3)<<2)|0;h=h<<1&8;c[g>>2]=c[g>>2]&~(255<<h)|p<<h;g=p;h=198;break b}h=Af(h)|0;j=c[5758]|0;i=a[j>>0]|0;g=i&255;c[5758]=j+1;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(j&1)if(!(Bf(h,g,0,2)|0)){h=198;break b}else{x=2304;break a}else{a[j+h>>0]=i;h=198;break b}}case 199:{g=c[5758]|0;h=d[g>>0]|0;i=g+1|0;c[5758]=i;if((h&192|0)==192){p=d[g+2>>0]<<8|d[i>>0]|d[g+3>>0]<<16|d[g+4>>0]<<24;c[5758]=g+5;c[22528+((h&7)<<2)>>2]=p;g=p;h=199;break b}h=Af(h)|0;i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,g,2,2)|0)){h=199;break b}else{x=2304;break a}else{c[i+h>>2]=g;h=199;break b}}case 151:case 150:case 149:case 148:case 147:case 146:case 145:{g=c[5632]|0;p=22528+((h&7)<<2)|0;c[5632]=c[p>>2];c[p>>2]=g;break}case 134:{k=c[5758]|0;g=d[k>>0]|0;c[5758]=k+1;k=g>>>3;do if((g&192|0)!=192){m=Af(g)|0;h=m>>>12;i=8411692+((c[5770]|0)+h<<2)|0;g=c[i>>2]|0;if(!(g&1)){g=d[g+m>>0]|0;j=i}else{if(zf(m,0,1,2)|0){x=2304;break a}g=c[5762]|0;j=8411692+((c[5770]|0)+h<<2)|0}i=22528+((k&3)<<2)|0;h=k<<1&8;k=c[i>>2]>>h;j=c[j>>2]|0;if(j&1)if(!(Bf(m,k&255,0,2)|0))break;else{x=2304;break a}else{a[j+m>>0]=k;break}}else{o=22528+((g&3)<<2)|0;p=c[o>>2]|0;g=g<<1&8;i=22528+((k&3)<<2)|0;h=k<<1&8;c[o>>2]=(c[i>>2]>>h&255)<<g|p&~(255<<g);g=p>>g&255}while(0);c[i>>2]=c[i>>2]&~(255<<h)|(g&255)<<h;h=134;break}case 135:{j=c[5758]|0;g=d[j>>0]|0;c[5758]=j+1;j=g>>>3&7;do if((g&192|0)!=192){m=Af(g)|0;g=m>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|m)&3)){k=h;g=i+m|0}else{if(zf(m,2,1,2)|0){x=2304;break a}k=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;h=22528+(j<<2)|0;j=c[h>>2]|0;i=c[k>>2]|0;if((i|m)&3)if(!(Bf(m,j,2,2)|0))break;else{x=2304;break a}else{c[i+m>>2]=j;break}}else{p=22528+((g&7)<<2)|0;g=c[p>>2]|0;h=22528+(j<<2)|0;c[p>>2]=c[h>>2]}while(0);c[h>>2]=g;h=135;break}case 142:{i=c[5758]|0;g=d[i>>0]|0;c[5758]=i+1;i=g>>>3&7;if(i>>>0>5|(i|0)==1){x=2303;break a}do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]&65535;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if(Cf(i,g)|0){x=2304;break a}if((i|0)==2){x=154;break a}else h=142;break}case 140:{g=c[5758]|0;h=d[g>>0]|0;c[5758]=g+1;g=h>>>3&7;if(g>>>0>5){x=2303;break a}g=c[22740+(g<<4)>>2]|0;if((h&192|0)==192){h=22528+((h&7)<<2)|0;if(!(c[5755]&256)){c[h>>2]=g;h=140;break b}else{c[h>>2]=c[h>>2]&-65536|g&65535;h=140;break b}}else{h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=140;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=140;break b}}}case 197:case 196:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;if((i&192|0)==192){x=2303;break a}p=Af(i)|0;if(Df((h|0)==196?0:3,i>>>3&7,p)|0){x=2304;break a}break}case 56:case 48:case 40:case 32:case 24:case 16:case 8:case 0:{j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=h>>>3;k=i>>>3;k=c[22528+((k&3)<<2)>>2]>>(k<<1&8);n=k&255;if((i&192|0)==192){p=22528+((i&3)<<2)|0;o=i<<1&8;n=Ef(j,c[p>>2]>>o&255,n)|0;c[p>>2]=c[p>>2]&~(255<<o)|(n&255)<<o;break b}m=Af(i)|0;i=m>>>12;g=(c[5770]|0)+i|0;if((j|0)==7){g=c[23084+(g<<2)>>2]|0;if(!(g&1))g=d[g+m>>0]|0;else{if(zf(m,0,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=n;c[5642]=g-k<<24>>24;c[5643]=6;break b}g=c[8411692+(g<<2)>>2]|0;if(!(g&1))g=d[g+m>>0]|0;else{if(zf(m,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Ef(j,g,n)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(i&1)if(!(Bf(m,g,0,2)|0))break b;else{x=2304;break a}else{a[i+m>>0]=g;break b}}case 1:{j=c[5758]|0;g=d[j>>0]|0;c[5758]=j+1;j=c[22528+((g>>>3&7)<<2)>>2]|0;if((g&192|0)==192){h=22528+((g&7)<<2)|0;g=c[h>>2]|0;c[5641]=j;g=g+j|0;c[5642]=g;c[5643]=2;c[h>>2]=g;h=1;break b}k=Af(g)|0;g=k>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|k)&3))g=i+k|0;else{if(zf(k,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;c[5641]=j;g=g+j|0;c[5642]=g;c[5643]=2;h=c[h>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=1;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=1;break b}}case 49:case 41:case 33:case 25:case 17:case 9:{j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=h>>>3;k=c[22528+((i>>>3&7)<<2)>>2]|0;if((i&192|0)==192){p=22528+((i&7)<<2)|0;c[p>>2]=Ff(j,c[p>>2]|0,k)|0;break b}m=Af(i)|0;i=m>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|m)&3)if(!(zf(m,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+m|0;g=Ff(j,c[g>>2]|0,k)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((i|m)&3)if(!(Bf(m,g,2,2)|0))break b;else{x=2304;break a}else{c[i+m>>2]=g;break b}}case 57:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){c[5641]=i;c[5642]=(c[22528+((h&7)<<2)>>2]|0)-i;c[5643]=8;h=57;break b}g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=h+g|0;g=c[g>>2]|0;c[5641]=i;c[5642]=g-i;c[5643]=8;h=57;break}case 58:case 50:case 42:case 34:case 26:case 18:case 10:case 2:{k=c[5758]|0;i=d[k>>0]|0;c[5758]=k+1;k=h>>>3;m=i>>>3;do if((i&192|0)==192)i=c[22528+((i&3)<<2)>>2]>>(i<<1&8)&255;else{i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!(j&1)){i=d[j+i>>0]|0;break}if(zf(i,0,0,2)|0){x=2304;break a}i=c[5762]|0}while(0);p=22528+((m&3)<<2)|0;o=m<<1&8;n=Ef(k,c[p>>2]>>o&255,i)|0;c[p>>2]=c[p>>2]&~(255<<o)|(n&255)<<o;break}case 3:{i=c[5758]|0;g=d[i>>0]|0;c[5758]=i+1;i=g>>>3&7;do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;h=22528+(i<<2)|0;p=c[h>>2]|0;c[5641]=g;g=p+g|0;c[5642]=g;c[5643]=2;c[h>>2]=g;h=3;break}case 51:case 43:case 35:case 27:case 19:case 11:{k=c[5758]|0;i=d[k>>0]|0;c[5758]=k+1;k=h>>>3;m=i>>>3&7;do if((i&192|0)!=192){i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((j|i)&3)if(!(zf(i,2,0,2)|0)){i=23048;break}else{x=2304;break a}else{i=j+i|0;break}}else i=22528+((i&7)<<2)|0;while(0);p=22528+(m<<2)|0;c[p>>2]=Ff(k,c[p>>2]|0,c[i>>2]|0)|0;break}case 59:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);h=c[h>>2]|0;c[5641]=h;c[5642]=(c[22528+(j<<2)>>2]|0)-h;c[5643]=8;h=59;break}case 60:case 52:case 44:case 36:case 28:case 20:case 12:case 4:{o=c[5758]|0;p=d[o>>0]|0;c[5758]=o+1;p=Ef(h>>>3,c[5632]&255,p)|0;c[5632]=c[5632]&-256|p&255;break}case 5:{g=c[5758]|0;h=d[g+1>>0]<<8|d[g>>0]|d[g+2>>0]<<16|d[g+3>>0]<<24;c[5758]=g+4;g=c[5632]|0;c[5641]=h;g=h+g|0;c[5642]=g;c[5643]=2;c[5632]=g;h=5;break}case 45:case 37:case 29:case 21:case 13:{o=c[5758]|0;p=d[o+1>>0]<<8|d[o>>0]|d[o+2>>0]<<16|d[o+3>>0]<<24;c[5758]=o+4;c[5632]=Ff(h>>>3,c[5632]|0,p)|0;break}case 53:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0]|d[h+2>>0]<<16|d[h+3>>0]<<24;c[5758]=h+4;g=g^c[5632];c[5642]=g;c[5643]=14;c[5632]=g;h=53;break}case 61:{p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5641]=h;c[5642]=(c[5632]|0)-h;c[5643]=8;h=61;break}case 130:case 128:{i=c[5758]|0;j=d[i>>0]|0;k=i+1|0;c[5758]=k;m=j>>>3&7;if((j&192|0)==192){n=d[k>>0]|0;c[5758]=i+2;p=22528+((j&3)<<2)|0;o=j<<1&8;n=Ef(m,c[p>>2]>>o&255,n)|0;c[p>>2]=c[p>>2]&~(255<<o)|(n&255)<<o;break b}k=Af(j)|0;i=c[5758]|0;j=d[i>>0]|0;c[5758]=i+1;i=k>>>12;g=(c[5770]|0)+i|0;if((m|0)==7){g=c[23084+(g<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=j;c[5642]=g-j<<24>>24;c[5643]=6;break b}g=c[8411692+(g<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Ef(m,g,j)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(i&1)if(!(Bf(k,g,0,2)|0))break b;else{x=2304;break a}else{a[i+k>>0]=g;break b}}case 129:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;m=i>>>3&7;k=(i&192|0)==192;if((m|0)==7){do if(!k){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5641]=h;c[5642]=g-h;c[5643]=8;h=129;break b}if(k){p=d[h+2>>0]<<8|d[j>>0]|d[h+3>>0]<<16|d[h+4>>0]<<24;c[5758]=h+5;h=22528+((i&7)<<2)|0;c[h>>2]=Ff(m,c[h>>2]|0,p)|0;h=129;break b}j=Af(i)|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Ff(m,c[g>>2]|0,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=129;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=129;break b}}case 131:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;m=i>>>3&7;k=(i&192|0)==192;if((m|0)==7){do if(!k){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;p=c[5758]|0;h=a[p>>0]|0;c[5758]=p+1;c[5641]=h;c[5642]=g-h;c[5643]=8;h=131;break b}if(k){p=a[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;c[h>>2]=Ff(m,c[h>>2]|0,p)|0;h=131;break b}j=Af(i)|0;i=c[5758]|0;h=a[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Ff(m,c[g>>2]|0,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=131;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=131;break b}}case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:{g=22528+((h&7)<<2)|0;i=c[g>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=i+1|0;c[5642]=p;c[5643]=27;c[g>>2]=p;g=p;break}case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:{g=22528+((h&7)<<2)|0;i=c[g>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=i+-1|0;c[5642]=p;c[5643]=30;c[g>>2]=p;g=p;break}case 107:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);h=c[h>>2]|0;o=c[5758]|0;n=a[o>>0]|0;c[5758]=o+1;o=Dl(((n|0)<0?0-n|0:n)|0,0,((h|0)<0?0-h|0:h)|0,0)|0;p=y;n=(h^n|0)>-1;h=n?o:0-o|0;c[5642]=h;c[5641]=(n?p:(o|0)==0?0-p|0:~p)-(h>>31);c[5643]=23;c[22528+(j<<2)>>2]=h;h=107;break}case 105:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);n=c[h>>2]|0;p=c[5758]|0;h=d[p+3>>0]<<24;o=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|h;c[5758]=p+4;o=Dl(((o|0)<0?0-o|0:o)|0,0,((n|0)<0?0-n|0:n)|0,0)|0;p=y;n=(h^n|0)>-1;h=n?o:0-o|0;c[5642]=h;c[5641]=(n?p:(o|0)==0?0-p|0:~p)-(h>>31);c[5643]=23;c[22528+(j<<2)>>2]=h;h=105;break}case 132:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&3)<<2)>>2]>>(i<<1&8)&255;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=i>>>3;c[5642]=(c[22528+((h&3)<<2)>>2]>>(h<<1&8)&g)<<24>>24;c[5643]=12;h=132;break}case 133:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)!=192){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;c[5642]=c[22528+((i>>>3&7)<<2)>>2]&g;c[5643]=14;h=133;break}case 168:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5642]=(c[5632]&h)<<24>>24;c[5643]=12;h=168;break}case 169:{p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5642]=h&c[5632];c[5643]=14;h=169;break}case 246:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;c[5642]=(g&h)<<24>>24;c[5643]=12;h=246;break b}case 2:{if((h&192|0)==192){p=22528+((h&3)<<2)|0;o=c[p>>2]|0;h=h<<1&8;c[p>>2]=(o>>h&255^255)<<h|o&~(255<<h);h=246;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}g=~g;h=c[h>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=246;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=246;break b}}case 3:{if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;o=c[p>>2]>>h;c[5641]=o&255;o=0-(o<<24)>>24;c[5642]=o;c[5643]=6;c[p>>2]=c[p>>2]&~(255<<h)|(o&255)<<h;h=246;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}c[5641]=g;g=0-(g<<24)>>24;c[5642]=g;c[5643]=6;h=c[h>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=246;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=246;break b}}case 4:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;p=N(h&255,g&255)|0;c[5641]=p>>>8;c[5642]=p<<24>>24;c[5643]=21;c[5632]=p|h&-65536;h=246;break b}case 5:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;p=N(h<<24>>24,g<<24>>24)|0;o=p<<24>>24;c[5642]=o;c[5641]=(p|0)!=(o|0)&1;c[5643]=21;c[5632]=p&65535|h&-65536;h=246;break b}case 6:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;i=h&65535;j=g&255;if(i>>>8>>>0>=j>>>0){x=359;break a}p=(i>>>0)/(j>>>0)|0;c[5632]=p&255|h&-65536|i-(N(p,j)|0)<<8&65280;h=246;break b}case 7:{do if((h&192|0)==192)g=c[22528+((h&3)<<2)>>2]>>(h<<1&8)&255;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;i=h<<16>>16;p=g<<24;j=p>>24;if(!p){x=367;break a}k=(i|0)/(j|0)|0;if((k<<24>>24|0)!=(k|0)){x=369;break a}c[5632]=k&255|h&-65536|i-(N(k,j)|0)<<8&65280;h=246;break b}default:{x=2303;break a}}}case 247:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0]|d[p+2>>0]<<16|d[p+3>>0]<<24;c[5758]=p+4;c[5642]=h&g;c[5643]=14;h=247;break b}case 2:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=~c[h>>2];h=247;break b}j=Af(h)|0;g=j>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|j)&3))g=i+j|0;else{if(zf(j,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=~c[g>>2];h=c[h>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=247;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=247;break b}}case 3:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[5641]=p;p=0-p|0;c[5642]=p;c[5643]=8;c[h>>2]=p;h=247;break b}j=Af(h)|0;g=j>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|j)&3))g=i+j|0;else{if(zf(j,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;c[5641]=g;g=0-g|0;c[5642]=g;c[5643]=8;h=c[h>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=247;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=247;break b}}case 4:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;p=Dl(c[5632]|0,0,g|0,0)|0;h=y;c[5642]=p;c[5641]=h;c[5643]=23;c[5632]=p;c[5634]=h;h=247;break b}case 5:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;n=c[5632]|0;o=Dl(((n|0)<0?0-n|0:n)|0,0,((g|0)<0?0-g|0:g)|0,0)|0;h=y;n=(n^g|0)>-1;p=n?o:0-o|0;h=n?h:(o|0)==0?0-h|0:~h;c[5642]=p;c[5641]=h-(p>>31);c[5643]=23;c[5632]=p;c[5634]=h;h=247;break b}case 6:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;h=c[5634]|0;if(h>>>0>=g>>>0){x=414;break a}o=c[5632]|0;p=Fl(o|0,h|0,g|0,0)|0;h=yl(o|0,h|0,Dl(p|0,y|0,g|0,0)|0,y|0)|0;c[5632]=p;c[5634]=h;h=247;break b}case 7:{do if((h&192|0)!=192){g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((h&7)<<2)|0;while(0);g=c[g>>2]|0;m=c[5634]|0;h=c[5632]|0;i=(m|0)<0;k=i?((h|0)==0?0-m|0:~m):m;m=m>>>31;j=(g|0)<0?0-g|0:g;if(k>>>0>=j>>>0){x=422;break a}i=i?0-h|0:h;h=Fl(i|0,k|0,j|0,0)|0;i=yl(i|0,k|0,Dl(h|0,y|0,j|0,0)|0,y|0)|0;if((g>>>31|0)==(m|0)){if((h|0)<0){x=428;break a}}else{if(h>>>0>2147483648){x=425;break a}h=0-h|0}c[5632]=h;c[5634]=(m|0)==0?i:0-i|0;h=247;break b}default:{x=2303;break a}}}case 192:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=d[j>>0]|0;c[5758]=h+2;h=22528+((i&3)<<2)|0;p=i<<1&8;o=Gf(k,c[h>>2]>>p&255,o)|0;c[h>>2]=c[h>>2]&~(255<<p)|(o&255)<<p;h=192;break b}j=Af(i)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Gf(k,g,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=192;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=192;break b}}case 193:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){p=d[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;c[h>>2]=Hf(k,c[h>>2]|0,p)|0;h=193;break b}j=Af(i)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Hf(k,c[g>>2]|0,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=193;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=193;break b}}case 208:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;o=Gf(i,c[p>>2]>>h&255,1)|0;c[p>>2]=c[p>>2]&~(255<<h)|(o&255)<<h;h=208;break b}j=Af(h)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Gf(i,g,1)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=208;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=208;break b}}case 209:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=Hf(i,c[h>>2]|0,1)|0;h=209;break b}j=Af(h)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=Hf(i,c[g>>2]|0,1)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=209;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=209;break b}}case 210:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;j=c[5633]&255;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;o=Gf(i,c[p>>2]>>h&255,j)|0;c[p>>2]=c[p>>2]&~(255<<h)|(o&255)<<h;h=210;break b}k=Af(h)|0;h=k>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,1,2)|0){x=2304;break a}g=c[5762]|0}g=Gf(i,g,j)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(h&1)if(!(Bf(k,g,0,2)|0)){h=210;break b}else{x=2304;break a}else{a[h+k>>0]=g;h=210;break b}}case 211:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;j=c[5633]&255;if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=Hf(i,c[h>>2]|0,j)|0;h=211;break b}k=Af(h)|0;h=k>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;g=Hf(i,c[g>>2]|0,j)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=211;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=211;break b}}case 152:{c[5632]=c[5632]<<16>>16;h=152;break}case 153:{c[5634]=c[5632]>>31;h=153;break}case 87:case 86:case 85:case 84:case 83:case 82:case 81:case 80:{g=c[22528+((h&7)<<2)>>2]|0;k=(c[5636]|0)+-4|0;if(!(c[5731]|0)){i=(c[5729]&k)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,g,2,2)|0){x=2304;break a}}else c[j+i>>2]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&k;break b}else{i=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((i|k)&3){if(Bf(k,g,2,2)|0){x=2304;break a}}else c[i+k>>2]=g;c[5636]=k;break b}}case 95:case 94:case 93:case 92:case 91:case 90:case 89:case 88:{k=c[5636]|0;if(!(c[5731]|0)){g=c[5729]|0;i=(g&k)+(c[5694]|0)|0;j=c[23084+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((j|i)&3)){m=g;g=j+i|0}else{if(zf(i,2,0,2)|0){x=2304;break a}m=c[5729]|0;k=c[5636]|0;g=23048}i=k&~m|k+4&m}else{g=c[23084+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,0,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=k+4|0}g=c[g>>2]|0;c[5636]=i;c[22528+((h&7)<<2)>>2]=g;break}case 96:{if(!(If()|0))h=96;else{x=2304;break a}break}case 97:{if(!(Jf()|0))h=97;else{x=2304;break a}break}case 143:{j=c[5758]|0;k=d[j>>0]|0;c[5758]=j+1;j=(k&192|0)==192;h=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){g=23048;x=508}else h=1;else{g=i+h|0;x=508}if((x|0)==508){x=0;h=0;g=c[g>>2]|0}if(j){if(h){x=2304;break a}p=c[5636]|0;h=c[5729]|0;c[5636]=p&~h|p+4&h;c[22528+((k&7)<<2)>>2]=g;h=143;break b}if(h){x=2304;break a}i=c[5636]|0;j=c[5729]|0;j=i&~j|i+4&j;c[5636]=j;h=Af(k)|0;c[5636]=i;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;c[5636]=j;h=143;break}case 104:{j=c[5758]|0;g=d[j+1>>0]<<8|d[j>>0]|d[j+2>>0]<<16|d[j+3>>0]<<24;c[5758]=j+4;j=(c[5636]|0)+-4|0;if(!(c[5731]|0)){h=(c[5729]&j)+(c[5694]|0)|0;i=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;h=c[5729]|0;c[5636]=c[5636]&~h|h&j;h=104;break b}else{h=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((h|j)&3){if(Bf(j,g,2,2)|0){x=2304;break a}}else c[h+j>>2]=g;c[5636]=j;h=104;break b}}case 106:{j=c[5758]|0;g=a[j>>0]|0;c[5758]=j+1;j=(c[5636]|0)+-4|0;if(!(c[5731]|0)){h=(c[5729]&j)+(c[5694]|0)|0;i=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;h=c[5729]|0;c[5636]=c[5636]&~h|h&j;h=106;break b}else{h=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((h|j)&3){if(Bf(j,g,2,2)|0){x=2304;break a}}else c[h+j>>2]=g;c[5636]=j;h=106;break b}}case 200:{n=c[5758]|0;o=d[n+1>>0]<<8|d[n>>0];p=n+2|0;c[5758]=p;p=d[p>>0]|0;c[5758]=n+3;if(!(Kf(o,p)|0))h=200;else{x=2304;break a}break}case 201:{if(!(c[5731]|0))if(!(Lf()|0)){h=201;break b}else{x=2304;break a}h=c[5637]|0;g=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((g|h)&3)if(!(zf(h,2,0,2)|0))g=23048;else{x=2304;break a}else g=g+h|0;g=c[g>>2]|0;c[5637]=g;c[5636]=h+4;h=201;break}case 156:{g=c[5766]|0;if(g|0?c[g+12>>2]&65536|0:0){x=544;break a}p=c[5647]|0;if((p&131072|0)!=0&(p&12288|0)!=12288){x=2302;break a}k=sf()|0;g=k&-196609;h=c[5636]|0;if(!(c[5755]&256)){h=h+-4|0;i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,g,2,2)|0){x=2304;break a}}else c[j+i>>2]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=156;break b}else{h=h+-2|0;i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&1){if(Bf(i,g,1,2)|0){x=2304;break a}}else b[j+i>>1]=k;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=156;break b}}case 157:{g=c[5766]|0;if(g|0?c[g+12>>2]&131072|0:0){x=557;break a}p=c[5647]|0;m=p>>>12&3;if((p&131072|0)!=0&(m|0)!=3){x=2302;break a}i=c[5636]|0;h=c[5729]|0;j=(h&i)+(c[5694]|0)|0;k=c[23084+((j>>>12)+(c[5770]|0)<<2)>>2]|0;g=k|j;if(!(c[5755]&256)){if(!(g&3))g=k+j|0;else{if(zf(j,2,0,2)|0){x=2304;break a}h=c[5729]|0;i=c[5636]|0;g=23048}g=c[g>>2]|0;k=i&~h;j=i+4|0;i=-1}else{if(!(g&1))g=e[k+j>>1]|0;else{if(zf(j,1,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5729]|0;i=c[5636]|0}k=i&~h;j=i+2|0;i=65535}c[5636]=k|j&h;h=a[22968]|0;h=(h<<24>>24==0?2388736:m>>>0<(h&255)>>>0?2375936:2376448)&i;c[5641]=g&2261;c[5642]=g>>>6&1^1;c[5643]=24;c[5646]=1-(g>>>9&2);h=c[5647]&~h|h&g;c[5647]=h;i=c[5766]|0;j=(i|0)==0;if((!j?c[i+96>>2]&256|0:0)?(h&512|0)!=0&(a[22970]|0)==0:0){x=580;break a}if(a[22971]|0){if(j)h=h>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(c[i+96>>2]&16777216)h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=580;break a}else h=157}else h=157;break}case 30:case 22:case 14:case 6:{i=c[22740+(h>>>3<<4)>>2]|0;j=(c[5636]|0)+-4|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&3){if(Bf(k,i,2,2)|0){x=2304;break a}}else c[m+k>>2]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break}case 31:case 23:case 7:{g=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=i+g|0;g=c[g>>2]|0;i=h>>>3;if(Cf(i,g&65535)|0){x=2304;break a}o=c[5636]|0;p=c[5729]|0;c[5636]=o&~p|o+4&p;if((i|0)==2){x=590;break a}break}case 141:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}c[5755]=c[5755]&-16|11;c[22528+((h>>>3&7)<<2)>>2]=Af(h)|0;h=141;break}case 254:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{if((h&192|0)==192){k=22528+((h&3)<<2)|0;h=h<<1&8;i=c[k>>2]>>h;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<24)+16777216>>24;c[5642]=p;c[5643]=25;c[k>>2]=c[k>>2]&~(255<<h)|(p&255)<<h;h=254;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<24)+16777216>>24;c[5642]=g;c[5643]=25;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=254;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=254;break b}}case 1:{if((h&192|0)==192){k=22528+((h&3)<<2)|0;h=h<<1&8;i=c[k>>2]>>h;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<24)+-16777216>>24;c[5642]=p;c[5643]=28;c[k>>2]=c[k>>2]&~(255<<h)|(p&255)<<h;h=254;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!(g&1))g=d[g+j>>0]|0;else{if(zf(j,0,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<24)+-16777216>>24;c[5642]=g;c[5643]=28;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(h&1)if(!(Bf(j,g,0,2)|0)){h=254;break b}else{x=2304;break a}else{a[h+j>>0]=g;h=254;break b}}default:{x=2303;break a}}}case 255:{k=c[5758]|0;p=a[k>>0]|0;g=p&255;c[5758]=k+1;k=g&56;switch((p&255)>>>3&7){case 0:{if((g&192|0)==192){g=22528+((g&7)<<2)|0;h=c[g>>2]|0;i=c[5643]|0;if((i|0)<25){c[5645]=i;c[5644]=c[5642]}h=h+1|0;c[5642]=h;c[5643]=27;c[g>>2]=h;g=h;h=255;break b}j=Af(g)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;h=c[g>>2]|0;g=c[5643]|0;if((g|0)<25){c[5645]=g;c[5644]=c[5642]}g=h+1|0;c[5642]=g;c[5643]=27;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=255;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=255;break b}}case 1:{if((g&192|0)==192){g=22528+((g&7)<<2)|0;h=c[g>>2]|0;i=c[5643]|0;if((i|0)<25){c[5645]=i;c[5644]=c[5642]}h=h+-1|0;c[5642]=h;c[5643]=30;c[g>>2]=h;g=h;h=255;break b}j=Af(g)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;h=c[g>>2]|0;g=c[5643]|0;if((g|0)<25){c[5645]=g;c[5644]=c[5642]}g=h+-1|0;c[5642]=g;c[5643]=30;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=255;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=255;break b}}case 2:{do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;k=(c[5761]|0)+(c[5758]|0)|0;h=(c[5636]|0)+-4|0;do if(c[5731]|0){i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,k,2,2)|0))break;else{x=2304;break a}else{c[i+h>>2]=k;break}}else{i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,k,2,2)|0){x=2304;break a}}else c[j+i>>2]=k;p=c[5729]|0;h=c[5636]&~p|p&h}while(0);c[5636]=h;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=255;break b}case 4:{do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=255;break b}case 6:{do if((g&192|0)!=192){g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;j=(c[5636]|0)+-4|0;if(!(c[5731]|0)){h=(c[5729]&j)+(c[5694]|0)|0;i=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((i|h)&3){if(Bf(h,g,2,2)|0){x=2304;break a}}else c[i+h>>2]=g;h=c[5729]|0;c[5636]=c[5636]&~h|h&j;h=255;break b}else{h=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((h|j)&3){if(Bf(j,g,2,2)|0){x=2304;break a}}else c[h+j>>2]=g;c[5636]=j;h=255;break b}}case 5:case 3:{if((g&192|0)==192){x=2303;break a}i=Af(g)|0;g=c[5770]|0;h=c[23084+(g+(i>>>12)<<2)>>2]|0;if(!((h|i)&3)){j=g;g=h+i|0}else{if(zf(i,2,0,2)|0){x=2304;break a}j=c[5770]|0;g=23048}g=c[g>>2]|0;i=i+4|0;h=c[23084+(j+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}h=c[5762]|0}i=(c[5761]|0)+(c[5758]|0)|0;if((k|0)==24){if(Mf(1,h,g,i)|0){x=2304;break a}}else if(Nf(h,g,i)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=702;break a}if(!(a[22971]|0)){h=255;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=255;break b}else{x=702;break a}}default:{x=2303;break a}}}case 235:{h=c[5758]|0;g=a[h>>0]|0;h=g+(h+1)+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=235;break}case 233:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0]|d[h+2>>0]<<16|d[h+3>>0]<<24;h=(c[5761]|0)+(h+4)+g|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=233;break}case 234:{i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0];h=i+2|0;if(!(c[5755]&256)){g=d[h>>0]<<16|g|d[i+3>>0]<<24;h=i+4|0}c[5758]=h;o=d[h+1>>0]<<8|d[h>>0];p=h+2|0;c[5758]=p;if(Nf(o,g,(c[5761]|0)+p|0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=719;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=719;break a}else h=234}else h=234;break}case 112:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(uf()|0))h=112;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=112}break}case 113:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(uf()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=113}else h=113;break}case 114:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(nf(22528)|0))h=114;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=114}break}case 115:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(nf(22528)|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=115}else h=115;break}case 116:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if(!(c[5642]|0)){h=g+h+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=116}else h=116;break}case 117:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if(!(c[5642]|0))h=117;else{h=g+h+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=117}break}case 118:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Of()|0))h=118;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=118}break}case 119:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Of()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=119}else h=119;break}case 120:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if((c[5643]|0)==24){if(!(c[5641]&128)){h=120;break b}}else if((c[5642]|0)>=0){h=120;break b}h=h+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=120;break}case 121:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;if((c[5643]|0)==24){if(c[5641]&128|0){h=121;break b}}else if((c[5642]|0)<0){h=121;break b}h=h+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=121;break}case 122:{i=c[5758]|0;g=a[i>>0]|0;i=i+1|0;c[5758]=i;if((c[5643]|0)==24)h=(c[5641]|0)>>>2&1;else h=d[21168+(c[5642]&255)>>0]|0;if(!h)h=122;else{h=i+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=122}break}case 123:{i=c[5758]|0;g=a[i>>0]|0;i=i+1|0;c[5758]=i;if((c[5643]|0)==24)h=(c[5641]|0)>>>2&1;else h=d[21168+(c[5642]&255)>>0]|0;if(!h){h=i+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=123}else h=123;break}case 124:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Pf()|0))h=124;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=124}break}case 125:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Pf()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=125}else h=125;break}case 126:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Qf()|0))h=126;else{h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=126}break}case 127:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(Qf()|0)){h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=127}else h=127;break}case 226:case 225:case 224:{j=c[5758]|0;g=a[j>>0]|0;j=j+1|0;c[5758]=j;k=c[5755]|0;m=k<<9&65536;p=c[5633]|0;i=m+-1&p+-1;c[5633]=i|p&0-m;m=h&3;switch(h&3){case 0:{h=(c[5642]|0)!=0;break}case 1:{h=(c[5642]|0)==0;break}default:h=1}if((i|0)!=0&h){h=j+g+(c[5761]|0)|0;if(!(k&256)){c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=m;break b}else{h=h&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=m;break b}}else h=m;break}case 227:{h=c[5758]|0;g=a[h>>0]|0;h=h+1|0;c[5758]=h;i=c[5755]|0;if(!((i<<9&65536)+-1&c[5633])){h=h+g+(c[5761]|0)|0;if(!(i&256)){c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=227;break b}else{h=h&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=227;break b}}else h=227;break}case 194:{h=c[5758]|0;m=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=c[5636]|0;g=c[5729]|0;i=(g&h)+(c[5694]|0)|0;j=c[23084+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((j|i)&3)){k=g;g=j+i|0}else{if(zf(i,2,0,2)|0){x=2304;break a}k=c[5729]|0;h=c[5636]|0;g=23048}g=c[g>>2]|0;c[5636]=m+4+h&k|h&~k;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=194;break}case 195:{j=c[5636]|0;if(!(c[5731]|0)){g=c[5729]|0;h=(g&j)+(c[5694]|0)|0;i=c[23084+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|h)&3)){k=g;g=i+h|0}else{if(zf(h,2,0,2)|0){x=2304;break a}k=c[5729]|0;j=c[5636]|0;g=23048}h=j&~k|j+4&k}else{g=c[23084+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if(!((g|j)&3)){h=j;g=g+j|0}else{if(zf(j,2,0,2)|0){x=2304;break a}h=c[5636]|0;g=23048}h=h+4|0}g=c[g>>2]|0;c[5636]=h;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=195;break}case 232:{k=c[5758]|0;g=d[k+1>>0]<<8|d[k>>0]|d[k+2>>0]<<16|d[k+3>>0]<<24;k=k+4|0;c[5758]=k;k=(c[5761]|0)+k|0;h=(c[5636]|0)+-4|0;do if(c[5731]|0){i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(Bf(h,k,2,2)|0))break;else{x=2304;break a}else{c[i+h>>2]=k;break}}else{i=(c[5729]&h)+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&3){if(Bf(i,k,2,2)|0){x=2304;break a}}else c[j+i>>2]=k;p=c[5729]|0;h=c[5636]&~p|p&h}while(0);c[5636]=h;h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=232;break}case 154:{j=(c[5755]|0)>>>8&1^1;i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0];h=i+2|0;if(j){g=d[h>>0]<<16|g|d[i+3>>0]<<24;h=i+4|0}c[5758]=h;o=d[h+1>>0]<<8|d[h>>0];p=h+2|0;c[5758]=p;if(Mf(j,o,g,(c[5761]|0)+p|0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=813;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=813;break a}else h=154}else h=154;break}case 202:{o=c[5758]|0;p=d[o+1>>0]<<8|d[o>>0];c[5758]=o+2;if(Rf((c[5755]|0)>>>8&1^1,p)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=826;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=826;break a}else h=202}else h=202;break}case 203:{if(Rf((c[5755]|0)>>>8&1^1,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=839;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=839;break a}else h=203}else h=203;break}case 207:{h=c[5766]|0;if(h|0?c[h+12>>2]&1048576|0:0){x=842;break a}if(Sf((c[5755]|0)>>>8&1^1,(c[5761]|0)+(c[5758]|0)|0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=855;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=855;break a}else h=207}else h=207;break}case 144:break;case 204:{if(pf(3,2,(c[5761]|0)+(c[5758]|0)|0,0,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=868;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=868;break a}else h=204}else h=204;break}case 205:{h=c[5758]|0;g=d[h>>0]|0;h=h+1|0;c[5758]=h;p=c[5647]|0;if(!((p&131072|0)==0|(p&12288|0)==12288)){x=2302;break a}p=c[5761]|0;c[5640]=p+(c[5760]|0);if(pf(g,2,p+h|0,0,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=882;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=882;break a}else h=205}else h=205;break}case 206:{if(uf()|0){if(pf(4,2,(c[5761]|0)+(c[5758]|0)|0,0,0)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=896;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=896;break a}else h=206}else h=206}else h=206;break}case 98:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}if(!(Tf(h>>>3&7,Af(h)|0)|0))h=98;else{x=2304;break a}break}case 245:{h=nf(22528)|0;if((c[5643]|0)==24){p=c[5641]|0;i=p>>>7&1;h=p&4|h|((c[5642]|0)==0&1)<<6}else{p=c[5642]|0;i=p>>>31;h=d[21168+(p&255)>>0]<<2|h|((p|0)==0&1)<<6}h=i<<7|h|(uf()|0)<<11|(vf()|0);c[5641]=h^1;c[5642]=h>>>6&1^1;c[5643]=24;h=245;break}case 248:{h=nf(22528)|0;if((c[5643]|0)==24){p=c[5641]|0;i=p>>>7&1;h=p&4|h|((c[5642]|0)==0&1)<<6}else{p=c[5642]|0;i=p>>>31;h=d[21168+(p&255)>>0]<<2|h|((p|0)==0&1)<<6}h=i<<7|h|(uf()|0)<<11|(vf()|0);c[5641]=h&-2;c[5642]=h>>>6&1^1;c[5643]=24;h=248;break}case 249:{h=nf(22528)|0;if((c[5643]|0)==24){p=c[5641]|0;i=p>>>7&1;h=p&4|h|((c[5642]|0)==0&1)<<6}else{p=c[5642]|0;i=p>>>31;h=d[21168+(p&255)>>0]<<2|h|((p|0)==0&1)<<6}h=i<<7|h|(uf()|0)<<11|(vf()|0);c[5641]=h|1;c[5642]=h>>>6&1^1;c[5643]=24;h=249;break}case 214:{g=0-(nf(22528)|0)|0;c[5632]=c[5632]&-256|g&255;h=214;break}case 252:{c[5646]=1;h=252;break}case 253:{c[5646]=-1;h=253;break}case 250:{h=c[5647]|0;if((h>>>12&3)>>>0<(d[22968]|0)>>>0){x=2302;break a}c[5647]=h&-513;h=250;break}case 158:{h=c[5632]|0;c[5641]=h>>>8&213|(uf()|0)<<11;c[5642]=h>>>14&1^1;c[5643]=24;h=158;break}case 159:{g=sf()|0;c[5632]=c[5632]&-65281|g<<8&65280;h=159;break}case 164:{h=Uf()|0;if((h|0)<0){x=2304;break a}if(!h)h=164;else{c[5758]=c[5760];h=164}break}case 165:{h=Vf()|0;if((h|0)<0){x=2304;break a}if(!h)h=165;else{c[5758]=c[5760];h=165}break}case 170:{h=Wf()|0;if((h|0)<0){x=2304;break a}if(!h)h=170;else{c[5758]=c[5760];h=170}break}case 171:{h=Xf()|0;if((h|0)<0){x=2304;break a}if(!h)h=171;else{c[5758]=c[5760];h=171}break}case 166:{h=Yf()|0;if((h|0)<0){x=2304;break a}if(!h)h=166;else{c[5758]=c[5760];h=166}break}case 167:{h=Zf()|0;if((h|0)<0){x=2304;break a}if(!h)h=167;else{c[5758]=c[5760];h=167}break}case 172:{h=_f()|0;if((h|0)<0){x=2304;break a}if(!h)h=172;else{c[5758]=c[5760];h=172}break}case 173:{h=$f()|0;if((h|0)<0){x=2304;break a}if(!h)h=173;else{c[5758]=c[5760];h=173}break}case 174:{h=ag()|0;if((h|0)<0){x=2304;break a}if(!h)h=174;else{c[5758]=c[5760];h=174}break}case 175:{h=bg()|0;if((h|0)<0){x=2304;break a}if(!h)h=175;else{c[5758]=c[5760];h=175}break}case 108:{h=cg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=969;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=969;break a}else h=108}else h=108;break}case 109:{h=dg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=984;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=984;break a}else h=109}else h=109;break}case 110:{h=eg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=999;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=999;break a}else h=110}else h=110;break}case 111:{h=fg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1014;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1014;break a}else h=111}else h=111;break}case 223:case 222:case 221:case 220:case 219:case 218:case 217:case 216:{if(c[5732]&12|0){x=1016;break a}j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=i>>>3&7|h<<3&56;if((i&192|0)==192)if(!(gg(j,i&7)|0))break b;else{x=2304;break a}else if(!(hg(j,Af(i)|0)|0))break b;else{x=2304;break a}}case 155:{h=c[5732]|0;if(h&12|0){x=1021;break a}if((h&32|0)==0|(b[11298]&128)==0)h=155;else{x=1023;break a}break}case 228:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,0,0)|0){x=2304;break a}h=Ya[c[16808512>>2]&63](c[4202130]|0,g,0)|0;c[5632]=c[5632]&-256|h&255;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1036;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1036;break a}else h=228}else h=228;break}case 229:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,2,0)|0){x=2304;break a}c[5632]=Ya[c[16808512>>2]&63](c[4202130]|0,g,2)|0;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1049;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1049;break a}else h=229}else h=229;break}case 230:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,0,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&255,0);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1062;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1062;break a}else h=230}else h=230;break}case 231:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,2,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]|0,2);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1075;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1075;break a}else h=231}else h=231;break}case 236:{p=c[5634]|0;g=p&65535;if(ig(p&65535,0,0)|0){x=2304;break a}h=Ya[c[16808512>>2]&63](c[4202130]|0,g,0)|0;c[5632]=c[5632]&-256|h&255;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1088;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1088;break a}else h=236}else h=236;break}case 237:{p=c[5634]|0;g=p&65535;if(ig(p&65535,2,0)|0){x=2304;break a}c[5632]=Ya[c[16808512>>2]&63](c[4202130]|0,g,2)|0;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1101;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1101;break a}else h=237}else h=237;break}case 238:{p=c[5634]|0;g=p&65535;if(ig(p&65535,0,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&255,0);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1114;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1114;break a}else h=238}else h=238;break}case 239:{p=c[5634]|0;g=p&65535;if(ig(p&65535,2,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]|0,2);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1127;break a}if(a[22971]|0){if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(h){x=1127;break a}else h=239}else h=239;break}case 39:{jg();h=39;break}case 47:{kg();h=47;break}case 55:{lg();h=55;break}case 63:{mg();h=63;break}case 212:{p=c[5758]|0;g=d[p>>0]|0;c[5758]=p+1;if(!(ng(g)|0))h=212;else{x=2304;break a}break}case 213:{h=c[5758]|0;g=d[h>>0]|0;c[5758]=h+1;og(g);h=213;break}case 99:{if(!(c[5732]&1)){x=2303;break a}if(c[5647]&131072|0){x=2303;break a}p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;if((i&192|0)==192)h=0;else h=Af(i)|0;if(!(pg(i,h)|0))h=99;else{x=2304;break a}break}case 15:{n=c[5758]|0;p=a[n>>0]|0;o=p&255;h=n+1|0;c[5758]=h;do switch(p<<24>>24){case -113:case -114:case -115:case -116:case -117:case -118:case -119:case -120:case -121:case -122:case -123:case -124:case -125:case -126:case -127:case -128:{g=d[n+2>>0]<<8|d[h>>0]|d[n+3>>0]<<16|d[n+4>>0]<<24;c[5758]=n+5;if(!(qg(o&15)|0)){h=o;break b}h=(c[5758]|0)+g+(c[5761]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case -97:case -98:case -99:case -100:case -101:case -102:case -103:case -104:case -105:case -106:case -107:case -108:case -109:case -110:case -111:case -112:{h=d[h>>0]|0;c[5758]=n+2;g=qg(o&15)|0;if((h&192|0)==192){p=22528+((h&3)<<2)|0;h=h<<1&8;c[p>>2]=c[p>>2]&~(255<<h)|(g&255)<<h;h=o;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(i&1)if(!(Bf(h,g,0,2)|0)){h=o;break b}else{x=2304;break a}else{a[i+h>>0]=g;h=o;break b}}case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:{i=d[h>>0]|0;c[5758]=n+2;do if((i&192|0)!=192){g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((i&7)<<2)|0;while(0);g=c[g>>2]|0;if(!(qg(o&15)|0)){h=o;break b}c[22528+((i>>>3&7)<<2)>>2]=g;h=o;break b}case -74:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g;h=182;break b}case -73:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]&65535;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g;h=183;break b}case -66:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(h&1)){g=d[h+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g<<24>>24;h=190;break b}case -65:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]|0;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[22528+(i<<2)>>2]=g<<16>>16;h=191;break b}case 0:{if((c[5647]|0)>>>17&1|c[5732]&1^1|0){x=2303;break a}j=d[h>>0]|0;c[5758]=n+2;i=j>>>3;k=i&7;switch(i&7){case 1:case 0:{g=c[5766]|0;if(g|0?c[g+12>>2]&1<<(k|8)|0:0){x=1186;break a}g=(k|0)==0?c[5709]|0:c[5713]|0;if((j&192|0)==192){h=22528+((j&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=0;break b}h=Af(j)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=0;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=0;break b}}case 3:case 2:{if(a[22968]|0){x=2302;break a}g=k+106|0;h=c[5766]|0;if(h|0?c[h+12>>2]&1<<(g&31)|0:0){x=1195;break a}do if((j&192|0)==192)g=c[22528+((j&7)<<2)>>2]&65535;else{g=Af(j)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if((k|0)==2)if(!(rg(g,0)|0)){h=0;break b}else{x=2304;break a}p=g&65535;o=g&65532;if(!o){c[5714]=0;i=0;h=0}else{if(g&4|0){x=1207;break a}h=g&65528;if((h|7)>>>0>(c[5719]|0)>>>0){x=1209;break a}i=(c[5718]|0)+h|0;h=c[23084+(i>>>12<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,0)|0))h=23048;else{x=2304;break a}else h=h+i|0;n=c[h>>2]|0;m=i+4|0;j=m>>>12;h=c[23084+(j<<2)>>2]|0;if((h|m)&3)if(!(zf(m,2,0,0)|0))h=23048;else{x=2304;break a}else h=h+m|0;k=c[h>>2]|0;if(k&4096|0){x=1218;break a}if((k>>>8&7|8|0)!=9){x=1218;break a}if(!(k&32768)){x=1220;break a}i=k|512;h=c[8411692+(j<<2)>>2]|0;if((h|m)&3){if(Bf(m,i,2,0)|0){x=2304;break a}}else c[h+m>>2]=i;c[5714]=k&-16777216|n>>>16|k<<16&16711680;h=k&983040|n&65535;i=k;h=(k&8388608|0)==0?h:h<<12|4095}c[5715]=h;c[5716]=i;c[5713]=p;h=0;break b}case 5:case 4:{do if((j&192|0)==192)g=c[22528+((j&7)<<2)>>2]&65535;else{g=Af(j)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if(!(sg(g,i&1)|0)){h=0;break b}else{x=2304;break a}}default:{x=2303;break a}}}case 1:{h=a[h>>0]|0;k=h&255;j=n+2|0;c[5758]=j;p=k>>>3;m=p&7;switch(p&7){case 1:case 0:{if((k&192|0)==192){x=2303;break a}h=1-m+102|0;i=c[5766]|0;if(i|0?c[i+(h>>>5<<2)>>2]&1<<(h&31)|0:0){x=1237;break a}j=Af(k)|0;k=m|8;h=c[22740+(k<<4)+8>>2]|0;i=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((i|j)&1){if(Bf(j,h,1,2)|0){x=2304;break a}}else b[i+j>>1]=h;j=j+2|0;h=c[22740+(k<<4)+4>>2]|0;i=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((i|j)&3)if(!(Bf(j,h,2,2)|0)){h=1;break b}else{x=2304;break a}else{c[i+j>>2]=h;h=1;break b}}case 3:case 2:{if((k&192|0)!=192){if(a[22968]|0){x=2302;break a}g=3-m+106|0;h=c[5766]|0;if(h|0?c[h+(g>>>5<<2)>>2]&1<<(g&31)|0:0){x=1362;break a}i=Af(k)|0;h=c[5770]|0;g=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((g|i)&1))g=e[g+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5770]|0}i=i+2|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,2)|0))h=23048;else{x=2304;break a}else h=h+i|0;h=c[h>>2]|0;h=(c[5755]&256|0)==0?h:h&16777215;if((m|0)==2){c[5718]=h;c[5719]=g;h=1;break b}else{c[5722]=h;c[5723]=g;h=1;break b}}switch(h&7){case 1:{x=1290;break a}case 0:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&1|0:0){x=1251;break a}m=c[5761]|0;c[5640]=m+(c[5760]|0);m=m+j|0;h=c[5632]|0;if(h&4095|0){x=1275;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=1275;break a}if(!(c[i+32>>2]|0)){x=1275;break a}n=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!n){x=1275;break a}h=c[5765]|0;if(h&4095|0){x=1275;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=1275;break a}if(!(c[i+32>>2]|0)){x=1275;break a}k=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!k){x=1275;break a}j=n+1368|0;i=c[j>>2]|0;j=c[j+4>>2]|0;do if(!((i&1|0)==0&0==0)){if(!(0==0?(c[n+1392>>2]&131072|0)==0:0)){h=3;break}h=a[n+1227>>0]|0;if((h&255)>3){x=1275;break a}else h=h&255}else h=0;while(0);if(0==0?(c[n+144>>2]&1|0)==0:0){if(!(j>>>0>0|(j|0)==0&i>>>0>2147483647)){x=1275;break a}}else if(!(c[5735]&32)){x=1275;break a}i=k+1128|0;c[i>>2]=c[5718];c[i+4>>2]=0;c[k+1124>>2]=c[5719];i=k+1160|0;c[i>>2]=c[5722];c[i+4>>2]=0;c[k+1156>>2]=c[5723];i=k+1368|0;c[i>>2]=c[5732];c[i+4>>2]=0;i=k+1360|0;c[i>>2]=c[5734];c[i+4>>2]=0;i=k+1352|0;c[i>>2]=c[5735];c[i+4>>2]=0;i=k+1232|0;c[i>>2]=c[5764];c[i+4>>2]=0;i=k+1392|0;c[i>>2]=sf()|0;c[i+4>>2]=0;b[k+1024>>1]=c[5685];i=k+1032|0;c[i>>2]=c[5686];c[i+4>>2]=0;c[k+1028>>2]=c[5687];i=c[5688]|0;b[k+1026>>1]=i>>>8&255|i>>>12&3840;i=k+1040|0;b[i>>1]=c[5689];p=i+8|0;c[p>>2]=c[5690];c[p+4>>2]=0;c[i+4>>2]=c[5691];p=c[5692]|0;b[i+2>>1]=p>>>8&255|p>>>12&3840;i=k+1056|0;b[i>>1]=c[5693];p=i+8|0;c[p>>2]=c[5694];c[p+4>>2]=0;c[i+4>>2]=c[5695];p=c[5696]|0;b[i+2>>1]=p>>>8&255|p>>>12&3840;i=k+1072|0;b[i>>1]=c[5697];p=i+8|0;c[p>>2]=c[5698];c[p+4>>2]=0;c[i+4>>2]=c[5699];p=c[5700]|0;b[i+2>>1]=p>>>8&255|p>>>12&3840;i=k+1400|0;c[i>>2]=m;c[i+4>>2]=0;i=k+1496|0;c[i>>2]=c[5636];c[i+4>>2]=0;i=k+1528|0;c[i>>2]=c[5632];c[i+4>>2]=0;tf(n,1);a[22968]=h;c[5770]=(h|0)==3?1048576:0;a[22970]=c[n+104>>2]&1;i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0;j=n+128|0;c[j>>2]=0;c[j+4>>2]=0;c[5766]=n;c[5767]=k;a[23072]=1;j=n+168|0;i=c[j>>2]|0;if((i|0)<0){h=i&255;k=i>>>11&1;switch(i>>>8&7){case 0:{i=1;break}case 2:{i=1;h=2;break}case 3:{i=0;break}case 4:{i=2;break}default:{x=1274;break a}}p=pf(h,i,c[5640]|0,k,c[n+172>>2]|0)|0;c[j>>2]=0;if(p|0)break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];if(a[22970]|0){x=2301;break a}h=c[5766]|0;i=(h|0)==0;do if(!i){if(!(c[h+96>>2]&256))break;if(c[5647]&512|0){x=1289;break a}}while(0);if(!(a[22971]|0)){h=o;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=o;break b}else{x=1289;break a}}case 2:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&4|0:0){x=1299;break a}h=c[5632]|0;if(h&4095|0){x=2302;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=2302;break a}if(!(c[i+32>>2]|0)){x=2302;break a}h=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!h){x=2302;break a}p=h+1088|0;c[5701]=e[p>>1];c[5702]=c[p+8>>2];c[5703]=c[p+4>>2];p=e[p+2>>1]|0;c[5704]=p<<8&65280|p<<12&15728640;p=h+1104|0;c[5705]=e[p>>1];c[5706]=c[p+8>>2];c[5707]=c[p+4>>2];p=e[p+2>>1]|0;c[5708]=p<<8&65280|p<<12&15728640;p=h+1168|0;c[5713]=e[p>>1];c[5714]=c[p+8>>2];c[5715]=c[p+4>>2];p=e[p+2>>1]|0;c[5716]=p<<8&64768|p<<12&15728640;h=h+1136|0;c[5709]=e[h>>1];c[5710]=c[h+8>>2];c[5711]=c[h+4>>2];h=e[h+2>>1]|0;c[5712]=h<<8&65280|h<<12&15728640;h=1;break b}case 3:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&8|0:0){x=1310;break a}h=c[5632]|0;if(h&4095|0){x=2302;break a}i=Ge(c[4202123]|0,h,0)|0;if(!i){x=2302;break a}if(!(c[i+32>>2]|0)){x=2302;break a}h=(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))|0;if(!h){x=2302;break a}p=h+1088|0;b[p>>1]=c[5701];o=p+8|0;c[o>>2]=c[5702];c[o+4>>2]=0;c[p+4>>2]=c[5703];o=c[5704]|0;b[p+2>>1]=o>>>8&255|o>>>12&3840;p=h+1104|0;b[p>>1]=c[5705];o=p+8|0;c[o>>2]=c[5706];c[o+4>>2]=0;c[p+4>>2]=c[5707];o=c[5708]|0;b[p+2>>1]=o>>>8&255|o>>>12&3840;p=h+1168|0;b[p>>1]=c[5713];o=p+8|0;c[o>>2]=c[5714];c[o+4>>2]=0;c[p+4>>2]=c[5715];o=c[5716]|0;b[p+2>>1]=o>>>8&255|o>>>12&3840;h=h+1136|0;b[h>>1]=c[5709];p=h+8|0;c[p>>2]=c[5710];c[p+4>>2]=0;c[h+4>>2]=c[5711];p=c[5712]|0;b[h+2>>1]=p>>>8&255|p>>>12&3840;h=1;break b}case 4:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h){if(c[h+16>>2]&16|0){x=1322;break a}a[23072]=1;if((c[h+96>>2]&256|0)!=0?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1333;break a}else i=0}else{a[23072]=1;i=1;h=0}if(!(a[22971]|0)){h=1;break b}if(i)h=(c[5647]|0)>>>9&1&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=1;break b}else{x=1333;break a}}case 5:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+16>>2]&32|0:0){x=1339;break a}a[23072]=0;h=1;break b}case 7:{if(!(c[5764]&4096)){x=2303;break a}if(!(c[5732]&1)){x=2303;break a}if(a[22968]|0){x=2302;break a}h=c[5766]|0;i=(h|0)==0;if(!i?c[h+12>>2]&67108864|0:0){x=1346;break a}p=(c[5632]|0)>>>12;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p|1048576;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=(c[5761]|0)+j|0;c[5640]=p;c[5759]=0;c[5758]=0;c[5761]=p;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=1358;break a}if(!(a[22971]|0)){h=1;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=1;break b}else{x=1358;break a}}default:{x=2303;break a}}}case 4:{g=c[5766]|0;if(g|0?c[g>>2]&1|0:0){x=1375;break a}g=c[5732]|0;if((k&192|0)==192){h=22528+((k&7)<<2)|0;if(!(c[5755]&256)){c[h>>2]=g;h=1;break b}else{c[h>>2]=c[h>>2]&-65536|g&65535;h=1;break b}}else{h=Af(k)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=1;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=1;break b}}}case 6:{if(a[22968]|0){x=2302;break a}g=c[5766]|0;if(g|0?c[g>>2]&65536|0:0){x=1386;break a}do if((k&192|0)==192)g=c[22528+((k&7)<<2)>>2]|0;else{g=Af(k)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);i=c[5732]|0;g=i&-15|g&15;h=c[5766]|0;if((h|0?c[h+12>>2]&32|0:0)?(g^i)&-11|0:0){x=1401;break a}if((g^i)&-2147418111|0){i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0}c[5732]=g|16;h=(c[5761]|0)+(c[5758]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case 7:{if((k&192|0)==192){if((k&7|0)!=1){x=2303;break a}o=22976;o=xl(c[o>>2]|0,c[o+4>>2]|0,f|0,v|0)|0;p=c[5756]|0;p=yl(o|0,y|0,p|0,((p|0)<0)<<31>>31|0)|0;if(tg(p,y)|0){x=2304;break a}c[5633]=c[5763];h=1;break b}if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h+12>>2]&33554432|0:0){x=1410;break a}h=(Af(k)|0)>>>12;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;h=h|1048576;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;h=(c[5761]|0)+(c[5758]|0)|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=1;break b}default:{x=2303;break a}}}case 3:case 2:{if(!(c[5732]&1)){x=2303;break a}if(c[5647]&131072|0){x=2303;break a}g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]&65535;else{g=Af(g)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);if(!(ug((c[5755]|0)>>>8&1^1,o&1,i,g)|0)){h=o;break b}else{x=2304;break a}}case 32:{if(a[22968]|0){x=2302;break a}j=d[h>>0]|0;c[5758]=n+2;if((j&192|0)!=192){x=2303;break a}g=j>>>3;h=g&7;i=c[5766]|0;if(i|0?c[i>>2]&1<<h|0:0){x=1425;break a}switch(g&7){case 0:{g=22928;break}case 2:{g=22932;break}case 3:{g=22936;break}case 4:{g=22940;break}default:{x=2303;break a}}g=c[g>>2]|0;c[22528+((j&7)<<2)>>2]=g;h=32;break b}case 34:{if(a[22968]|0){x=2302;break a}h=d[h>>0]|0;m=n+2|0;c[5758]=m;if((h&192|0)!=192){x=2303;break a}i=h>>>3;g=i&7|16;j=c[5766]|0;k=(j|0)==0;if(!k?c[j>>2]&1<<g|0:0){x=1435;break a}g=c[22528+((h&7)<<2)>>2]|0;switch(i&7){case 0:{if((!k?c[j+12>>2]&32|0:0)?(c[5732]^g)&-11|0:0){x=1445;break a}if((c[5732]^g)&-2147418111|0){i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0}c[5732]=g|16;h=(c[5761]|0)+m|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case 2:{c[5733]=g;h=34;break b}case 3:{c[5734]=g;if((c[5732]|0)<0){i=c[5769]|0;if((i|0)>0){h=0;do{p=c[16800300+(h<<2)>>2]|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;p=p+1048576|0;c[23084+(p<<2)>>2]=-1;c[8411692+(p<<2)>>2]=-1;h=h+1|0}while((h|0)!=(i|0))}c[5769]=0}h=(c[5761]|0)+m|0;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=o;break b}case 4:{c[5735]=g&292;h=34;break b}default:{x=2303;break a}}}case 6:{if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(h|0?c[h>>2]&65536|0:0){x=1458;break a}c[5732]=c[5732]&-25|16;h=o;break b}case 35:case 33:{if(a[22968]|0){x=2302;break a}h=d[h>>0]|0;c[5758]=n+2;j=h>>>3&7;if((j|1|0)==5){x=2303;break a}i=h&7;if(!(o&2)){h=c[5766]|0;if(h|0?c[h+4>>2]&1<<j|0:0){x=1470;break a}wg(q,j);c[22528+(i<<2)>>2]=c[q>>2];h=o;break b}else{g=c[5766]|0;if(g|0?c[g+4>>2]&1<<(j|16)|0:0){x=1465;break a}g=c[22528+(i<<2)>>2]|0;vg(j,g);h=o;break b}}case -75:case -76:case -78:{h=d[h>>0]|0;c[5758]=n+2;if((h&192|0)==192){x=2303;break a}if(!(Df(o&7,h>>>3&7,Af(h)|0)|0)){h=o;break b}else{x=2304;break a}}case -94:{h=c[5766]|0;if(h|0?c[h+12>>2]&262144|0:0){x=1475;break a}xg();h=162;break b}case -92:{h=d[h>>0]|0;i=n+2|0;c[5758]=i;m=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){p=a[i>>0]|0;c[5758]=n+3;k=22528+((h&7)<<2)|0;h=c[k>>2]|0;p=p&31;j=p&255;i=m>>>(32-j|0)|h<<j;if(p<<24>>24){c[5641]=h<<j+-1;c[5642]=i;c[5643]=17;h=i}c[k>>2]=h;h=164;break b}k=Af(h)|0;j=c[5758]|0;h=a[j>>0]|0;c[5758]=j+1;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;p=h&31;h=p&255;g=i<<h|m>>>(32-h|0);if(!(p<<24>>24))g=i;else{c[5641]=i<<h+-1;c[5642]=g;c[5643]=17}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=164;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=164;break b}}case -91:{h=d[h>>0]|0;c[5758]=n+2;n=c[22528+((h>>>3&7)<<2)>>2]|0;m=c[5633]|0;if((h&192|0)==192){k=22528+((h&7)<<2)|0;h=c[k>>2]|0;j=m&31;i=h<<j|n>>>(32-j|0);if(j){c[5641]=h<<j+-1;c[5642]=i;c[5643]=17;h=i}c[k>>2]=h;h=165;break b}k=Af(h)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;h=m&31;g=i<<h|n>>>(32-h|0);if(!h)g=i;else{c[5641]=i<<h+-1;c[5642]=g;c[5643]=17}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=165;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=165;break b}}case -84:{h=d[h>>0]|0;i=n+2|0;c[5758]=i;m=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){p=a[i>>0]|0;c[5758]=n+3;k=22528+((h&7)<<2)|0;h=c[k>>2]|0;p=p&31;j=p&255;i=m<<32-j|h>>>j;if(p<<24>>24){c[5641]=h>>j+-1;c[5642]=i;c[5643]=20;h=i}c[k>>2]=h;h=172;break b}k=Af(h)|0;j=c[5758]|0;h=a[j>>0]|0;c[5758]=j+1;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;p=h&31;h=p&255;g=i>>>h|m<<32-h;if(!(p<<24>>24))g=i;else{c[5641]=i>>h+-1;c[5642]=g;c[5643]=20}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=172;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=172;break b}}case -83:{h=d[h>>0]|0;c[5758]=n+2;n=c[22528+((h>>>3&7)<<2)>>2]|0;m=c[5633]|0;if((h&192|0)==192){k=22528+((h&7)<<2)|0;h=c[k>>2]|0;j=m&31;i=h>>>j|n<<32-j;if(j){c[5641]=h>>j+-1;c[5642]=i;c[5643]=20;h=i}c[k>>2]=h;h=173;break b}k=Af(h)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;i=c[g>>2]|0;h=m&31;g=i>>>h|n<<32-h;if(!h)g=i;else{c[5641]=i>>h+-1;c[5642]=g;c[5643]=20}h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=173;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=173;break b}}case -70:{h=d[h>>0]|0;i=n+2|0;c[5758]=i;m=h>>>3;switch(m&7){case 4:{if((h&192|0)==192){g=c[22528+((h&7)<<2)>>2]|0;h=d[i>>0]|0;c[5758]=n+3}else{g=Af(h)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=i+g|0;g=c[g>>2]|0}c[5641]=g>>(h&31);c[5643]=20;h=186;break b}case 7:case 6:case 5:break;default:{x=2303;break a}}if((h&192|0)==192){i=a[i>>0]|0;c[5758]=n+3;j=22528+((h&7)<<2)|0;h=c[j>>2]|0;i=i&31;c[5641]=h>>i;i=1<<i;switch(m&3){case 1:{h=i|h;break}case 2:{h=h&~i;break}default:h=i^h}c[5643]=20;c[j>>2]=h;h=186;break b}k=Af(h)|0;j=c[5758]|0;i=a[j>>0]|0;c[5758]=j+1;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((g|k)&3)if(!(zf(k,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+k|0;h=c[g>>2]|0;g=i&31;c[5641]=h>>g;g=1<<g;switch(m&3){case 1:{g=h|g;break}case 2:{g=h&~g;break}default:g=h^g}c[5643]=20;h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((h|k)&3)if(!(Bf(k,g,2,2)|0)){h=186;break b}else{x=2304;break a}else{c[h+k>>2]=g;h=186;break b}}case -93:{g=d[h>>0]|0;c[5758]=n+2;i=c[22528+((g>>>3&7)<<2)>>2]|0;do if((g&192|0)!=192){g=(Af(g)|0)+(i>>5<<2)|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0)){g=23048;break}else{x=2304;break a}else{g=h+g|0;break}}else g=22528+((g&7)<<2)|0;while(0);g=c[g>>2]|0;c[5641]=g>>(i&31);c[5643]=20;h=163;break b}case -69:case -77:case -85:{h=d[h>>0]|0;c[5758]=n+2;k=c[22528+((h>>>3&7)<<2)>>2]|0;m=o>>>3;if((h&192|0)==192){j=22528+((h&7)<<2)|0;i=c[j>>2]|0;h=k&31;c[5641]=i>>h;h=1<<h;switch(m&3){case 1:{h=i|h;break}case 2:{h=i&~h;break}default:h=i^h}c[5643]=20;c[j>>2]=h;h=o;break b}j=(Af(h)|0)+(k>>5<<2)|0;i=j>>>12;g=c[8411692+(i+(c[5770]|0)<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;h=c[g>>2]|0;g=k&31;c[5641]=h>>g;g=1<<g;switch(m&3){case 1:{g=h|g;break}case 2:{g=h&~g;break}default:g=h^g}c[5643]=20;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,g,2,2)|0)){h=o;break b}else{x=2304;break a}else{c[h+j>>2]=g;h=o;break b}}case -67:case -68:{h=d[h>>0]|0;c[5758]=n+2;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);i=c[h>>2]|0;k=22528+(j<<2)|0;h=c[k>>2]|0;j=(i|0)==0;if(!(o&1)){if(!j)if(!(i&1)){h=0;while(1){h=h+1|0;if(!(i&2))i=i>>1;else{i=1;break}}}else{h=0;i=1}else i=0;c[5642]=i;c[5643]=14;c[k>>2]=h;h=o;break b}else{if(!j)if((i|0)>-1){h=31;do{h=h+-1|0;i=i<<1}while((i|0)>-1);i=1}else{h=31;i=1}else i=0;c[5642]=i;c[5643]=14;c[k>>2]=h;h=o;break b}}case -81:{h=d[h>>0]|0;c[5758]=n+2;j=h>>>3&7;do if((h&192|0)!=192){h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,2)|0)){h=23048;break}else{x=2304;break a}else{h=i+h|0;break}}else h=22528+((h&7)<<2)|0;while(0);m=c[h>>2]|0;h=22528+(j<<2)|0;p=c[h>>2]|0;n=Dl(((p|0)<0?0-p|0:p)|0,0,((m|0)<0?0-m|0:m)|0,0)|0;o=y;m=(p^m|0)>-1;p=m?n:0-n|0;c[5642]=p;c[5641]=(m?o:(n|0)==0?0-o|0:~o)-(p>>31);c[5643]=23;c[h>>2]=p;h=175;break b}case 49:{o=22976;o=xl(c[o>>2]|0,c[o+4>>2]|0,f|0,v|0)|0;p=c[5756]|0;p=yl(o|0,y|0,p|0,((p|0)<0)<<31>>31|0)|0;if(!(tg(p,y)|0)){h=49;break b}else{x=2304;break a}}case 51:{o=22976;o=xl(c[o>>2]|0,c[o+4>>2]|0,f|0,v|0)|0;p=c[5756]|0;p=yl(o|0,y|0,p|0,((p|0)<0)<<31>>31|0)|0;if(!(yg(p,y)|0)){h=51;break b}else{x=2304;break a}}case 48:{if(a[22968]|0){x=2302;break a}if(!(zg()|0)){h=48;break b}else{x=2304;break a}}case 50:{if(a[22968]|0){x=2302;break a}if(!(Ag()|0)){h=50;break b}else{x=2304;break a}}case -64:{g=d[h>>0]|0;c[5758]=n+2;j=g>>>3;if((g&192|0)==192){h=22528+((g&3)<<2)|0;p=g<<1&8;o=c[h>>2]>>p;g=o&255;n=22528+((j&3)<<2)|0;m=j<<1&8;k=c[n>>2]>>m;c[5641]=k&255;o=k+o<<24>>24;c[5642]=o;c[5643]=0;c[n>>2]=c[n>>2]&~(255<<m)|g<<m;c[h>>2]=c[h>>2]&~(255<<p)|(o&255)<<p;h=192;break b}n=Af(g)|0;h=n>>>12;i=8411692+((c[5770]|0)+h<<2)|0;g=c[i>>2]|0;if(!(g&1))g=d[g+n>>0]|0;else{if(zf(n,0,1,2)|0){x=2304;break a}g=c[5762]|0;i=8411692+((c[5770]|0)+h<<2)|0}m=22528+((j&3)<<2)|0;j=j<<1&8;k=c[m>>2]>>j;c[5641]=k&255;k=k+g<<24>>24;c[5642]=k;c[5643]=0;h=c[i>>2]|0;if(h&1){if(Bf(n,k,0,2)|0){x=2304;break a}}else a[h+n>>0]=k;c[m>>2]=c[m>>2]&~(255<<j)|(g&255)<<j;h=192;break b}case -63:{g=d[h>>0]|0;c[5758]=n+2;j=g>>>3&7;if((g&192|0)==192){h=22528+((g&7)<<2)|0;g=c[h>>2]|0;o=22528+(j<<2)|0;p=c[o>>2]|0;c[5641]=p;p=p+g|0;c[5642]=p;c[5643]=2;c[o>>2]=g;c[h>>2]=p;h=193;break b}k=Af(g)|0;g=k>>>12;h=8411692+((c[5770]|0)+g<<2)|0;i=c[h>>2]|0;if(!((i|k)&3))g=i+k|0;else{if(zf(k,2,1,2)|0){x=2304;break a}h=8411692+((c[5770]|0)+g<<2)|0;g=23048}g=c[g>>2]|0;i=22528+(j<<2)|0;j=c[i>>2]|0;c[5641]=j;j=j+g|0;c[5642]=j;c[5643]=2;h=c[h>>2]|0;if((h|k)&3){if(Bf(k,j,2,2)|0){x=2304;break a}}else c[h+k>>2]=j;c[i>>2]=g;h=193;break b}case -80:{g=d[h>>0]|0;c[5758]=n+2;m=g>>>3;if((g&192|0)==192){j=22528+((g&3)<<2)|0;h=g<<1&8;p=c[j>>2]>>h;g=p&255;i=c[5632]|0;c[5641]=g;p=i-p<<24;c[5642]=p>>24;c[5643]=6;if(!p){c[j>>2]=(c[22528+((m&3)<<2)>>2]>>(m<<1&8)&255)<<h|c[j>>2]&~(255<<h);h=176;break b}else{c[5632]=i&-256|g;h=176;break b}}k=Af(g)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if(!(g&1))g=d[g+k>>0]|0;else{if(zf(k,0,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5632]|0;c[5641]=g;p=h-g<<24;c[5642]=p>>24;c[5643]=6;if(p|0){c[5632]=h&-256|g&255;h=176;break b}i=c[22528+((m&3)<<2)>>2]>>(m<<1&8);h=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if(h&1)if(!(Bf(k,i&255,0,2)|0)){h=176;break b}else{x=2304;break a}else{a[h+k>>0]=i;h=176;break b}}case -79:{g=d[h>>0]|0;c[5758]=n+2;i=g>>>3&7;if((g&192|0)==192){h=22528+((g&7)<<2)|0;g=c[h>>2]|0;p=c[5632]|0;c[5641]=g;p=p-g|0;c[5642]=p;c[5643]=8;if(!p){c[h>>2]=c[22528+(i<<2)>>2];h=177;break b}else{c[5632]=g;h=177;break b}}j=Af(g)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((g|j)&3)if(!(zf(j,2,1,2)|0))g=23048;else{x=2304;break a}else g=g+j|0;g=c[g>>2]|0;p=c[5632]|0;c[5641]=g;p=p-g|0;c[5642]=p;c[5643]=8;if(p|0){c[5632]=g;h=177;break b}i=c[22528+(i<<2)>>2]|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&3)if(!(Bf(j,i,2,2)|0)){h=177;break b}else{x=2304;break a}else{c[h+j>>2]=i;h=177;break b}}case -57:{h=d[h>>0]|0;c[5758]=n+2;if(!((h&192|0)!=192&(h&56|0)==8)){x=2303;break a}if(!(Bg(Af(h)|0)|0)){h=199;break b}else{x=2304;break a}}case -88:case -96:{h=c[22740+((o>>>3&7)<<4)>>2]|0;i=(c[5636]|0)+-4|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&3){if(Bf(j,h,2,2)|0){x=2304;break a}}else c[k+j>>2]=h;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;h=o;break b}case -87:case -95:{g=(c[5729]&c[5636])+(c[5694]|0)|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))g=23048;else{x=2304;break a}else g=h+g|0;g=c[g>>2]|0;if(Cf(o>>>3&7,g&65535)|0){x=2304;break a}p=c[5636]|0;h=c[5729]|0;c[5636]=p&~h|p+4&h;h=o;break b}case -49:case -50:case -51:case -52:case -53:case -54:case -55:case -56:{h=22528+((o&7)<<2)|0;g=Kl(c[h>>2]|0)|0;c[h>>2]=g;h=o;break b}case 8:{if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(!h){h=8;break b}if(!(c[h+12>>2]&4194304)){h=8;break b}else{x=1659;break a}}case 9:{if(a[22968]|0){x=2302;break a}h=c[5766]|0;if(!h){h=9;break b}if(!(c[h+16>>2]&512)){h=9;break b}else{x=1663;break a}}case 31:case 30:case 29:case 28:case 27:case 26:case 25:{h=d[h>>0]|0;c[5758]=n+2;if((h&192|0)==192){h=o;break b}Af(h)|0;h=o;break b}default:{x=2303;break a}}while(0)}default:do switch(h|0){case 400:break b;case 393:{g=c[5758]|0;h=d[g>>0]|0;c[5758]=g+1;g=c[22528+((h>>>3&7)<<2)>>2]|0;if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=393;break b}h=Af(h)|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=393;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=393;break b}}case 395:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&7)<<2)>>2]|0;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=22528+((i>>>3&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=395;break b}case 447:case 446:case 445:case 444:case 443:case 442:case 441:case 440:{p=c[5758]|0;g=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;p=22528+((h&7)<<2)|0;c[p>>2]=c[p>>2]&-65536|g;break b}case 417:{j=c[5755]|0;i=c[5758]|0;h=d[i+1>>0]<<8|d[i>>0];g=i+2|0;if(!(j&128)){h=d[g>>0]<<16|h|d[i+3>>0]<<24;g=i+4|0}c[5758]=g;g=j&15;g=(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)+h|0;h=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((h|g)&1))g=e[h+g>>1]|0;else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5632]=c[5632]&-65536|g&65535;h=417;break b}case 419:{k=c[5755]|0;j=c[5758]|0;i=d[j+1>>0]<<8|d[j>>0];h=j+2|0;if(!(k&128)){i=d[h>>0]<<16|i|d[j+3>>0]<<24;h=j+4|0}c[5758]=h;h=k&15;h=(c[22740+(((h|0)==0?3:h+-1|0)<<4)+4>>2]|0)+i|0;i=c[5632]|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((j|h)&1)if(!(Bf(h,i,1,2)|0)){h=419;break b}else{x=2304;break a}else{b[j+h>>1]=i;h=419;break b}}case 455:{g=c[5758]|0;h=d[g>>0]|0;i=g+1|0;c[5758]=i;if((h&192|0)==192){p=d[g+2>>0]<<8|d[i>>0];c[5758]=g+3;g=22528+((h&7)<<2)|0;c[g>>2]=c[g>>2]&-65536|p;g=p;h=455;break b}h=Af(h)|0;i=c[5758]|0;g=d[i+1>>0]<<8|d[i>>0];c[5758]=i+2;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1)if(!(Bf(h,g,1,2)|0)){h=455;break b}else{x=2304;break a}else{b[i+h>>1]=g;h=455;break b}}case 407:case 406:case 405:case 404:case 403:case 402:case 401:{g=c[5632]|0;p=22528+((h&7)<<2)|0;c[5632]=c[p>>2]&65535|g&-65536;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case 391:{j=c[5758]|0;g=d[j>>0]|0;c[5758]=j+1;j=g>>>3&7;do if((g&192|0)!=192){k=Af(g)|0;h=k>>>12;i=8411692+((c[5770]|0)+h<<2)|0;g=c[i>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0;i=8411692+((c[5770]|0)+h<<2)|0}h=22528+(j<<2)|0;j=c[h>>2]|0;i=c[i>>2]|0;if((i|k)&1)if(!(Bf(k,j,1,2)|0))break;else{x=2304;break a}else{b[i+k>>1]=j;break}}else{p=22528+((g&7)<<2)|0;g=c[p>>2]|0;h=22528+(j<<2)|0;c[p>>2]=c[h>>2]&65535|g&-65536}while(0);c[h>>2]=c[h>>2]&-65536|g&65535;h=391;break b}case 453:case 452:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;if((i&192|0)==192){x=2303;break a}p=Af(i)|0;if(!(Cg((h|0)==452?0:3,i>>>3&7,p)|0))break b;else{x=2304;break a}}case 313:case 305:case 297:case 289:case 281:case 273:case 265:case 257:{j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;m=c[22528+((i>>>3&7)<<2)>>2]|0;if((i&192|0)==192){p=22528+((i&7)<<2)|0;o=c[p>>2]|0;c[p>>2]=(mf(22528,j,o,m)|0)&65535|o&-65536;break b}k=Af(i)|0;i=k>>>12;g=(c[5770]|0)+i|0;if((j|0)==7){g=c[23084+(g<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=m;c[5642]=g-m<<16>>16;c[5643]=7;break b}g=c[8411692+(g<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=mf(22528,j,g,m)|0;i=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((i|k)&1)if(!(Bf(k,g,1,2)|0))break b;else{x=2304;break a}else{b[i+k>>1]=g;break b}}case 315:case 307:case 299:case 291:case 283:case 275:case 267:case 259:{k=c[5758]|0;i=d[k>>0]|0;c[5758]=k+1;k=h>>>3&7;m=i>>>3&7;do if((i&192|0)==192)i=c[22528+((i&7)<<2)>>2]|0;else{i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!((j|i)&1)){i=e[j+i>>1]|0;break}if(zf(i,1,0,2)|0){x=2304;break a}i=c[5762]|0}while(0);p=22528+(m<<2)|0;o=c[p>>2]|0;c[p>>2]=(mf(22528,k,o,i)|0)&65535|o&-65536;break b}case 317:case 309:case 301:case 293:case 285:case 277:case 269:case 261:{p=c[5758]|0;o=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;p=c[5632]|0;c[5632]=(mf(22528,h>>>3&7,p,o)|0)&65535|p&-65536;break b}case 385:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=d[h+2>>0]<<8|d[j>>0];c[5758]=h+3;h=22528+((i&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(mf(22528,k,p,o)|0)&65535|p&-65536;h=385;break b}j=Af(i)|0;h=c[5758]|0;i=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=j>>>12;g=(c[5770]|0)+h|0;if((k|0)==7){g=c[23084+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=i;c[5642]=g-i<<16>>16;c[5643]=7;h=385;break b}g=c[8411692+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=mf(22528,k,g,i)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=385;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=385;break b}}case 387:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=a[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(mf(22528,k,p,o)|0)&65535|p&-65536;h=387;break b}j=Af(i)|0;h=c[5758]|0;i=a[h>>0]|0;c[5758]=h+1;h=j>>>12;g=(c[5770]|0)+h|0;if((k|0)==7){g=c[23084+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,0,2)|0){x=2304;break a}g=c[5762]|0}c[5641]=i;c[5642]=g-i<<16>>16;c[5643]=7;h=387;break b}g=c[8411692+(g<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=mf(22528,k,g,i)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=387;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=387;break b}}case 327:case 326:case 325:case 324:case 323:case 322:case 321:case 320:{i=22528+((h&7)<<2)|0;j=c[i>>2]|0;k=c[5643]|0;if((k|0)<25){c[5645]=k;c[5644]=c[5642]}p=(j<<16)+65536>>16;c[5642]=p;c[5643]=26;c[i>>2]=p&65535|j&-65536;break b}case 335:case 334:case 333:case 332:case 331:case 330:case 329:case 328:{i=22528+((h&7)<<2)|0;j=c[i>>2]|0;k=c[5643]|0;if((k|0)<25){c[5645]=k;c[5644]=c[5642]}p=(j<<16)+-65536>>16;c[5642]=p;c[5643]=29;c[i>>2]=p&65535|j&-65536;break b}case 363:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)==192)h=c[22528+((h&7)<<2)>>2]|0;else{h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!((i|h)&1)){h=e[i+h>>1]|0;break}if(zf(h,1,0,2)|0){x=2304;break a}h=c[5762]|0}while(0);p=c[5758]|0;n=a[p>>0]|0;c[5758]=p+1;p=22528+(j<<2)|0;o=c[p>>2]&-65536;h=N(h<<16>>16,n)|0;n=h<<16>>16;c[5642]=n;c[5641]=(h|0)!=(n|0)&1;c[5643]=22;c[p>>2]=o|h&65535;h=363;break b}case 361:{j=c[5758]|0;h=d[j>>0]|0;c[5758]=j+1;j=h>>>3&7;do if((h&192|0)==192)h=c[22528+((h&7)<<2)>>2]|0;else{h=Af(h)|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!((i|h)&1)){h=e[i+h>>1]|0;break}if(zf(h,1,0,2)|0){x=2304;break a}h=c[5762]|0}while(0);p=c[5758]|0;n=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;p=22528+(j<<2)|0;o=c[p>>2]&-65536;h=N(n<<16>>16,h<<16>>16)|0;n=h<<16>>16;c[5642]=n;c[5641]=(h|0)!=(n|0)&1;c[5643]=22;c[p>>2]=h&65535|o;h=361;break b}case 389:{p=c[5758]|0;i=d[p>>0]|0;c[5758]=p+1;do if((i&192|0)==192)g=c[22528+((i&7)<<2)>>2]|0;else{g=Af(i)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5642]=(c[22528+((i>>>3&7)<<2)>>2]&g)<<16>>16;c[5643]=13;h=389;break b}case 425:{p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;c[5642]=(h&c[5632])<<16>>16;c[5643]=13;h=425;break b}case 503:{o=c[5758]|0;p=a[o>>0]|0;h=p&255;c[5758]=o+1;switch((p&255)>>>3&7){case 0:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=c[5758]|0;h=d[p+1>>0]<<8|d[p>>0];c[5758]=p+2;c[5642]=(h&g)<<16>>16;c[5643]=13;h=503;break b}case 2:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;c[h>>2]=c[h>>2]^65535;h=503;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}g=~g;h=c[h>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=503;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=503;break b}}case 3:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[5641]=p;o=0-(p<<16)>>16;c[5642]=o;c[5643]=7;c[h>>2]=o&65535|p&-65536;h=503;break b}j=Af(h)|0;i=j>>>12;h=8411692+((c[5770]|0)+i<<2)|0;g=c[h>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0;h=8411692+((c[5770]|0)+i<<2)|0}c[5641]=g;g=0-(g<<16)>>16;c[5642]=g;c[5643]=7;h=c[h>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=503;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=503;break b}}case 4:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=c[5632]|0;g=N(p&65535,g&65535)|0;h=g>>>16;c[5641]=h;c[5642]=g<<16>>16;c[5643]=22;c[5632]=g&65535|p&-65536;c[5634]=c[5634]&-65536|h;h=503;break b}case 5:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5632]|0;g=N(h<<16>>16,g<<16>>16)|0;p=g<<16>>16;c[5642]=p;c[5641]=(g|0)!=(p|0)&1;c[5643]=22;c[5632]=g&65535|h&-65536;c[5634]=c[5634]&-65536|g>>>16;h=503;break b}case 6:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5634]|0;i=c[5632]|0;j=i&65535|h<<16;k=g&65535;if((h&65535)>>>0>=k>>>0){x=1839;break a}o=(j|0)/(k|0)|0;p=j-(N(o,k)|0)|0;c[5632]=o&65535|i&-65536;c[5634]=p&65535|h&-65536;h=503;break b}case 7:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=c[5634]|0;i=c[5632]|0;j=i&65535|h<<16;p=g<<16;k=p>>16;if(!p){x=1847;break a}m=(j|0)/(k|0)|0;if((m<<16>>16|0)!=(m|0)){x=1849;break a}p=j-(N(m,k)|0)|0;c[5632]=m&65535|i&-65536;c[5634]=p&65535|h&-65536;h=503;break b}default:{x=2303;break a}}}case 449:{h=c[5758]|0;i=d[h>>0]|0;j=h+1|0;c[5758]=j;k=i>>>3&7;if((i&192|0)==192){o=d[j>>0]|0;c[5758]=h+2;h=22528+((i&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(Dg(k,p,o)|0)&65535|p&-65536;h=449;break b}j=Af(i)|0;i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=Dg(k,g,h)|0;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=449;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=449;break b}}case 465:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(Dg(i,p,1)|0)&65535|p&-65536;h=465;break b}j=Af(h)|0;h=j>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=Dg(i,g,1)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=465;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=465;break b}}case 467:{i=c[5758]|0;h=d[i>>0]|0;c[5758]=i+1;i=h>>>3&7;j=c[5633]&255;if((h&192|0)==192){h=22528+((h&7)<<2)|0;p=c[h>>2]|0;c[h>>2]=(Dg(i,p,j)|0)&65535|p&-65536;h=467;break b}k=Af(h)|0;h=k>>>12;g=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0}g=Dg(i,g,j)|0;h=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((h|k)&1)if(!(Bf(k,g,1,2)|0)){h=467;break b}else{x=2304;break a}else{b[h+k>>1]=g;h=467;break b}}case 408:{h=c[5632]|0;c[5632]=h<<24>>24&65535|h&-65536;h=408;break b}case 409:{c[5634]=c[5632]<<16>>31&65535|c[5634]&-65536;h=409;break b}case 343:case 342:case 341:case 340:case 339:case 338:case 337:case 336:{i=c[22528+((h&7)<<2)>>2]|0;j=(c[5636]|0)+-2|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&1){if(Bf(k,i,1,2)|0){x=2304;break a}}else b[m+k>>1]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break b}case 351:case 350:case 349:case 348:case 347:case 346:case 345:case 344:{i=c[5636]|0;k=c[5729]|0;g=(k&i)+(c[5694]|0)|0;j=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((j|g)&1)){g=e[j+g>>1]|0;j=k}else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0;j=c[5729]|0;i=c[5636]|0}c[5636]=i&~j|i+2&j;p=22528+((h&7)<<2)|0;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case 352:if(!(Eg()|0)){h=352;break b}else{x=2304;break a}case 353:if(!(Fg()|0)){h=353;break b}else{x=2304;break a}case 399:{h=c[5758]|0;k=d[h>>0]|0;c[5758]=h+1;h=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|h)&1)){j=0;g=e[i+h>>1]|0}else{p=(zf(h,1,0,2)|0)==0;j=(p^1)<<31>>31;g=p?c[5762]|0:g}h=(j|0)!=0;if((k&192|0)==192){if(h){x=2304;break a}p=c[5636]|0;h=c[5729]|0;c[5636]=p&~h|p+2&h;h=22528+((k&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|g&65535;h=399;break b}if(h){x=2304;break a}i=c[5636]|0;j=c[5729]|0;j=i&~j|i+2&j;c[5636]=j;h=Af(k)|0;c[5636]=i;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1){if(Bf(h,g,1,2)|0){x=2304;break a}}else b[i+h>>1]=g;c[5636]=j;h=399;break b}case 360:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=(c[5636]|0)+-2|0;i=(h&c[5729])+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&1){if(Bf(i,g,1,2)|0){x=2304;break a}}else b[j+i>>1]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=360;break b}case 362:{i=c[5758]|0;h=a[i>>0]|0;g=h<<24>>24;c[5758]=i+1;i=(c[5636]|0)+-2|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&1){if(Bf(j,g,1,2)|0){x=2304;break a}}else b[k+j>>1]=h<<24>>24;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;h=362;break b}case 456:{n=c[5758]|0;o=d[n+1>>0]<<8|d[n>>0];p=n+2|0;c[5758]=p;p=d[p>>0]|0;c[5758]=n+3;if(!(Gg(o,p)|0)){h=456;break b}else{x=2304;break a}}case 457:if(!(Hg()|0)){h=457;break b}else{x=2304;break a}case 286:case 278:case 270:case 262:{i=c[22740+((h>>>3&3)<<4)>>2]|0;j=(c[5636]|0)+-2|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&1){if(Bf(k,i,1,2)|0){x=2304;break a}}else b[m+k>>1]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break b}case 287:case 279:case 263:{g=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1))g=e[i+g>>1]|0;else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}i=h>>>3&3;if(Cf(i,g)|0){x=2304;break a}o=c[5636]|0;p=c[5729]|0;c[5636]=o&~p|o+2&p;if((i|0)==2){x=1922;break a}else break b}case 397:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}c[5755]=c[5755]&-16|11;p=Af(h)|0;h=22528+((h>>>3&7)<<2)|0;c[h>>2]=c[h>>2]&-65536|p&65535;h=397;break b}case 511:{j=c[5758]|0;p=a[j>>0]|0;h=p&255;c[5758]=j+1;j=h&56;switch((p&255)>>>3&7){case 0:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;i=c[h>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<16)+65536>>16;c[5642]=p;c[5643]=26;c[h>>2]=p&65535|i&-65536;h=511;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<16)+65536>>16;c[5642]=g;c[5643]=26;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=511;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=511;break b}}case 1:{if((h&192|0)==192){h=22528+((h&7)<<2)|0;i=c[h>>2]|0;j=c[5643]|0;if((j|0)<25){c[5645]=j;c[5644]=c[5642]}p=(i<<16)+-65536>>16;c[5642]=p;c[5643]=29;c[h>>2]=p&65535|i&-65536;h=511;break b}j=Af(h)|0;i=j>>>12;g=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if(!((g|j)&1))g=e[g+j>>1]|0;else{if(zf(j,1,1,2)|0){x=2304;break a}g=c[5762]|0}h=c[5643]|0;if((h|0)<25){c[5645]=h;c[5644]=c[5642]}g=(g<<16)+-65536>>16;c[5642]=g;c[5643]=29;h=c[8411692+((c[5770]|0)+i<<2)>>2]|0;if((h|j)&1)if(!(Bf(j,g,1,2)|0)){h=511;break b}else{x=2304;break a}else{b[h+j>>1]=g;h=511;break b}}case 2:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]&65535;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=(c[5761]|0)+(c[5758]|0)|0;i=(c[5636]|0)+-2|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&1){if(Bf(j,h,1,2)|0){x=2304;break a}}else b[k+j>>1]=h;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=511;break b}case 4:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]&65535;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=511;break b}case 6:{do if((h&192|0)==192)g=c[22528+((h&7)<<2)>>2]|0;else{g=Af(h)|0;h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((h|g)&1)){g=e[h+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);h=(c[5636]|0)+-2|0;i=(h&c[5729])+(c[5694]|0)|0;j=c[8411692+((i>>>12)+(c[5770]|0)<<2)>>2]|0;if((j|i)&1){if(Bf(i,g,1,2)|0){x=2304;break a}}else b[j+i>>1]=g;p=c[5729]|0;c[5636]=c[5636]&~p|p&h;h=511;break b}case 5:case 3:{if((h&192|0)==192){x=2303;break a}i=Af(h)|0;h=c[5770]|0;g=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((g|i)&1))g=e[g+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}g=c[5762]|0;h=c[5770]|0}i=i+2|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0){x=2304;break a}h=c[5762]|0}i=(c[5761]|0)+(c[5758]|0)|0;if((j|0)==24){if(Mf(0,h,g,i)|0){x=2304;break a}}else if(Nf(h,g,i)|0){x=2304;break a}c[5759]=0;c[5758]=0;c[5761]=c[5640];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2002;break a}if(!(a[22971]|0)){h=511;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=511;break b}else{x=2002;break a}}default:{x=2303;break a}}}case 491:{h=c[5758]|0;g=a[h>>0]|0;h=g+(h+1)+(c[5761]|0)&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=491;break b}case 489:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0];h=(c[5761]|0)+(h+2)+g&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=489;break b}case 383:case 382:case 381:case 380:case 379:case 378:case 377:case 376:case 375:case 374:case 373:case 372:case 371:case 370:case 369:case 368:{p=c[5758]|0;g=a[p>>0]|0;c[5758]=p+1;if(!(qg(h&15)|0))break b;p=(c[5758]|0)+g+(c[5761]|0)&65535;c[5640]=p;c[5759]=0;c[5758]=0;c[5761]=p;break b}case 450:{h=c[5758]|0;k=d[h+1>>0]<<8|d[h>>0];c[5758]=h+2;h=c[5636]|0;j=c[5729]|0;g=(j&h)+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;i=j}else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0;i=c[5729]|0;h=c[5636]|0}c[5636]=k+2+h&i|h&~i;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=450;break b}case 451:{h=c[5636]|0;j=c[5729]|0;g=(j&h)+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;i=j}else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0;i=c[5729]|0;h=c[5636]|0}c[5636]=h&~i|h+2&i;c[5640]=g;c[5759]=0;c[5758]=0;c[5761]=g;h=451;break b}case 488:{h=c[5758]|0;g=d[h+1>>0]<<8|d[h>>0];h=h+2|0;c[5758]=h;h=(c[5761]|0)+h|0;i=(c[5636]|0)+-2|0;j=(i&c[5729])+(c[5694]|0)|0;k=c[8411692+((j>>>12)+(c[5770]|0)<<2)>>2]|0;if((k|j)&1){if(Bf(j,h,1,2)|0){x=2304;break a}}else b[k+j>>1]=h;h=c[5729]|0;c[5636]=c[5636]&~h|h&i;h=(c[5758]|0)+g+(c[5761]|0)&65535;c[5640]=h;c[5759]=0;c[5758]=0;c[5761]=h;h=488;break b}case 354:{p=c[5758]|0;h=d[p>>0]|0;c[5758]=p+1;if((h&192|0)==192){x=2303;break a}if(!(Ig(h>>>3&7,Af(h)|0)|0)){h=354;break b}else{x=2304;break a}}case 421:{h=Jg()|0;if((h|0)<0){x=2304;break a}if(!h){h=421;break b}c[5758]=c[5760];h=421;break b}case 423:{h=Kg()|0;if((h|0)<0){x=2304;break a}if(!h){h=423;break b}c[5758]=c[5760];h=423;break b}case 429:{h=Lg()|0;if((h|0)<0){x=2304;break a}if(!h){h=429;break b}c[5758]=c[5760];h=429;break b}case 431:{h=Mg()|0;if((h|0)<0){x=2304;break a}if(!h){h=431;break b}c[5758]=c[5760];h=431;break b}case 427:{h=Ng()|0;if((h|0)<0){x=2304;break a}if(!h){h=427;break b}c[5758]=c[5760];h=427;break b}case 365:{h=Og()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2052;break a}if(!(a[22971]|0)){h=365;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=365;break b}else{x=2052;break a}}case 367:{h=Pg()|0;if((h|0)<0){x=2304;break a}if(h|0)c[5758]=c[5760];h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2067;break a}if(!(a[22971]|0)){h=367;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=367;break b}else{x=2067;break a}}case 485:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,1,0)|0){x=2304;break a}c[5632]=c[5632]&-65536|(Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0)&65535;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2080;break a}if(!(a[22971]|0)){h=485;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=485;break b}else{x=2080;break a}}case 487:{o=c[5758]|0;p=a[o>>0]|0;g=p&255;c[5758]=o+1;if(ig(p&255,1,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&65535,1);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2093;break a}if(!(a[22971]|0)){h=487;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=487;break b}else{x=2093;break a}}case 493:{p=c[5634]|0;g=p&65535;if(ig(p&65535,1,0)|0){x=2304;break a}c[5632]=c[5632]&-65536|(Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0)&65535;h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2106;break a}if(!(a[22971]|0)){h=493;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=493;break b}else{x=2106;break a}}case 495:{p=c[5634]|0;g=p&65535;if(ig(p&65535,1,1)|0){x=2304;break a}gb[c[16808516>>2]&63](c[4202130]|0,g,c[5632]&65535,1);h=c[5766]|0;i=(h|0)==0;if((!i?c[h+96>>2]&256|0:0)?(c[5647]&512|0)!=0&(a[22970]|0)==0:0){x=2120;break a}if(!(a[22971]|0)){h=495;break b}if(i)h=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[h+96>>2]&16777216))h=c[5647]|0;else h=c[(c[5767]|0)+1392>>2]|0;h=h>>>9&1}if(!h){h=495;break b}else{x=2120;break a}}case 355:case 483:case 482:case 481:case 480:case 490:case 413:case 412:case 410:case 459:case 458:case 463:case 494:case 492:case 486:case 484:case 471:case 460:case 454:case 439:case 438:case 437:case 436:case 435:case 434:case 433:case 432:case 411:case 398:case 396:case 394:case 392:case 390:case 386:case 384:case 430:case 428:case 426:case 422:case 420:case 366:case 364:case 469:case 468:case 319:case 311:case 303:case 295:case 500:case 415:case 414:case 507:case 506:case 509:case 508:case 470:case 505:case 504:case 501:case 462:case 461:case 510:case 466:case 464:case 448:case 502:case 424:case 388:case 479:case 478:case 477:case 476:case 475:case 474:case 473:case 472:case 418:case 416:case 316:case 308:case 300:case 292:case 284:case 276:case 268:case 260:case 314:case 306:case 298:case 290:case 282:case 274:case 266:case 258:case 312:case 304:case 296:case 288:case 280:case 272:case 264:case 256:case 357:case 356:case 318:case 310:case 302:case 294:case 499:case 498:case 496:case 359:case 358:{c[5757]=c[5756];c[5756]=1;h=h&255;break b}case 271:{k=c[5758]|0;p=a[k>>0]|0;o=p&255;i=k+1|0;c[5758]=i;h=o|256;do switch(p<<24>>24){case -113:case -114:case -115:case -116:case -117:case -118:case -119:case -120:case -121:case -122:case -123:case -124:case -125:case -126:case -127:case -128:{g=d[k+2>>0]<<8|d[i>>0];c[5758]=k+3;if(!(qg(o&15)|0))break b;p=(c[5758]|0)+g+(c[5761]|0)&65535;c[5640]=p;c[5759]=0;c[5758]=0;c[5761]=p;break b}case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:{j=d[i>>0]|0;c[5758]=k+2;do if((j&192|0)==192)g=c[22528+((j&7)<<2)>>2]|0;else{g=Af(j)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);i=22528+((j>>>3&7)<<2)|0;if(!(qg(o&15)|0))break b;c[i>>2]=c[i>>2]&-65536|g&65535;break b}case -74:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(i&1)){g=d[i+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=22528+(j<<2)|0;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case -66:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&3)<<2)>>2]>>(g<<1&8)&255;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!(i&1)){g=d[i+g>>0]|0;break}if(zf(g,0,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=22528+(j<<2)|0;c[p>>2]=g<<24>>24&65535|c[p>>2]&-65536;break b}case -65:case -73:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]|0;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);p=22528+(j<<2)|0;c[p>>2]=c[p>>2]&-65536|g&65535;break b}case -81:{i=d[i>>0]|0;c[5758]=k+2;k=i>>>3&7;do if((i&192|0)==192)i=c[22528+((i&7)<<2)>>2]|0;else{i=Af(i)|0;j=c[23084+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(!((j|i)&1)){i=e[j+i>>1]|0;break}if(zf(i,1,0,2)|0){x=2304;break a}i=c[5762]|0}while(0);p=22528+(k<<2)|0;o=c[p>>2]|0;n=N(o<<16>>16,i<<16>>16)|0;m=n<<16>>16;c[5642]=m;c[5641]=(n|0)!=(m|0)&1;c[5643]=22;c[p>>2]=n&65535|o&-65536;break b}case -63:{g=d[i>>0]|0;c[5758]=k+2;k=g>>>3&7;if((g&192|0)==192){p=22528+((g&7)<<2)|0;g=c[p>>2]|0;n=22528+(k<<2)|0;o=c[n>>2]|0;c[5641]=o;o=o+g<<16>>16;c[5642]=o;c[5643]=1;c[n>>2]=c[n>>2]&-65536|g&65535;c[p>>2]=c[p>>2]&-65536|o&65535;break b}m=Af(g)|0;j=m>>>12;i=8411692+((c[5770]|0)+j<<2)|0;g=c[i>>2]|0;if(!((g|m)&1))g=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}g=c[5762]|0;i=8411692+((c[5770]|0)+j<<2)|0}k=22528+(k<<2)|0;j=c[k>>2]|0;c[5641]=j;j=j+g<<16>>16;c[5642]=j;c[5643]=1;i=c[i>>2]|0;if((i|m)&1){if(Bf(m,j,1,2)|0){x=2304;break a}}else b[i+m>>1]=j;c[k>>2]=c[k>>2]&-65536|g&65535;break b}case -88:case -96:{i=c[22740+((o>>>3&7)<<4)>>2]|0;j=(c[5636]|0)+-2|0;k=(j&c[5729])+(c[5694]|0)|0;m=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if((m|k)&1){if(Bf(k,i,1,2)|0){x=2304;break a}}else b[m+k>>1]=i;p=c[5729]|0;c[5636]=c[5636]&~p|p&j;break b}case -87:case -95:{g=(c[5729]&c[5636])+(c[5694]|0)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1))g=e[i+g>>1]|0;else{if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}if(Cf(o>>>3&7,g)|0){x=2304;break a}o=c[5636]|0;p=c[5729]|0;c[5636]=o&~p|o+2&p;break b}case -75:case -76:case -78:{i=d[i>>0]|0;c[5758]=k+2;if((i&192|0)==192){x=2303;break a}if(!(Cg(o&7,i>>>3&7,Af(i)|0)|0))break b;else{x=2304;break a}}case -84:case -92:{i=d[i>>0]|0;j=k+2|0;c[5758]=j;p=c[22528+((i>>>3&7)<<2)>>2]|0;o=o>>>3&1;if((i&192|0)==192){j=a[j>>0]|0;c[5758]=k+3;m=22528+((i&7)<<2)|0;i=c[m>>2]|0;n=i&-65536;j=j&31;k=j&255;if(j<<24>>24){if(!o){p=p&65535;i=i<<16|p;c[5641]=i>>32-k;i=(((j&255)>16?p<<k+-16:0)|i<<k)>>16}else{i=i&65535|p<<16;c[5641]=i>>k+-1;i=(((j&255)>16?p<<32-k:0)|i>>k)<<16>>16}c[5642]=i;c[5643]=19}c[m>>2]=i&65535|n;break b}m=Af(i)|0;k=c[5758]|0;i=a[k>>0]|0;c[5758]=k+1;k=m>>>12;g=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if(!((g|m)&1))g=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}g=c[5762]|0}i=i&31;j=i&255;if(i<<24>>24){if(!o){p=p&65535;g=g<<16|p;c[5641]=g>>32-j;g=(g<<j|((i&255)>16?p<<j+-16:0))>>16}else{g=g&65535|p<<16;c[5641]=g>>j+-1;g=(g>>j|((i&255)>16?p<<32-j:0))<<16>>16}c[5642]=g;c[5643]=19}i=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if((i|m)&1)if(!(Bf(m,g,1,2)|0))break b;else{x=2304;break a}else{b[i+m>>1]=g;break b}}case -83:case -91:{i=d[i>>0]|0;c[5758]=k+2;p=c[22528+((i>>>3&7)<<2)>>2]|0;n=c[5633]|0;o=o>>>3&1;if((i&192|0)==192){k=22528+((i&7)<<2)|0;i=c[k>>2]|0;m=i&-65536;j=n&31;if(j){if(!o){p=p&65535;i=i<<16|p;c[5641]=i>>32-j;i=(i<<j|(j>>>0>16?p<<j+-16:0))>>16}else{i=i&65535|p<<16;c[5641]=i>>j+-1;i=(i>>j|(j>>>0>16?p<<32-j:0))<<16>>16}c[5642]=i;c[5643]=19}c[k>>2]=i&65535|m;break b}k=Af(i)|0;j=k>>>12;g=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if(!((g|k)&1))g=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}g=c[5762]|0}i=n&31;if(i){if(!o){p=p&65535;g=g<<16|p;c[5641]=g>>32-i;g=(g<<i|(i>>>0>16?p<<i+-16:0))>>16}else{g=g&65535|p<<16;c[5641]=g>>i+-1;g=(g>>i|(i>>>0>16?p<<32-i:0))<<16>>16}c[5642]=g;c[5643]=19}i=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((i|k)&1)if(!(Bf(k,g,1,2)|0))break b;else{x=2304;break a}else{b[i+k>>1]=g;break b}}case -70:{i=d[i>>0]|0;j=k+2|0;c[5758]=j;n=i>>>3;switch(n&7){case 4:{do if((i&192|0)==192){g=c[22528+((i&7)<<2)>>2]|0;i=d[j>>0]|0;c[5758]=k+3}else{g=Af(i)|0;j=c[5758]|0;i=d[j>>0]|0;c[5758]=j+1;j=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((j|g)&1)){g=e[j+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5641]=g>>(i&15);c[5643]=19;break b}case 7:case 6:case 5:break;default:{x=2303;break a}}if((i&192|0)==192){j=a[j>>0]|0;c[5758]=k+3;k=22528+((i&7)<<2)|0;i=c[k>>2]|0;m=i&-65536;j=j&15;c[5641]=i>>j;j=1<<j;switch(n&3){case 1:{i=j|i;break}case 2:{i=i&~j;break}default:i=j^i}c[5643]=19;c[k>>2]=i&65535|m;break b}m=Af(i)|0;k=c[5758]|0;j=a[k>>0]|0;c[5758]=k+1;k=m>>>12;g=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if(!((g|m)&1))i=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}i=c[5762]|0}g=j&15;c[5641]=i>>g;g=1<<g;switch(n&3){case 1:{g=i|g;break}case 2:{g=i&~g;break}default:g=i^g}c[5643]=19;i=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if((i|m)&1)if(!(Bf(m,g,1,2)|0))break b;else{x=2304;break a}else{b[i+m>>1]=g;break b}}case -93:{g=d[i>>0]|0;c[5758]=k+2;j=c[22528+((g>>>3&7)<<2)>>2]|0;do if((g&192|0)==192)g=c[22528+((g&7)<<2)>>2]|0;else{g=(Af(g)|0)+(j>>>3&8190)|0;i=c[23084+((g>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((i|g)&1)){g=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}g=c[5762]|0}while(0);c[5641]=g>>(j&15);c[5643]=19;break b}case -69:case -77:case -85:{i=d[i>>0]|0;c[5758]=k+2;n=c[22528+((i>>>3&7)<<2)>>2]|0;o=o>>>3;if((i&192|0)==192){k=22528+((i&7)<<2)|0;j=c[k>>2]|0;m=j&-65536;i=n&15;c[5641]=j>>i;i=1<<i;switch(o&3){case 1:{i=j|i;break}case 2:{i=j&~i;break}default:i=j^i}c[5643]=19;c[k>>2]=i&65535|m;break b}k=(Af(i)|0)+(n>>>3&8190)|0;j=k>>>12;g=c[8411692+(j+(c[5770]|0)<<2)>>2]|0;if(!((g|k)&1))i=e[g+k>>1]|0;else{if(zf(k,1,1,2)|0){x=2304;break a}i=c[5762]|0}g=n&15;c[5641]=i>>g;g=1<<g;switch(o&3){case 1:{g=i|g;break}case 2:{g=i&~g;break}default:g=i^g}c[5643]=19;i=c[8411692+((c[5770]|0)+j<<2)>>2]|0;if((i|k)&1)if(!(Bf(k,g,1,2)|0))break b;else{x=2304;break a}else{b[i+k>>1]=g;break b}}case -67:case -68:{g=d[i>>0]|0;c[5758]=k+2;j=g>>>3&7;do if((g&192|0)==192)k=c[22528+((g&7)<<2)>>2]|0;else{g=Af(g)|0;i=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){k=e[i+g>>1]|0;break}if(zf(g,1,0,2)|0){x=2304;break a}k=c[5762]|0}while(0);m=22528+(j<<2)|0;g=c[m>>2]|0;i=k&65535;j=(i|0)==0;if(!(o&1))if(!j)if(!(k&1)){g=0;while(1){g=g+1|0;if(!(i&2))i=i>>1;else{i=1;break}}}else{g=0;i=1}else i=0;else if(!j)if(!(k&32768)){g=15;while(1){g=g+-1|0;if(!(i&16384))i=i<<1;else{i=1;break}}}else{g=15;i=1}else i=0;c[5642]=i;c[5643]=14;c[m>>2]=c[m>>2]&-65536|g&65535;break b}case -79:{g=d[i>>0]|0;c[5758]=k+2;n=g>>>3&7;if((g&192|0)==192){i=22528+((g&7)<<2)|0;g=c[i>>2]|0;j=c[5632]|0;c[5641]=g;p=j-g<<16;c[5642]=p>>16;c[5643]=7;if(!p){c[i>>2]=c[22528+(n<<2)>>2]&65535|c[i>>2]&-65536;break b}else{c[5632]=j&-65536|g&65535;break b}}m=Af(g)|0;k=m>>>12;g=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if(!((g|m)&1))g=e[g+m>>1]|0;else{if(zf(m,1,1,2)|0){x=2304;break a}g=c[5762]|0}i=c[5632]|0;c[5641]=g;p=i-g<<16;c[5642]=p>>16;c[5643]=7;if(p|0){c[5632]=i&-65536|g&65535;break b}j=c[22528+(n<<2)>>2]|0;i=c[8411692+((c[5770]|0)+k<<2)>>2]|0;if((i|m)&1)if(!(Bf(m,j,1,2)|0))break b;else{x=2304;break a}else{b[i+m>>1]=j;break b}}case -49:case -50:case -51:case -52:case -53:case -54:case -55:case -56:{p=22528+((o&7)<<2)|0;g=Kl(c[p>>2]|0)|0;c[p>>2]=g;break b}case 31:case 30:case 29:case 28:case 27:case 26:case 25:case -57:case 9:case 8:case -80:case -97:case -98:case -99:case -100:case -101:case -102:case -103:case -104:case -105:case -106:case -107:case -108:case -109:case -110:case -111:case -112:case 50:case 48:case 51:case 49:case -94:case 35:case 33:case 6:case 34:case 32:case 3:case 2:case 1:case 0:{c[5758]=k;c[5757]=c[5756];c[5756]=1;h=15;break b}default:{x=2303;break a}}while(0)}default:{x=2303;break a}}while(0)}while(0)}c:switch(x|0){case 28:{x=2304;break}case 29:{switch(h&7){case 4:{x=2304;break c}case 5:{x=2302;break c}default:{}}l=z;return}case 154:{a[22970]=1;x=2301;break}case 359:{c[5746]=0;c[5747]=0;x=2304;break}case 367:{c[5746]=0;c[5747]=0;x=2304;break}case 369:{c[5746]=0;c[5747]=0;x=2304;break}case 414:{c[5746]=0;c[5747]=0;x=2304;break}case 422:{c[5746]=0;c[5747]=0;x=2304;break}case 425:{c[5746]=0;c[5747]=0;x=2304;break}case 428:{c[5746]=0;c[5747]=0;x=2304;break}case 544:{c[5746]=32;w=g+112|0;c[w>>2]=112;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 557:{c[5746]=32;w=g+112|0;c[w>>2]=113;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 580:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 590:{a[22970]=1;x=2301;break}case 702:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 719:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 813:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 826:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 839:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 842:{c[5746]=32;w=h+112|0;c[w>>2]=116;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 855:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 868:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 882:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 896:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 916:{g=c[5647]|0;if((g>>>12&3)>>>0<(d[22968]|0)>>>0)x=2302;else{c[5647]=g|512;a[22970]=1;x=2301}break}case 920:{if(!(a[22968]|0)){g=c[5766]|0;if(g|0?c[g+12>>2]&16777216|0:0){c[5746]=32;x=g+112|0;c[x>>2]=120;c[x+4>>2]=0;x=(c[5766]|0)+120|0;c[x>>2]=0;c[x+4>>2]=0;x=2304;break}a[22969]=1;x=2301}else x=2302;break}case 969:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 984:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 999:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1014:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1016:{c[5746]=7;c[5747]=0;x=2304;break}case 1021:{c[5746]=7;c[5747]=0;x=2304;break}case 1023:{c[5746]=16;c[5747]=0;x=2304;break}case 1036:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1049:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1062:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1075:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1088:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1101:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1114:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1127:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1186:{c[5746]=32;w=g+112|0;c[w>>2]=k|104;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1195:{c[5746]=32;w=h+112|0;c[w>>2]=g;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1207:{c[5746]=13;c[5747]=o;x=2304;break}case 1209:{c[5746]=13;c[5747]=o;x=2304;break}case 1218:{c[5746]=13;c[5747]=o;x=2304;break}case 1220:{c[5746]=11;c[5747]=o;x=2304;break}case 1237:{c[5746]=32;w=i+112|0;c[w>>2]=h;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1251:{c[5746]=32;w=h+112|0;c[w>>2]=128;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1274:{v=c[3662]|0;c[w>>2]=19603;c[w+4>>2]=2771;c[w+8>>2]=19618;nl(v,19558,w)|0;ra();break}case 1275:{c[5746]=13;c[5747]=0;x=f-(c[5756]|0)|0;w=22976;f=22976;c[f>>2]=xl(c[w>>2]|0,c[w+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;c[f+4>>2]=y;l=z;return}case 1289:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1290:{if(((c[5764]&4096|0)!=0?(u=c[5766]|0,(u|0)!=0):0)?(c[u+16>>2]&2|0)!=0:0){c[5746]=32;x=u+112|0;c[x>>2]=129;c[x+4>>2]=0;x=(c[5766]|0)+120|0;c[x>>2]=0;c[x+4>>2]=0;x=2304}else x=2303;break}case 1299:{c[5746]=32;w=h+112|0;c[w>>2]=130;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1310:{c[5746]=32;w=h+112|0;c[w>>2]=131;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1322:{c[5746]=32;w=h+112|0;c[w>>2]=132;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1333:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1339:{c[5746]=32;w=h+112|0;c[w>>2]=133;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1346:{c[5746]=32;w=h+112|0;c[w>>2]=122;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1358:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 1362:{c[5746]=32;w=h+112|0;c[w>>2]=g;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1375:{c[5746]=32;w=g+112|0;c[w>>2]=0;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1386:{c[5746]=32;w=g+112|0;c[w>>2]=16;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1401:{c[5746]=32;w=h+112|0;c[w>>2]=101;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1410:{c[5746]=32;w=h+112|0;c[w>>2]=121;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1425:{c[5746]=32;w=i+112|0;c[w>>2]=h;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1435:{c[5746]=32;w=j+112|0;c[w>>2]=g;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1445:{c[5746]=32;w=j+112|0;c[w>>2]=101;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1458:{c[5746]=32;w=h+112|0;c[w>>2]=16;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1465:{c[5746]=32;w=g+112|0;c[w>>2]=j|48;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1470:{c[5746]=32;w=h+112|0;c[w>>2]=j|32;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1475:{c[5746]=32;w=h+112|0;c[w>>2]=114;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1659:{c[5746]=32;w=h+112|0;c[w>>2]=118;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1663:{c[5746]=32;w=h+112|0;c[w>>2]=137;c[w+4>>2]=0;w=(c[5766]|0)+120|0;c[w>>2]=0;c[w+4>>2]=0;x=2304;break}case 1839:{c[5746]=0;c[5747]=0;x=2304;break}case 1847:{c[5746]=0;c[5747]=0;x=2304;break}case 1849:{c[5746]=0;c[5747]=0;x=2304;break}case 1922:{a[22970]=1;x=2301;break}case 2002:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2052:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2067:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2080:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2093:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2106:{c[5756]=(c[5756]|0)+-1;x=2301;break}case 2120:{c[5756]=(c[5756]|0)+-1;x=2301;break}}if((x|0)==2301){x=f-(c[5756]|0)|0;f=22976;x=xl(c[f>>2]|0,c[f+4>>2]|0,x|0,((x|0)<0)<<31>>31|0)|0;f=22976;c[f>>2]=x;c[f+4>>2]=y;c[5640]=(c[5761]|0)+(c[5758]|0);l=z;return}else if((x|0)==2302){c[5746]=13;c[5747]=0;x=2304}else if((x|0)==2303){c[5746]=6;c[5747]=0;x=2304}if((x|0)==2304)c[5640]=(c[5761]|0)+(c[5760]|0);x=(c[5746]|0)==32;w=f-(c[5756]|0)|0;f=22976;w=xl(c[f>>2]|0,c[f+4>>2]|0,w|0,((w|0)<0)<<31>>31|0)|0;f=22976;c[f>>2]=w;c[f+4>>2]=y;if(!x){l=z;return}c[5746]=-1;g=c[5766]|0;f=g+112|0;if((c[f>>2]|0)==123&(c[f+4>>2]|0)==0){f=g+128|0;c[f>>2]=(c[5761]|0)+(c[5758]|0);c[f+4>>2]=0}rf();l=z;return} +function rf(){var e=0,f=0,g=0,h=0;f=c[5766]|0;g=c[5767]|0;h=c[5748]|0;if((h|0)>-1){switch(a[22996]|0){case 1:{e=(h|0)==2?512:0;break}case 0:{e=768;break}default:e=1024}c[f+136>>2]=h|e|d[22997]<<11|-2147483648;c[(c[5766]|0)+140>>2]=c[5750];c[5748]=-1}else{c[f+136>>2]=0;c[(c[5766]|0)+140>>2]=0}c[f+104>>2]=d[22970];a[f+1227>>0]=a[22968]|0;e=c[5640]|0;h=f+1128|0;c[h>>2]=c[5718];c[h+4>>2]=0;c[f+1124>>2]=c[5719];h=f+1160|0;c[h>>2]=c[5722];c[h+4>>2]=0;c[f+1156>>2]=c[5723];h=f+1368|0;c[h>>2]=c[5732];c[h+4>>2]=0;h=f+1360|0;c[h>>2]=c[5734];c[h+4>>2]=0;h=f+1352|0;c[h>>2]=c[5735];c[h+4>>2]=0;h=f+1232|0;c[h>>2]=c[5764];c[h+4>>2]=0;h=f+1392|0;c[h>>2]=sf()|0;c[h+4>>2]=0;b[f+1024>>1]=c[5685];h=f+1032|0;c[h>>2]=c[5686];c[h+4>>2]=0;c[f+1028>>2]=c[5687];h=c[5688]|0;b[f+1026>>1]=h>>>8&255|h>>>12&3840;b[f+1040>>1]=c[5689];h=f+1048|0;c[h>>2]=c[5690];c[h+4>>2]=0;c[f+1044>>2]=c[5691];h=c[5692]|0;b[f+1042>>1]=h>>>8&255|h>>>12&3840;b[f+1056>>1]=c[5693];h=f+1064|0;c[h>>2]=c[5694];c[h+4>>2]=0;c[f+1060>>2]=c[5695];h=c[5696]|0;b[f+1058>>1]=h>>>8&255|h>>>12&3840;b[f+1072>>1]=c[5697];h=f+1080|0;c[h>>2]=c[5698];c[h+4>>2]=0;c[f+1076>>2]=c[5699];h=c[5700]|0;b[f+1074>>1]=h>>>8&255|h>>>12&3840;h=f+1400|0;c[h>>2]=e;c[h+4>>2]=0;h=f+1496|0;c[h>>2]=c[5636];c[h+4>>2]=0;h=f+1528|0;c[h>>2]=c[5632];c[h+4>>2]=0;h=f+1600|0;c[h>>2]=c[5733];c[h+4>>2]=0;h=f+1384|0;c[h>>2]=c[5740];c[h+4>>2]=0;f=f+1376|0;c[f>>2]=c[5741];c[f+4>>2]=0;tf(g,0);a[22968]=0;c[5770]=0;c[5741]=1024;f=c[5769]|0;if((f|0)<=0){c[5769]=0;c[5766]=0;c[5767]=0;a[23072]=0;a[22970]=0;return}e=0;do{h=c[16800300+(e<<2)>>2]|0;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;h=h+1048576|0;c[23084+(h<<2)>>2]=-1;c[8411692+(h<<2)>>2]=-1;e=e+1|0}while((e|0)!=(f|0));c[5769]=0;c[5766]=0;c[5767]=0;a[23072]=0;a[22970]=0;return}function sf(){var a=0,b=0,e=0;a=nf(22528)|0;if((c[5643]|0)==24){e=c[5641]|0;b=e>>>7&1;a=e&4|a|((c[5642]|0)==0&1)<<6}else{e=c[5642]|0;b=e>>>31;a=(d[21168+(e&255)>>0]|0)<<2|a|((e|0)==0&1)<<6}e=b<<7|a|(uf()|0)<<11;e=e|(vf()|0);return e|c[5646]&1024|c[5647]|0}function tf(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[5718]=c[a+1128>>2];c[5719]=c[a+1124>>2];c[5722]=c[a+1160>>2];c[5723]=c[a+1156>>2];c[5732]=c[a+1368>>2];c[5734]=c[a+1360>>2];c[5735]=c[a+1352>>2];c[5764]=c[a+1232>>2];m=c[a+1392>>2]|0;c[5641]=m&2261;c[5642]=m>>>6&1^1;c[5643]=24;c[5646]=1-(m>>>9&2);c[5647]=c[5647]&-4158209|m&4158208;c[5685]=e[a+1024>>1];m=a+1032|0;i=c[m>>2]|0;m=c[m+4>>2]|0;c[5686]=i;c[5687]=c[a+1028>>2];n=e[a+1026>>1]|0;c[5688]=n<<8&65280|n<<12&15728640;c[5689]=e[a+1040>>1];n=a+1048|0;j=c[n>>2]|0;n=c[n+4>>2]|0;c[5690]=j;c[5691]=c[a+1044>>2];d=e[a+1042>>1]|0;c[5692]=d<<8&65280|d<<12&15728640;c[5693]=e[a+1056>>1];l=a+1064|0;h=c[l>>2]|0;l=c[l+4>>2]|0;c[5694]=h;c[5695]=c[a+1060>>2];f=e[a+1058>>1]|0;c[5696]=f<<8&65280|f<<12&15728640;c[5697]=e[a+1072>>1];k=a+1080|0;g=c[k>>2]|0;k=c[k+4>>2]|0;c[5698]=g;c[5699]=c[a+1076>>2];o=e[a+1074>>1]|0;c[5700]=o<<8&65280|o<<12&15728640;f=f<<6&65536;c[5729]=(f^65536)+-1;c[5731]=(j|i|h|g|0)==0?f>>>16:0;c[5730]=(d&1024|0)==0?384:0;c[5640]=c[a+1400>>2];c[5636]=c[a+1496>>2];c[5632]=c[a+1528>>2];if(!b)return;c[5733]=c[a+1600>>2];c[5740]=c[a+1384>>2];c[5741]=c[a+1376>>2];return}function uf(){var a=0,b=0,d=0;do switch(c[5643]|0){case 0:{d=c[5642]|0;b=c[5641]|0;a=d-b|0;a=((a^d)&(b^128^a))>>>7&1;return a|0}case 1:{a=c[5642]|0;b=c[5641]|0;d=a-b|0;d=((d^a)&(b^32768^d))>>>15&1;return d|0}case 2:{a=c[5642]|0;b=c[5641]|0;d=a-b|0;d=((d^a)&(b^-2147483648^d))>>>31;return d|0}case 3:{a=c[5642]|0;b=c[5641]|0;d=a-b+-1|0;d=((d^a)&(b^128^d))>>>7&1;return d|0}case 4:{a=c[5642]|0;b=c[5641]|0;d=a-b+-1|0;d=((d^a)&(b^32768^d))>>>15&1;return d|0}case 5:{a=c[5642]|0;b=c[5641]|0;d=a-b+-1|0;d=((d^a)&(b^-2147483648^d))>>>31;return d|0}case 6:{d=c[5642]|0;a=c[5641]|0;b=a+d|0;d=((b^a)&(b^d))>>>7&1;return d|0}case 7:{d=c[5642]|0;a=c[5641]|0;b=a+d|0;d=((b^a)&(b^d))>>>15&1;return d|0}case 8:{d=c[5642]|0;a=c[5641]|0;b=a+d|0;d=((b^a)&(b^d))>>>31;return d|0}case 9:{d=c[5642]|0;a=c[5641]|0;b=d+1+a|0;d=((b^a)&(b^d))>>>7&1;return d|0}case 10:{d=c[5642]|0;a=c[5641]|0;b=d+1+a|0;d=((b^a)&(b^d))>>>15&1;return d|0}case 11:{d=c[5642]|0;a=c[5641]|0;b=d+1+a|0;d=((b^a)&(b^d))>>>31;return d|0}case 18:case 15:{d=(c[5642]^c[5641])>>>7&1;return d|0}case 19:case 16:{d=(c[5642]^c[5641])>>>15&1;return d|0}case 20:case 17:{d=(c[5642]^c[5641])>>>31;return d|0}case 23:case 22:case 21:{d=(c[5641]|0)!=0&1;return d|0}case 24:{d=(c[5641]|0)>>>11&1;return d|0}case 25:{d=(c[5642]&255|0)==128&1;return d|0}case 26:{d=(c[5642]&65535|0)==32768&1;return d|0}case 27:{d=(c[5642]|0)==-2147483648&1;return d|0}case 28:{d=(c[5642]&255|0)==127&1;return d|0}case 29:{d=(c[5642]&65535|0)==32767&1;return d|0}case 30:{d=(c[5642]|0)==2147483647&1;return d|0}case 14:case 13:case 12:{d=0;return d|0}default:ra()}while(0);return 0}function vf(){var a=0,b=0;switch(c[5643]|0){case 2:case 1:case 0:{b=c[5642]|0;a=c[5641]|0;a=(a^b^b-a)&16;return a|0}case 5:case 4:case 3:{a=c[5642]|0;b=c[5641]|0;b=(b^a^a+31-b)&16;return b|0}case 8:case 7:case 6:{b=c[5642]|0;a=c[5641]|0;b=(a^b^a+b)&16;return b|0}case 11:case 10:case 9:{a=c[5642]|0;b=c[5641]|0;b=(b^a^a+1+b)&16;return b|0}case 24:{b=c[5641]&16;return b|0}case 27:case 26:case 25:{b=c[5642]|0;b=(b+31^b)&16;return b|0}case 30:case 29:case 28:{b=c[5642]|0;b=(b+1^b)&16;return b|0}case 23:case 22:case 21:case 20:case 17:case 19:case 16:case 18:case 15:case 14:case 13:case 12:{b=0;return b|0}default:ra()}return 0}function wf(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;t=l;l=l+32|0;q=t+24|0;h=t+20|0;s=t+16|0;r=t+12|0;k=t+8|0;m=t+4|0;i=t;c[h>>2]=e;c[s>>2]=0;if((c[5732]|0)>=0){r=c[5766]|0;do if((r|0)!=0?!(0==0?(c[r+144>>2]&1|0)==0:0):0)if(!($g(h,s,e,f,0)|0)){i=c[h>>2]|0;h=c[s>>2]|0;break}else{d=-1;l=t;return d|0}else p=6;while(0);if((p|0)==6){c[s>>2]=1;i=e;h=1}c[a>>2]=i;c[b>>2]=h;c[d>>2]=1;d=0;l=t;return d|0}a:do if(!(c[5735]&32)){h=c[5734]&-4096|e>>>20&4092;c[k>>2]=h;o=c[5766]|0;do if((o|0)!=0?!(0==0?(c[o+144>>2]&1|0)==0:0):0)if(!($g(k,q,h,1,1)|0)){j=c[k>>2]|0;break}else{d=-1;l=t;return d|0}else p=47;while(0);if((p|0)==47)j=h;h=Ge(c[4202123]|0,j,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0)h=c[(c[h+40>>2]|0)+(j-(c[h+8>>2]|0))>>2]|0;else h=0;if(!((h&1|0)==0&0==0)){if((h&32|0)==0&0==0){h=h|32;i=Ge(c[4202123]|0,j,0)|0;if((i|0)!=0?(c[i+32>>2]|0)!=0:0)c[(c[i+40>>2]|0)+(j-(c[i+8>>2]|0))>>2]=h}i=h&-4096|e>>>10&4092;c[m>>2]=i;o=c[5766]|0;do if((o|0)!=0?!(0==0?(c[o+144>>2]&1|0)==0:0):0)if(!($g(m,q,i,1,1)|0)){i=c[m>>2]|0;break}else{d=-1;l=t;return d|0}else p=60;while(0);j=Ge(c[4202123]|0,i,0)|0;if((j|0)!=0?(c[j+32>>2]|0)!=0:0)j=c[(c[j+40>>2]|0)+(i-(c[j+8>>2]|0))>>2]|0;else j=0;if(!((j&1|0)==0&0==0)){k=4096;m=j&h;h=0;p=68}else h=0}else h=0}else{h=c[5734]&-32|e>>>27&24;c[i>>2]=h;u=c[5766]|0;if((u|0)!=0?!(0==0?(c[u+144>>2]&1|0)==0:0):0){if(!($g(i,q,h,1,1)|0)){h=c[i>>2]|0;p=14}}else p=14;b:do if((p|0)==14){i=Ge(c[4202123]|0,h,0)|0;c:do if((i|0?c[i+32>>2]|0:0)?(j=c[(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))>>2]|0,!((j&1|0)==0&0==0)):0){i=j&-4096|e>>>18&4088;c[k>>2]=i;u=c[5766]|0;if((u|0)!=0?!(0==0?(c[u+144>>2]&1|0)==0:0):0){if($g(k,q,i,1,1)|0)break b;i=c[k>>2]|0}h=Ge(c[4202123]|0,i,0)|0;if((h|0?c[h+32>>2]|0:0)?(o=(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))|0,n=c[o>>2]|0,o=c[o+4>>2]|0,!((n&1|0)==0&0==0)):0){do if(!(o>>>0>0|(o|0)==0&n>>>0>4294967295)){if((n&128|0)==0&0==0){do if((n&32|0)==0&0==0){h=n|32;j=Ge(c[4202123]|0,i,0)|0;if(j){if(!(c[j+32>>2]|0))break;c[(c[j+40>>2]|0)+(i-(c[j+8>>2]|0))>>2]=h}}else h=n;while(0);i=h&-4096|e>>>9&4088;c[m>>2]=i;h=c[5766]|0;do if(!h)p=34;else{if(0==0?(c[h+144>>2]&1|0)==0:0){p=34;break}if($g(m,q,i,1,1)|0)break b;i=c[m>>2]|0}while(0);h=Ge(c[4202123]|0,i,0)|0;if(!h)break c;if(!(c[h+32>>2]|0))break c;h=(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))|0;j=c[h>>2]|0;h=c[h+4>>2]|0;if((j&1|0)==0&0==0)break c;if(h>>>0>0|(h|0)==0&j>>>0>4294967295)break;k=4096;m=j&n}else{c[m>>2]=i;k=2097152;m=n;j=n;h=o}p=68;break a}while(0);h=8;break a}}while(0);h=0;break a}while(0);u=-1;l=t;return u|0}while(0);do if((p|0)==68){if(!g){if((m&2|0)==0&((f|0)!=0&(c[5732]&65536|0)!=0)){h=1;break}}else{if(!(m&4)){h=1;break}if((f|0)!=0&(m&2|0)==0){h=1;break}}h=Il(j|0,h|0,6)|0;h=((h&1^1)&f|0)!=0;if((j&32|0)==0&0==0|h){u=h?96:32;j=u|j;h=Ge(c[4202123]|0,i,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0){c[(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))>>2]=j;i=j;h=j}else{i=j;h=j}}else{i=j;h=j}h=(m&2|0)!=0&((h&64|0)!=0|0!=0)&1;c[s>>2]=h;j=m>>>2&1;i=i&0-k|k+-1&e;c[r>>2]=i;u=c[5766]|0;do if((u|0)!=0?!(0==0?(c[u+144>>2]&1|0)==0:0):0){if(!($g(r,q,i,f,0)|0)){h=c[q>>2]&h;c[s>>2]=h;i=c[r>>2]|0;break}u=-1;l=t;return u|0}while(0);c[a>>2]=i;c[b>>2]=h;c[d>>2]=j;u=0;l=t;return u|0}while(0);h=g<<2|f<<1|h;i=c[5766]|0;if((i|0)!=0?(c[i+8>>2]&16384|0)!=0:0){u=i+128|0;c[u>>2]=e;c[u+4>>2]=0}else c[5733]=e;c[5746]=14;c[5747]=h;u=-1;l=t;return u|0}function xf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=b+(0-(a&4095))-(a&-4096)|0;j=a>>>12;i=23084+(j<<2)|0;if((c[i>>2]|0)==-1){g=c[5769]|0;if((g|0)>2047){h=j+1048575&1048575;b=0;f=0;do{a=c[16800300+(f<<2)>>2]|0;if((a|0)==(h|0)){c[16800300+(b<<2)>>2]=h;b=b+1|0}else{c[23084+(a<<2)>>2]=-1;c[8411692+(a<<2)>>2]=-1;a=a+1048576|0;c[23084+(a<<2)>>2]=-1;c[8411692+(a<<2)>>2]=-1}f=f+1|0}while((f|0)!=(g|0));c[5769]=b}else b=g;c[5769]=b+1;c[16800300+(b<<2)>>2]=j}c[i>>2]=k;f=(d|0)!=0;c[8411692+(j<<2)>>2]=f?k:-1;b=j|1048576;a=23084+(b<<2)|0;if(!e){c[a>>2]=-1;c[8411692+(b<<2)>>2]=-1;return}c[a>>2]=k;b=8411692+(b<<2)|0;if(f){c[b>>2]=k;return}else{c[b>>2]=-1;return}}function yf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;j=c[5730]|0;f=e;l=j;e=1;j=(j>>>7&2^2)+2|0;a:while(1){b:do switch(f|0){case 102:if(!(c[5730]&256)){g=l|256;f=2;k=6;break b}else{g=l&-257;f=4;k=6;break b}case 101:case 100:case 62:case 54:case 46:case 38:case 243:case 242:{g=l;f=j;k=6;break}case 240:{if(e>>>0>14){k=13;break a}f=l|64;h=e+b|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1)){g=f;f=d[i+h>>0]|0;break b}if(zf(h,0,0,2)|0){e=-1;k=449;break a}g=f;f=c[5762]|0;break}case 103:{f=(c[5730]&128|0)==0?l|128:l&-129;if(e>>>0>14){k=19;break a}h=e+b|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1)){g=f;f=d[i+h>>0]|0;break b}if(zf(h,0,0,2)|0){e=-1;k=449;break a}g=f;f=c[5762]|0;break}default:{k=25;break a}}while(0);do if((k|0)==6){k=0;if(e>>>0>14){k=7;break a}h=e+b|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1)){j=f;f=d[i+h>>0]|0;break}if(zf(h,0,0,2)|0){e=-1;k=449;break a}j=f;f=c[5762]|0}while(0);l=g;e=e+1|0}if((k|0)==7){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==13){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==19){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==25){c:do if(!(l&64))do switch(f|0){case 111:case 110:case 109:case 108:case 97:case 96:case 63:case 55:case 47:case 39:case 215:case 239:case 238:case 237:case 236:case 155:case 175:case 174:case 173:case 172:case 167:case 166:case 171:case 170:case 165:case 164:case 244:case 159:case 158:case 251:case 250:case 253:case 252:case 214:case 249:case 248:case 245:case 207:case 206:case 204:case 144:case 203:case 195:case 31:case 23:case 7:case 30:case 22:case 14:case 6:case 157:case 156:case 201:case 153:case 152:case 95:case 94:case 93:case 92:case 91:case 90:case 89:case 88:case 87:case 86:case 85:case 84:case 83:case 82:case 81:case 80:case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:case 151:case 150:case 149:case 148:case 147:case 146:case 145:{k=448;break c}case 213:case 212:case 231:case 230:case 229:case 228:case 205:case 227:case 226:case 225:case 224:case 117:case 116:case 127:case 126:case 125:case 124:case 123:case 122:case 121:case 120:case 119:case 118:case 115:case 114:case 113:case 112:case 235:case 106:case 168:case 60:case 52:case 44:case 36:case 28:case 20:case 12:case 4:case 183:case 182:case 181:case 180:case 179:case 178:case 177:case 176:{if(e>>>0<=14){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 232:case 233:case 104:case 169:case 61:case 53:case 45:case 37:case 29:case 21:case 13:case 5:case 191:case 190:case 189:case 188:case 187:case 186:case 185:case 184:{e=j+e|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 99:case 98:case 223:case 222:case 221:case 220:case 219:case 218:case 217:case 216:case 255:case 254:case 141:case 143:case 211:case 210:case 209:case 208:case 133:case 132:case 59:case 51:case 43:case 35:case 27:case 19:case 11:case 3:case 58:case 50:case 42:case 34:case 26:case 18:case 10:case 2:case 57:case 49:case 41:case 33:case 25:case 17:case 9:case 1:case 56:case 48:case 40:case 32:case 24:case 16:case 8:case 0:case 197:case 196:case 140:case 142:case 135:case 134:case 139:case 138:case 137:case 136:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);d:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break d}case 12:{e=e+3|0;break d}case 20:{e=e+6|0;break d}case 5:{e=e+5|0;break d}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break d}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break d}default:{e=h;break d}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+3|0:h;break d}case 1:{e=e+2|0;break d}case 2:{e=e+3|0;break d}default:{e=h;break d}}while(0);if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 163:case 162:case 161:case 160:{e=e+2+(l>>>6&2^2)|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 193:case 192:case 107:case 131:case 130:case 128:case 198:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break e}case 12:{e=e+3|0;break e}case 20:{e=e+6|0;break e}case 5:{e=e+5|0;break e}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break e}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break e}default:{e=h;break e}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+3|0:h;break e}case 1:{e=e+2|0;break e}case 2:{e=e+3|0;break e}default:{e=h;break e}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if((e|0)!=15){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 105:case 129:case 199:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);f:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break f}case 12:{e=e+3|0;break f}case 20:{e=e+6|0;break f}case 5:{e=e+5|0;break f}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break f}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break f}default:{e=h;break f}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+3|0:h;break f}case 1:{e=e+2|0;break f}case 2:{e=e+3|0;break f}default:{e=h;break f}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}e=e+j|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 246:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);g:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break g}case 12:{e=e+3|0;break g}case 20:{e=e+6|0;break g}case 5:{e=e+5|0;break g}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break g}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break g}default:{e=h;break g}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break g}case 1:{e=e+2|0;break g}case 2:{e=e+3|0;break g}default:{e=h;break g}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if(i&56|0){k=448;break c}if((e|0)<=14){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 247:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);h:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break h}case 12:{e=e+3|0;break h}case 20:{e=e+6|0;break h}case 5:{e=e+5|0;break h}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break h}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break h}default:{e=h;break h}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break h}case 1:{e=e+2|0;break h}case 2:{e=e+3|0;break h}default:{e=h;break h}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if(i&56|0){k=448;break c}e=e+j|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 154:case 234:{e=e+2+j|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 202:case 194:{if(e>>>0<=13){e=e+2|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 200:{if(e>>>0<=12){e=e+3|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 241:{c[5746]=6;c[5747]=0;a=-1;return a|0}case 15:{i=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);switch(f|0){case 207:case 206:case 205:case 204:case 203:case 202:case 201:case 200:case 169:case 161:case 168:case 160:case 50:case 48:case 51:case 49:case 162:case 9:case 8:case 6:{e=i;k=448;break c}case 143:case 142:case 141:case 140:case 139:case 138:case 137:case 136:case 135:case 134:case 133:case 132:case 131:case 130:case 129:case 128:{e=j+i|0;if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 31:case 30:case 29:case 28:case 27:case 26:case 25:case 199:case 177:case 176:case 193:case 192:case 175:case 189:case 188:case 187:case 179:case 171:case 163:case 173:case 165:case 181:case 180:case 178:case 34:case 32:case 3:case 2:case 1:case 0:case 191:case 190:case 183:case 182:case 79:case 78:case 77:case 76:case 75:case 74:case 73:case 72:case 71:case 70:case 69:case 68:case 67:case 66:case 65:case 64:case 159:case 158:case 157:case 156:case 155:case 154:case 153:case 152:case 151:case 150:case 149:case 148:case 147:case 146:case 145:case 144:{h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);i:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break i}case 12:{e=e+4|0;break i}case 20:{e=e+7|0;break i}case 5:{e=e+6|0;break i}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break i}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break i}default:{e=h;break i}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+4|0:h;break i}case 1:{e=e+3|0;break i}case 2:{e=e+4|0;break i}default:{e=h;break i}}while(0);if((e|0)<=15){k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 35:case 33:{if(e>>>0<=13){e=e+2|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 186:case 172:case 164:{h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);j:do if(!(l&128))switch((f>>>3&24|f&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break j}case 12:{e=e+4|0;break j}case 20:{e=e+7|0;break j}case 5:{e=e+6|0;break j}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break j}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break j}default:{e=h;break j}}else switch(f>>6|0){case 0:{e=(f&7|0)==6?e+4|0:h;break j}case 1:{e=e+3|0;break j}case 2:{e=e+4|0;break j}default:{e=h;break j}}while(0);if((e|0)>15){c[5746]=6;c[5747]=0;a=-1;return a|0}if((e|0)!=15){e=e+1|0;k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}default:{c[5746]=6;c[5747]=0;a=-1;return a|0}}}default:{k=447;break c}}while(0);else switch(f|0){case 135:case 134:case 49:case 41:case 33:case 25:case 17:case 9:case 1:case 48:case 40:case 32:case 24:case 16:case 8:case 0:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);k:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}g=h+b|0;f=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;do if(f&1)if(!(zf(g,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[f+g>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break k}case 12:{e=e+3|0;break k}case 20:{e=e+6|0;break k}case 5:{e=e+5|0;break k}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break k}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break k}default:{e=h;break k}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break k}case 1:{e=e+2|0;break k}case 2:{e=e+3|0;break k}default:{e=h;break k}}while(0);if((e|0)<=15)if((i&-64|0)==192){k=447;break c}else{k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 131:case 130:case 128:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);l:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break l}case 12:{e=e+3|0;break l}case 20:{e=e+6|0;break l}case 5:{e=e+5|0;break l}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break l}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break l}default:{e=h;break l}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break l}case 1:{e=e+2|0;break l}case 2:{e=e+3|0;break l}default:{e=h;break l}}while(0);if((e|0)<=15){if((i&-64|0)==192|(i&56|0)==56){k=447;break c}if((e|0)>14){k=447;break c}else{e=e+1|0;k=448;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}case 129:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);m:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break m}case 12:{e=e+3|0;break m}case 20:{e=e+6|0;break m}case 5:{e=e+5|0;break m}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break m}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break m}default:{e=h;break m}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break m}case 1:{e=e+2|0;break m}case 2:{e=e+3|0;break m}default:{e=h;break m}}while(0);if((e|0)<=15){if((i&-64|0)==192|(i&56|0)==56){k=447;break c}e=e+j|0;if((e|0)>15){k=447;break c}else{k=448;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}case 247:case 246:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);n:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break n}case 12:{e=e+3|0;break n}case 20:{e=e+6|0;break n}case 5:{e=e+5|0;break n}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break n}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break n}default:{e=h;break n}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break n}case 1:{e=e+2|0;break n}case 2:{e=e+3|0;break n}default:{e=h;break n}}while(0);if((e|0)<=15){if((i&-64|0)==192){k=447;break c}if((i>>>3&6|1|0)==3){k=448;break c}else{k=447;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}case 255:case 254:{h=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);o:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?6:2)+e|0;break o}case 12:{e=e+3|0;break o}case 20:{e=e+6|0;break o}case 5:{e=e+5|0;break o}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+5|0;break o}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+2|0;break o}default:{e=h;break o}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+3|0:h;break o}case 1:{e=e+2|0;break o}case 2:{e=e+3|0;break o}default:{e=h;break o}}while(0);if((e|0)<=15)if((i&-64|0)!=192&(i&48|0)==0){k=448;break c}else{k=447;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 15:{i=e+1|0;if(e>>>0>14){c[5746]=6;c[5747]=0;a=-1;return a|0}f=e+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);switch(f|0){case 199:case 177:case 176:case 193:case 192:case 187:case 179:case 171:{h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);p:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break p}case 12:{e=e+4|0;break p}case 20:{e=e+7|0;break p}case 5:{e=e+6|0;break p}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break p}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break p}default:{e=h;break p}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+4|0:h;break p}case 1:{e=e+3|0;break p}case 2:{e=e+4|0;break p}default:{e=h;break p}}while(0);if((e|0)<=15)if((i&-64|0)==192){k=447;break c}else{k=448;break c}c[5746]=6;c[5747]=0;a=-1;return a|0}case 186:break;default:{k=447;break c}}h=e+2|0;if(e>>>0>13){c[5746]=6;c[5747]=0;a=-1;return a|0}f=i+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){i=c[5762]|0;break}else{a=-1;return a|0}else i=d[g+f>>0]|0;while(0);q:do if(!(l&128))switch((i>>>3&24|i&7)&31){case 4:{if(e>>>0>12){c[5746]=6;c[5747]=0;a=-1;return a|0}f=h+b|0;g=c[23084+((c[5770]|0)+(f>>>12)<<2)>>2]|0;do if(g&1)if(!(zf(f,0,0,2)|0)){f=c[5762]|0;break}else{a=-1;return a|0}else f=d[g+f>>0]|0;while(0);e=((f&7|0)==5?7:3)+e|0;break q}case 12:{e=e+4|0;break q}case 20:{e=e+7|0;break q}case 5:{e=e+6|0;break q}case 16:case 17:case 18:case 19:case 21:case 22:case 23:{e=e+6|0;break q}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{e=e+3|0;break q}default:{e=h;break q}}else switch(i>>6|0){case 0:{e=(i&7|0)==6?e+4|0:h;break q}case 1:{e=e+3|0;break q}case 2:{e=e+4|0;break q}default:{e=h;break q}}while(0);if((e|0)<=15){if((i&-64|0)==192|(i&56)>>>0<40){k=447;break c}if((e|0)>14){k=447;break c}else{e=e+1|0;k=448;break c}}else{c[5746]=6;c[5747]=0;a=-1;return a|0}}default:{k=447;break c}}while(0);if((k|0)==447){c[5746]=6;c[5747]=0;a=-1;return a|0}else if((k|0)==448){c[a>>2]=e;a=0;return a|0}}else if((k|0)==449)return e|0;return 0}function zf(b,f,g,h){b=b|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0;r=l;l=l+16|0;o=r+8|0;p=r+4|0;j=r;n=(h|0)==2?(a[22968]|0)==3&1:h;q=1<<f;a:do if(!(q+-1&b)){if(wf(j,o,p,b,g,n)|0){b=-1;l=r;return b|0}h=c[j>>2]|0;j=Ge(c[4202123]|0,h,0)|0;if(!j)i=0;else{if(!(c[j+32>>2]|0)){if(!(c[j+76>>2]&q)){i=0;break}i=Ya[c[j+68>>2]&63](c[j+64>>2]|0,h-(c[j+8>>2]|0)|0,f)|0;break}m=h-(c[j+8>>2]|0)|0;n=(c[j+40>>2]|0)+m|0;h=c[o>>2]|0;do if(h){j=c[j+48>>2]|0;k=(j|0)==0;if(g|0){j=j+(m>>>17<<2)|0;if(k)break;c[j>>2]=c[j>>2]|1<<(m>>>12&31);break}if(!k?(c[j+(m>>>17<<2)>>2]&1<<(m>>>12&31)|0)==0:0){c[o>>2]=0;h=0}}else h=0;while(0);xf(b,n,h,c[p>>2]|0);switch(f|0){case 0:{i=d[n>>0]|0;break a}case 1:{i=e[n>>1]|0;break a}case 2:{i=c[n>>2]|0;break a}default:ra()}}}else{i=(f|0)!=31;if(!g){if(!i){i=0;break}m=n<<20;i=0;k=0;while(1){h=k+b|0;j=c[23084+((h>>>12|m)<<2)>>2]|0;if(!(j&1))h=d[j+h>>0]|0;else{if(zf(h,0,0,n)|0){i=-1;break}h=c[5762]|0}i=h<<(k<<3)|i;k=k+1|0;if((k|0)>=(q|0))break a}l=r;return i|0}else{if(!i){i=0;break}i=0;k=0;while(1){h=k+b|0;j=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(j&1))h=d[j+h>>0]|0;else{if(zf(h,0,1,2)|0){i=-1;break}h=c[5762]|0}i=h<<(k<<3)|i;k=k+1|0;if((k|0)>=(q|0))break a}l=r;return i|0}}while(0);c[5762]=i;b=0;l=r;return b|0}function Af(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=c[5755]|0;if((c[5731]|0)!=0&(j&143|0)==0){e=b&7;switch((b>>>3&24|e)&31){case 4:{g=c[5758]|0;h=d[g>>0]|0;e=g+1|0;c[5758]=e;f=h&7;if((f|0)==5){e=d[g+2>>0]<<8|d[e>>0]|d[g+3>>0]<<16|d[g+4>>0]<<24;c[5758]=g+5}else e=c[22528+(f<<2)>>2]|0;f=h>>>3&7;if((f|0)==4){j=e;return j|0}j=(c[22528+(f<<2)>>2]<<(h>>>6))+e|0;return j|0}case 12:{g=c[5758]|0;e=d[g>>0]|0;f=g+1|0;c[5758]=f;f=a[f>>0]|0;c[5758]=g+2;f=(c[22528+((e&7)<<2)>>2]|0)+f|0;g=e>>>3&7;if((g|0)==4){j=f;return j|0}j=(c[22528+(g<<2)>>2]<<(e>>>6))+f|0;return j|0}case 20:{g=c[5758]|0;e=d[g>>0]|0;f=g+1|0;c[5758]=f;f=d[g+2>>0]<<8|d[f>>0]|d[g+3>>0]<<16|d[g+4>>0]<<24;c[5758]=g+5;f=f+(c[22528+((e&7)<<2)>>2]|0)|0;g=e>>>3&7;if((g|0)==4){j=f;return j|0}j=(c[22528+(g<<2)>>2]<<(e>>>6))+f|0;return j|0}case 5:{b=c[5758]|0;j=d[b+1>>0]<<8|d[b>>0]|d[b+2>>0]<<16|d[b+3>>0]<<24;c[5758]=b+4;return j|0}case 7:case 6:case 3:case 2:case 1:case 0:{j=c[22528+(e<<2)>>2]|0;return j|0}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{b=c[5758]|0;j=a[b>>0]|0;c[5758]=b+1;j=(c[22528+(e<<2)>>2]|0)+j|0;return j|0}default:{b=c[5758]|0;j=d[b+1>>0]<<8|d[b>>0]|d[b+2>>0]<<16|d[b+3>>0]<<24;c[5758]=b+4;j=j+(c[22528+(e<<2)>>2]|0)|0;return j|0}}}if(j&128|0){a:do if((b&199|0)==6){g=c[5758]|0;h=d[g+1>>0]<<8|d[g>>0];c[5758]=g+2;g=3}else{e=b>>6;switch(e|0){case 0:break;case 1:{f=c[5758]|0;e=a[f>>0]|0;f=f+1|0;i=22;break}default:{f=c[5758]|0;e=d[f+1>>0]<<8|d[f>>0];f=f+2|0;i=22}}if((i|0)==22)c[5758]=f;switch(b&7){case 0:{g=3;h=(c[5635]|0)+e+(c[5638]|0)&65535;break a}case 1:{g=3;h=(c[5635]|0)+e+(c[5639]|0)&65535;break a}case 2:{g=2;h=(c[5637]|0)+e+(c[5638]|0)&65535;break a}case 3:{g=2;h=(c[5637]|0)+e+(c[5639]|0)&65535;break a}case 4:{g=3;h=(c[5638]|0)+e&65535;break a}case 5:{g=3;h=(c[5639]|0)+e&65535;break a}case 6:{g=2;h=(c[5637]|0)+e&65535;break a}case 7:{g=3;h=(c[5635]|0)+e&65535;break a}default:{}}}while(0);j=j&15;j=(c[22740+(((j|0)==0?g:j+-1|0)<<4)+4>>2]|0)+h|0;return j|0}e=b&7;switch((b>>>3&24|e)&31){case 4:{e=c[5758]|0;h=d[e>>0]|0;f=e+1|0;c[5758]=f;g=h&7;if((g|0)==5){f=d[e+2>>0]<<8|d[f>>0]|d[e+3>>0]<<16|d[e+4>>0]<<24;c[5758]=e+5;e=0}else{e=g;f=c[22528+(g<<2)>>2]|0}g=h>>>3&7;if((g|0)==4)i=e;else{i=e;f=(c[22528+(g<<2)>>2]<<(h>>>6))+f|0}break}case 12:{e=c[5758]|0;g=d[e>>0]|0;f=e+1|0;c[5758]=f;f=a[f>>0]|0;c[5758]=e+2;e=g&7;f=(c[22528+(e<<2)>>2]|0)+f|0;h=g>>>3&7;if((h|0)==4)i=e;else{i=e;f=(c[22528+(h<<2)>>2]<<(g>>>6))+f|0}break}case 20:{e=c[5758]|0;g=d[e>>0]|0;f=e+1|0;c[5758]=f;f=d[e+2>>0]<<8|d[f>>0]|d[e+3>>0]<<16|d[e+4>>0]<<24;c[5758]=e+5;e=g&7;f=f+(c[22528+(e<<2)>>2]|0)|0;h=g>>>3&7;if((h|0)==4)i=e;else{i=e;f=(c[22528+(h<<2)>>2]<<(g>>>6))+f|0}break}case 5:{i=c[5758]|0;f=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=0;break}case 7:case 6:case 3:case 2:case 1:case 0:{i=e;f=c[22528+(e<<2)>>2]|0;break}case 15:case 14:case 13:case 11:case 10:case 9:case 8:{i=c[5758]|0;f=a[i>>0]|0;c[5758]=i+1;i=e;f=(c[22528+(e<<2)>>2]|0)+f|0;break}default:{i=c[5758]|0;f=d[i+1>>0]<<8|d[i>>0]|d[i+2>>0]<<16|d[i+3>>0]<<24;c[5758]=i+4;i=e;f=f+(c[22528+(e<<2)>>2]|0)|0}}e=j&15;if(!e)e=(i|1|0)==5?2:3;else e=e+-1|0;j=(c[22740+(e<<4)+4>>2]|0)+f|0;return j|0}function Bf(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;k=q+8|0;n=q+4|0;h=q;m=(g|0)==2?(a[22968]|0)==3&1:g;p=1<<f;if(p+-1&d|0){if((f|0)==31){e=0;l=q;return e|0}h=m<<20;g=0;while(1){i=g+d|0;j=e>>>(g<<3);k=c[8411692+((i>>>12|h)<<2)>>2]|0;if(k&1){if(Bf(i,j,0,m)|0){g=-1;i=21;break}}else a[k+i>>0]=j;g=g+1|0;if((g|0)>=(p|0)){g=0;i=21;break}}if((i|0)==21){l=q;return g|0}}if(wf(h,k,n,d,1,m)|0){e=-1;l=q;return e|0}g=c[h>>2]|0;j=Ge(c[4202123]|0,g,0)|0;if(!j){e=0;l=q;return e|0}if(!(c[j+32>>2]|0)){if(!(c[j+76>>2]&p)){e=0;l=q;return e|0}gb[c[j+72>>2]&63](c[j+64>>2]|0,g-(c[j+8>>2]|0)|0,e,f);e=0;l=q;return e|0}h=g-(c[j+8>>2]|0)|0;i=(c[j+40>>2]|0)+h|0;g=c[k>>2]|0;if(g|0?(p=c[j+48>>2]|0,o=p+(h>>>17<<2)|0,p|0):0)c[o>>2]=c[o>>2]|1<<(h>>>12&31);xf(d,i,g,c[n>>2]|0);switch(f|0){case 0:{a[i>>0]=e;e=0;l=q;return e|0}case 1:{b[i>>1]=e;e=0;l=q;return e|0}case 2:{c[i>>2]=e;e=0;l=q;return e|0}default:ra()}return 0}function Cf(a,b){a=a|0;b=b|0;b=b&65535;if(!(c[5732]&1)){c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=b<<4;a=(c[5696]|0)>>>6&65536;c[5729]=(a^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?a>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;a=0;return a|0}if(!(c[5647]&131072)){a=Zg(a,b,0)|0;return a|0}else{c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=b<<4;c[22740+(a<<4)+8>>2]=65535;c[22740+(a<<4)+12>>2]=62208;a=(c[5696]|0)>>>6&65536;c[5729]=(a^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?a>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;a=0;return a|0}return 0}function Df(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0;f=c[5770]|0;g=c[23084+(f+(d>>>12)<<2)>>2]|0;do if((g|d)&3)if(!(zf(d,2,0,2)|0)){f=c[5770]|0;g=23048;break}else{b=-1;return b|0}else g=g+d|0;while(0);h=c[g>>2]|0;g=d+4|0;f=c[23084+(f+(g>>>12)<<2)>>2]|0;do if((f|g)&1)if(!(zf(g,1,0,2)|0)){f=c[5762]|0;break}else{b=-1;return b|0}else f=e[f+g>>1]|0;while(0);if(Cf(a,f)|0){b=-1;return b|0}c[22528+(b<<2)>>2]=h;b=0;return b|0}function Ef(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;switch(a|0){case 0:{c[5641]=d;e=d+b<<24>>24;c[5642]=e;f=0;break}case 1:{e=(d|b)<<24>>24;c[5642]=e;f=12;break}case 2:{f=nf(22528)|0;c[5641]=d;e=d+b+f<<24>>24;c[5642]=e;f=(f|0)==0?0:3;break}case 3:{f=nf(22528)|0;c[5641]=d;e=b-d-f<<24>>24;c[5642]=e;f=(f|0)==0?6:9;break}case 4:{e=(d&b)<<24>>24;c[5642]=e;f=12;break}case 5:{c[5641]=d;e=b-d<<24>>24;c[5642]=e;f=6;break}case 6:{e=(d^b)<<24>>24;c[5642]=e;f=12;break}case 7:{c[5641]=d;c[5642]=b-d<<24>>24;e=b;f=6;break}default:ra()}c[5643]=f;return e|0}function Ff(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;switch(a|0){case 0:{c[5641]=d;e=d+b|0;c[5642]=e;f=2;break}case 1:{e=d|b;c[5642]=e;f=14;break}case 2:{f=nf(22528)|0;c[5641]=d;e=d+b+f|0;c[5642]=e;f=(f|0)==0?2:5;break}case 3:{f=nf(22528)|0;c[5641]=d;e=b-d-f|0;c[5642]=e;f=(f|0)==0?8:11;break}case 4:{e=d&b;c[5642]=e;f=14;break}case 5:{c[5641]=d;e=b-d|0;c[5642]=e;f=8;break}case 6:{e=d^b;c[5642]=e;f=14;break}case 7:{c[5641]=d;c[5642]=b-d;e=b;f=8;break}default:ra()}c[5643]=f;return e|0}function Gf(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;switch(b|0){case 0:{if(!(f&31))return e|0;b=f&7;h=e&255;b=h>>>(8-b|0)|h<<b;if((c[5643]|0)==24){g=c[5641]|0;f=g>>>7&1;g=((c[5642]|0)==0&1)<<6|g&4}else{g=c[5642]|0;f=g>>>31;g=(d[21168+(g&255)>>0]|0)<<2|((g|0)==0&1)<<6}e=f<<7|g|(vf()|0);c[5641]=(b^h)<<4&2048|b&1|e;c[5642]=e>>>6&1^1;c[5643]=24;e=b;return e|0}case 1:{if(!(f&31))return e|0;f=f&7;b=e&255;f=b<<8-f|b>>>f;if((c[5643]|0)==24){h=c[5641]|0;g=h>>>7&1;h=((c[5642]|0)==0&1)<<6|h&4}else{h=c[5642]|0;g=h>>>31;h=(d[21168+(h&255)>>0]|0)<<2|((h|0)==0&1)<<6}e=g<<7|h|(vf()|0);c[5641]=(f^b)<<4&2048|f>>>7&1|e;c[5642]=e>>>6&1^1;c[5643]=24;e=f;return e|0}case 2:{b=a[21456+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&255;g=(nf(22528)|0)<<h+-1|((b<<24>>24==1?0:i>>>(9-h|0))|i<<h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)<<4&2048|i>>>(8-h|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 3:{b=a[21456+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&255;g=(nf(22528)|0)<<8-h|((b<<24>>24==1?0:i<<9-h)|i>>>h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)<<4&2048|i>>>(h+-1|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 6:case 4:{b=f&31;f=e<<b<<24>>24;if(!b)return e|0;c[5641]=e<<b+-1;c[5642]=f;c[5643]=15;e=f;return e|0}case 5:{b=f&31;f=e&255;g=f>>>b<<24>>24;if(!b)return e|0;c[5641]=f>>>(b+-1|0);c[5642]=g;c[5643]=18;e=g;return e|0}case 7:{b=f&31;f=e<<24>>24;g=f>>b;if(!b)return e|0;c[5641]=f>>b+-1;c[5642]=g;c[5643]=18;e=g;return e|0}default:ra()}return 0}function Hf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0;switch(a|0){case 0:{a=e&31;if(!a)return b|0;f=b>>>(32-a|0)|b<<a;if((c[5643]|0)==24){e=c[5641]|0;a=e>>>7&1;e=((c[5642]|0)==0&1)<<6|e&4}else{e=c[5642]|0;a=e>>>31;e=(d[21168+(e&255)>>0]|0)<<2|((e|0)==0&1)<<6}g=a<<7|e|(vf()|0);c[5641]=(f^b)>>>20&2048|f&1|g;c[5642]=g>>>6&1^1;c[5643]=24;b=f;return b|0}case 1:{a=e&31;if(!a)return b|0;a=b<<32-a|b>>>a;if((c[5643]|0)==24){f=c[5641]|0;e=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;e=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}g=e<<7|f|(vf()|0);c[5641]=(a^b)>>>20&2048|a>>>31|g;c[5642]=g>>>6&1^1;c[5643]=24;b=a;return b|0}case 2:{f=e&31;if(!f)return b|0;g=(nf(22528)|0)<<f+-1|(((f|0)==1?0:b>>>(33-f|0))|b<<f);if((c[5643]|0)==24){e=c[5641]|0;a=e>>>7&1;e=((c[5642]|0)==0&1)<<6|e&4}else{e=c[5642]|0;a=e>>>31;e=(d[21168+(e&255)>>0]|0)<<2|((e|0)==0&1)<<6}e=a<<7|e|(vf()|0);c[5641]=(g^b)>>>20&2048|b>>>(32-f|0)&1|e;c[5642]=e>>>6&1^1;c[5643]=24;b=g;return b|0}case 3:{a=e&31;if(!a)return b|0;g=(nf(22528)|0)<<32-a|(((a|0)==1?0:b<<33-a)|b>>>a);if((c[5643]|0)==24){f=c[5641]|0;e=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;e=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=e<<7|f|(vf()|0);c[5641]=(g^b)>>>20&2048|b>>>(a+-1|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;b=g;return b|0}case 6:case 4:{a=e&31;e=b<<a;if(!a)return b|0;c[5641]=b<<a+-1;c[5642]=e;c[5643]=17;b=e;return b|0}case 5:{a=e&31;e=b>>>a;if(!a)return b|0;c[5641]=b>>>(a+-1|0);c[5642]=e;c[5643]=20;b=e;return b|0}case 7:{a=e&31;e=b>>a;if(!a)return b|0;c[5641]=b>>a+-1;c[5642]=e;c[5643]=20;b=e;return b|0}default:ra()}return 0}function If(){var a=0,b=0,d=0,e=0,f=0,g=0;d=(c[5636]|0)+-32|0;a=(d&c[5729])+(c[5694]|0)|0;b=7;while(1){f=c[22528+(b<<2)>>2]|0;e=c[8411692+((c[5770]|0)+(a>>>12)<<2)>>2]|0;if((e|a)&3){if(Bf(a,f,2,2)|0){a=-1;g=7;break}}else c[e+a>>2]=f;if(!b)break;else{a=a+4|0;b=b+-1|0}}if((g|0)==7)return a|0;g=c[5729]|0;c[5636]=c[5636]&~g|g&d;g=0;return g|0}function Jf(){var a=0,b=0,d=0,e=0;b=7;d=(c[5729]&c[5636])+(c[5694]|0)|0;while(1){if((b|0)!=4){a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;if((a|d)&3)if(!(zf(d,2,0,2)|0))a=23048;else{a=-1;e=9;break}else a=a+d|0;c[22528+(b<<2)>>2]=c[a>>2]}if(!b)break;else{b=b+-1|0;d=d+4|0}}if((e|0)==9)return a|0;d=c[5636]|0;e=c[5729]|0;c[5636]=d&~e|d+32&e;e=0;return e|0}function Kf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=b&31;e=c[5637]|0;l=(c[5636]|0)+-4|0;f=(c[5729]&l)+(c[5694]|0)|0;d=c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|0;if((d|f)&3){if(Bf(f,e,2,2)|0){l=-1;return l|0}}else c[d+f>>2]=e;a:do switch(b&31){case 0:{b=l;break}case 1:{b=l;h=14;break}default:{b=l;while(1){e=e+-4|0;d=c[5729]|0;f=c[5694]|0;i=(d&e)+f|0;h=c[5770]|0;j=c[23084+((i>>>12)+h<<2)>>2]|0;if(!((j|i)&3)){k=d;d=j+i|0}else{if(zf(i,2,0,2)|0){b=-1;h=21;break}k=c[5729]|0;f=c[5694]|0;h=c[5770]|0;d=23048}i=c[d>>2]|0;b=b+-4|0;f=(k&b)+f|0;d=c[8411692+((f>>>12)+h<<2)>>2]|0;if((d|f)&3){if(Bf(f,i,2,2)|0){b=-1;h=21;break}}else c[d+f>>2]=i;if((g|0)<=2){h=14;break a}else g=g+-1|0}if((h|0)==21)return b|0}}while(0);do if((h|0)==14){b=b+-4|0;d=(c[5729]&b)+(c[5694]|0)|0;e=c[8411692+((d>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((e|d)&3)){c[e+d>>2]=l;break}if(Bf(d,l,2,2)|0){l=-1;return l|0}}while(0);e=b-a|0;b=c[5729]|0;d=e&b;f=d+(c[5694]|0)|0;do if((c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|f)&3)if(!(zf(f,2,1,2)|0)){b=c[5729]|0;d=b&e;break}else{l=-1;return l|0}while(0);c[5637]=l;c[5636]=c[5636]&~b|d;l=0;return l|0}function Lf(){var a=0,b=0,d=0,e=0,f=0;f=c[5637]|0;a=c[5729]|0;d=(a&f)+(c[5694]|0)|0;e=c[23084+((d>>>12)+(c[5770]|0)<<2)>>2]|0;do if((e|d)&3)if(!(zf(d,2,0,2)|0)){b=c[5729]|0;a=23048;break}else{f=-1;return f|0}else{b=a;a=e+d|0}while(0);c[5637]=c[a>>2];c[5636]=c[5636]&~b|b&f+4;f=0;return f|0}function Mf(f,g,h,i){f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+16|0;z=B+4|0;A=B;if((c[5647]|0)>>>17&1|c[5732]&1^1|0){m=c[5636]|0;do if(!f){j=(c[5729]&m+-2)+(c[5694]|0)|0;k=c[5689]|0;f=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((f|j)&1){if(Bf(j,k,1,2)|0){i=-1;l=B;return i|0}}else b[f+j>>1]=k;j=m+-4|0;k=(c[5729]&j)+(c[5694]|0)|0;f=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((f|k)&1)){b[f+k>>1]=i;break}if(Bf(k,i,1,2)|0){i=-1;l=B;return i|0}}else{j=(c[5729]&m+-4)+(c[5694]|0)|0;k=c[5689]|0;f=c[8411692+((c[5770]|0)+(j>>>12)<<2)>>2]|0;if((f|j)&3){if(Bf(j,k,2,2)|0){i=-1;l=B;return i|0}}else c[f+j>>2]=k;j=m+-8|0;k=(c[5729]&j)+(c[5694]|0)|0;f=c[8411692+((k>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((f|k)&3)){c[f+k>>2]=i;break}if(Bf(k,i,2,2)|0){i=-1;l=B;return i|0}}while(0);A=c[5729]|0;c[5636]=c[5636]&~A|A&j;c[5640]=h;c[5689]=g;A=g<<4;c[5690]=A;i=(c[5696]|0)>>>6&65536;c[5729]=(i^65536)+-1;c[5731]=(c[5694]|A|c[5698]|c[5686]|0)==0?i>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;i=0;l=B;return i|0}c[z>>2]=0;c[A>>2]=0;p=g&65532;a:do if(!p){c[5746]=13;c[5747]=0;h=-1}else{j=(g>>>1&2^2)+6|0;if((g|7)>>>0>(c[22740+(j<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=p;h=-1;break}k=(c[22740+(j<<4)+4>>2]|0)+(g&-8)|0;j=c[23084+(k>>>12<<2)>>2]|0;if((j|k)&3)if(!(zf(k,2,0,0)|0))j=23048;else{h=-1;break}else j=j+k|0;q=c[j>>2]|0;j=k+4|0;k=c[23084+(j>>>12<<2)>>2]|0;if((k|j)&3)if(!(zf(j,2,0,0)|0))j=23048;else{h=-1;break}else j=k+j|0;o=c[j>>2]|0;r=d[22968]|0;t=c[5636]|0;b:do if(o&4096){if(!(o&2048)){c[5746]=13;c[5747]=p;h=-1;break a}j=o>>>13&3;if(!(o&1024)){if((g&3)>>>0>r>>>0){c[5746]=13;c[5747]=p;h=-1;break a}if((j|0)!=(r|0)){c[5746]=13;c[5747]=p;h=-1;break a}}else if(j>>>0>r>>>0){c[5746]=13;c[5747]=p;h=-1;break a}if(!(o&32768)){c[5746]=11;c[5747]=p;h=-1;break a}c[A>>2]=t;g=((c[5696]|0)>>>6&65536^65536)+-1|0;n=c[5694]|0;do if(!f){j=t+-2|0;c[A>>2]=j;k=(g&j)+n|0;f=c[5689]|0;m=c[8411692+(k>>>12<<2)>>2]|0;if((m|k)&1){if(Bf(k,f,1,0)|0){h=-1;break a}}else{b[m+k>>1]=f;j=c[A>>2]|0}j=j+-2|0;c[A>>2]=j;j=(j&g)+n|0;k=c[8411692+(j>>>12<<2)>>2]|0;if((j|k)&1)if(!(Bf(j,i,1,0)|0))break;else{h=-1;break a}else{b[j+k>>1]=i;break}}else{j=t+-4|0;c[A>>2]=j;k=(g&j)+n|0;f=c[5689]|0;m=c[8411692+(k>>>12<<2)>>2]|0;if((m|k)&3){if(Bf(k,f,2,0)|0){h=-1;break a}}else{c[m+k>>2]=f;j=c[A>>2]|0}j=j+-4|0;c[A>>2]=j;j=(j&g)+n|0;k=c[8411692+(j>>>12<<2)>>2]|0;if((j|k)&3)if(!(Bf(j,i,2,0)|0))break;else{h=-1;break a}else{c[j+k>>2]=i;break}}while(0);j=o&983040|q&65535;j=(o&8388608|0)==0?j:j<<12|4095;if(j>>>0<h>>>0){c[5746]=13;c[5747]=p;h=-1;break a}else{i=c[5729]|0;c[5636]=c[A>>2]&i|c[5636]&~i;A=o&-16777216|q>>>16|o<<16&16711680;c[5689]=p|r;c[5690]=A;c[5691]=j;c[5692]=o;i=(c[5696]|0)>>>6&65536;c[5729]=(i^65536)+-1;c[5731]=(c[5694]|A|c[5698]|c[5686]|0)==0?i>>>16:0;c[5730]=(o&4194304|0)==0?384:0;break}}else{h=o>>>13&3;j=g&3;switch(o>>>8&31){case 5:case 9:case 1:if(h>>>0<r>>>0|h>>>0<j>>>0){c[5746]=13;c[5747]=p;h=-1;break a}else{h=Xg(g&65535,q,o,2,i,0,0)|0;break a}case 12:case 4:{u=o>>>11&3;if(h>>>0<r>>>0|h>>>0<j>>>0){c[5746]=13;c[5747]=p;h=-1;break a}if(!(o&32768)){c[5746]=11;c[5747]=p;h=-1;break a}k=q>>>16;h=o&-65536|q&65535;p=o&31;y=k&65532;if(!y){c[5746]=13;c[5747]=0;h=-1;break a}j=(q>>>17&2^2)+6|0;if((k|7)>>>0>(c[22740+(j<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=y;h=-1;break a}k=(c[22740+(j<<4)+4>>2]|0)+(k&65528)|0;j=c[23084+(k>>>12<<2)>>2]|0;if((j|k)&3)if(!(zf(k,2,0,0)|0))j=23048;else{h=-1;break a}else j=j+k|0;x=c[j>>2]|0;j=k+4|0;k=c[23084+(j>>>12<<2)>>2]|0;if((k|j)&3)if(!(zf(j,2,0,0)|0))j=23048;else{h=-1;break a}else j=k+j|0;w=c[j>>2]|0;if((w&6144|0)!=6144){c[5746]=13;c[5747]=y;h=-1;break a}v=w>>>13&3;if(v>>>0>r>>>0){c[5746]=13;c[5747]=y;h=-1;break a}if(!(w&32768)){c[5746]=11;c[5747]=y;h=-1;break a}c:do if((w&1024|0)==0&v>>>0<r>>>0){if(_g(z,A,v)|0){h=-1;break a}j=c[z>>2]|0;m=j&65532;if(!m){c[5746]=10;c[5747]=0;h=-1;break a}if((j&3|0)!=(v|0)){c[5746]=10;c[5747]=m;h=-1;break a}k=(j>>>1&2^2)+6|0;if((j|7)>>>0>(c[22740+(k<<4)+8>>2]|0)>>>0){c[5746]=10;c[5747]=m;h=-1;break a}k=(c[22740+(k<<4)+4>>2]|0)+(j&-8)|0;j=c[23084+(k>>>12<<2)>>2]|0;if((j|k)&3)if(!(zf(k,2,0,0)|0))j=23048;else{h=-1;break a}else j=j+k|0;j=c[j>>2]|0;k=k+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else{h=-1;break a}else k=f+k|0;k=c[k>>2]|0;if((k>>>13&3|0)!=(v|0)){c[5746]=10;c[5747]=m;h=-1;break a}if((k&6656|0)!=4608){c[5746]=10;c[5747]=m;h=-1;break a}if(!(k&32768)){c[5746]=10;c[5747]=m;h=-1;break a}q=((c[5696]|0)>>>6&65536^65536)+-1|0;r=c[5694]|0;s=(k>>>6&65536^65536)+-1|0;m=k&-16777216|j>>>16|k<<16&16711680;f=c[A>>2]|0;if(u|0){f=f+-4|0;c[A>>2]=f;g=(f&s)+m|0;n=c[5693]|0;o=c[8411692+(g>>>12<<2)>>2]|0;if((o|g)&3){if(Bf(g,n,2,0)|0){h=-1;break a}}else{c[o+g>>2]=n;f=c[A>>2]|0}f=f+-4|0;c[A>>2]=f;f=(f&s)+m|0;g=c[8411692+(f>>>12<<2)>>2]|0;if((f|g)&3){if(Bf(f,t,2,0)|0){h=-1;break a}}else c[f+g>>2]=t;if(!p){o=m;p=s;q=1;f=c[A>>2]|0;r=135;break}o=p;while(1){p=o;o=o+-1|0;f=((o<<2)+t&q)+r|0;g=c[23084+(f>>>12<<2)>>2]|0;if((f|g)&3)if(!(zf(f,2,0,0)|0))f=23048;else{h=-1;break a}else f=f+g|0;n=c[f>>2]|0;f=(c[A>>2]|0)+-4|0;c[A>>2]=f;f=(f&s)+m|0;g=c[8411692+(f>>>12<<2)>>2]|0;if((f|g)&3){if(Bf(f,n,2,0)|0){h=-1;break a}}else c[f+g>>2]=n;if((p|0)<=1){g=s;n=1;r=134;break c}}}f=f+-2|0;c[A>>2]=f;g=(f&s)+m|0;n=c[5693]|0;o=c[8411692+(g>>>12<<2)>>2]|0;if((o|g)&1){if(Bf(g,n,1,0)|0){h=-1;break a}}else{b[o+g>>1]=n;f=c[A>>2]|0}f=f+-2|0;c[A>>2]=f;f=(f&s)+m|0;g=c[8411692+(f>>>12<<2)>>2]|0;if((f|g)&1){if(Bf(f,t,1,0)|0){h=-1;break a}}else b[f+g>>1]=t;if(!p){o=m;p=s;q=1;f=c[A>>2]|0;r=141;break}o=p;while(1){p=o;o=o+-1|0;f=((o<<1)+t&q)+r|0;g=c[23084+(f>>>12<<2)>>2]|0;if(!((f|g)&1))f=e[f+g>>1]|0;else{if(zf(f,1,0,0)|0){h=-1;break a}f=c[5762]|0}g=(c[A>>2]|0)+-2|0;c[A>>2]=g;g=(g&s)+m|0;n=c[8411692+(g>>>12<<2)>>2]|0;if((g|n)&1){if(Bf(g,f,1,0)|0){h=-1;break a}}else b[g+n>>1]=f;if((p|0)<=1){g=s;n=1;r=134;break}}}else{c[A>>2]=t;m=c[5694]|0;g=((c[5696]|0)>>>6&65536^65536)+-1|0;n=0;k=0;j=0;r=134}while(0);if((r|0)==134){f=c[A>>2]|0;if(!u){o=m;p=g;q=n;r=141}else{o=m;p=g;q=n;r=135}}do if((r|0)==135){f=f+-4|0;c[A>>2]=f;m=(p&f)+o|0;g=c[5689]|0;n=c[8411692+(m>>>12<<2)>>2]|0;if((n|m)&3){if(Bf(m,g,2,0)|0){h=-1;break a}}else{c[n+m>>2]=g;f=c[A>>2]|0}f=f+-4|0;c[A>>2]=f;f=(f&p)+o|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((f|m)&3)if(!(Bf(f,i,2,0)|0)){f=q;break}else{h=-1;break a}else{c[f+m>>2]=i;f=q;break}}else if((r|0)==141){f=f+-2|0;c[A>>2]=f;m=(p&f)+o|0;g=c[5689]|0;n=c[8411692+(m>>>12<<2)>>2]|0;if((n|m)&1){if(Bf(m,g,1,0)|0){h=-1;break a}}else{b[n+m>>1]=g;f=c[A>>2]|0}f=f+-2|0;c[A>>2]=f;f=(f&p)+o|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((f|m)&1)if(!(Bf(f,i,1,0)|0)){f=q;break}else{h=-1;break a}else{b[f+m>>1]=i;f=q;break}}while(0);if(!f){k=(c[5696]|0)>>>6&65536;m=k^65536;k=k>>>16;f=m;m=m+-1|0;g=c[5686]|0;n=c[5698]|0;j=c[5694]|0}else{m=c[z>>2]&-4|v;c[z>>2]=m;f=j&65535|k&983040;c[5693]=m;c[5694]=o;c[5695]=(k&8388608|0)==0?f:f<<12|4095;c[5696]=k;k=k>>>6&65536;f=k^65536;m=f+-1|0;c[5729]=m;n=c[5698]|0;g=c[5686]|0;k=k>>>16;c[5731]=(c[5690]|o|n|g|0)==0?k:0;c[5730]=(c[5692]&4194304|0)==0?384:0;j=o}i=w&-16777216|x>>>16|w<<16&16711680;z=w&983040|x&65535;c[5689]=v|y;c[5690]=i;c[5691]=(w&8388608|0)==0?z:z<<12|4095;c[5692]=w;c[5729]=m;c[5731]=(g|i|n|j|0)==0?k:0;c[5730]=(w&4194304|0)==0?384:0;a[22968]=v;c[5770]=(v|0)==3?1048576:0;c[5636]=c[A>>2]&m|c[5636]&0-f;break b}default:{c[5746]=13;c[5747]=p;h=-1;break a}}}while(0);c[5640]=h;h=0}while(0);i=h;l=B;return i|0}function Nf(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(c[5732]&1|0?(c[5647]&131072|0)==0:0){j=a&65532;if(!j){c[5746]=13;c[5747]=0;k=-1;return k|0}f=(a>>>1&2^2)+6|0;if((a|7)>>>0>(c[22740+(f<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}g=(c[22740+(f<<4)+4>>2]|0)+(a&-8)|0;f=c[23084+(g>>>12<<2)>>2]|0;if((f|g)&3)if(!(zf(g,2,0,0)|0))f=23048;else{k=-1;return k|0}else f=f+g|0;i=c[f>>2]|0;f=g+4|0;g=c[23084+(f>>>12<<2)>>2]|0;if((g|f)&3)if(!(zf(f,2,0,0)|0))f=23048;else{k=-1;return k|0}else f=g+f|0;h=c[f>>2]|0;k=d[22968]|0;if(h&4096|0){if(!(h&2048)){c[5746]=13;c[5747]=j;k=-1;return k|0}f=h>>>13&3;if(!(h&1024)){if((a&3)>>>0>k>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}if((f|0)!=(k|0)){c[5746]=13;c[5747]=j;k=-1;return k|0}}else if(f>>>0>k>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}if(!(h&32768)){c[5746]=11;c[5747]=j;k=-1;return k|0}f=h&983040|i&65535;f=(h&8388608|0)==0?f:f<<12|4095;if(f>>>0<b>>>0){c[5746]=13;c[5747]=j;k=-1;return k|0}else{i=h&-16777216|i>>>16|h<<16&16711680;c[5689]=j|k;c[5690]=i;c[5691]=f;c[5692]=h;k=(c[5696]|0)>>>6&65536;c[5729]=(k^65536)+-1;c[5731]=(c[5694]|i|c[5698]|c[5686]|0)==0?k>>>16:0;c[5730]=(h&4194304|0)==0?384:0;c[5640]=b;k=0;return k|0}}f=h>>>13&3;g=a&3;a:do switch(h>>>8&15){case 5:case 9:case 1:{if(f>>>0<k>>>0|f>>>0<g>>>0){c[5746]=13;c[5747]=j;break a}if(!(Xg(a&65535,i,h,0,e,0,0)|0)){k=0;return k|0}break}case 12:case 4:{if(f>>>0<k>>>0|f>>>0<g>>>0){c[5746]=13;c[5747]=j;break a}if(!(h&32768)){c[5746]=11;c[5747]=j;break a}e=i>>>16;b=((h&3840|0)==3072?h&-65536:0)|i&65535;f=(i>>>17&2^2)+6|0;if((e|7)>>>0>(c[22740+(f<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=e&65532;break a}g=(c[22740+(f<<4)+4>>2]|0)+(e&65528)|0;f=c[23084+(g>>>12<<2)>>2]|0;if((f|g)&3)if(!(zf(g,2,0,0)|0))f=23048;else break a;else f=f+g|0;h=c[f>>2]|0;f=g+4|0;g=c[23084+(f>>>12<<2)>>2]|0;if((g|f)&3)if(!(zf(f,2,0,0)|0))f=23048;else break a;else f=g+f|0;g=c[f>>2]|0;f=g>>>13&3;if((g&6144|0)!=6144){c[5746]=13;c[5747]=e&65532;break a}j=(g&1024|0)!=0;if(!(j&f>>>0>k>>>0^(j|(f|0)==(k|0)))){c[5746]=13;c[5747]=e&65532;break a}if(!(g&32768)){c[5746]=13;c[5747]=e&65532;break a}f=g&983040|h&65535;f=(g&8388608|0)==0?f:f<<12|4095;if((b|0)>(f|0)){c[5746]=13;c[5747]=0;break a}j=g&-16777216|h>>>16|g<<16&16711680;c[5689]=e&65532|k;c[5690]=j;c[5691]=f;c[5692]=g;k=(c[5696]|0)>>>6&65536;c[5729]=(k^65536)+-1;c[5731]=(c[5694]|j|c[5698]|c[5686]|0)==0?k>>>16:0;c[5730]=(g&4194304|0)==0?384:0;c[5640]=b;k=0;return k|0}default:{c[5746]=13;c[5747]=j}}while(0);k=-1;return k|0}c[5640]=b;c[5689]=a;j=a<<4;c[5690]=j;k=(c[5696]|0)>>>6&65536;c[5729]=(k^65536)+-1;c[5731]=(c[5694]|j|c[5698]|c[5686]|0)==0?k>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;k=0;return k|0}function Of(){var a=0;switch(c[5643]|0){case 6:{a=c[5641]|0;a=(a+(c[5642]|0)&255)>>>0<=(a&255)>>>0&1;return a|0}case 7:{a=c[5641]|0;a=(a+(c[5642]|0)&65535)>>>0<=(a&65535)>>>0&1;return a|0}case 8:{a=c[5641]|0;a=(a+(c[5642]|0)|0)>>>0<=a>>>0&1;return a|0}case 24:{a=(c[5641]&65|0)!=0&1;return a|0}default:{a=nf(22528)|0|(c[5642]|0)==0;return a|0}}return 0}function Pf(){var a=0;switch(c[5643]|0){case 6:{a=c[5641]|0;a=(a+(c[5642]|0)<<24|0)<(a<<24|0)&1;return a|0}case 7:{a=c[5641]|0;a=(a+(c[5642]|0)<<16|0)<(a<<16|0)&1;return a|0}case 8:{a=c[5641]|0;a=(a+(c[5642]|0)|0)<(a|0)&1;return a|0}case 30:{a=((c[5642]|0)+1|0)<1&1;return a|0}case 14:case 13:case 12:{a=(c[5642]|0)>>>31;return a|0}case 24:{a=c[5641]|0;a=(a>>>7^a>>>11)&1;return a|0}default:{a=(c[5642]|0)>>>31^(uf()|0);return a|0}}return 0}function Qf(){var a=0;switch(c[5643]|0){case 6:{a=c[5641]|0;a=(a+(c[5642]|0)<<24|0)<=(a<<24|0)&1;return a|0}case 7:{a=c[5641]|0;a=(a+(c[5642]|0)<<16|0)<=(a<<16|0)&1;return a|0}case 8:{a=c[5641]|0;a=(a+(c[5642]|0)|0)<=(a|0)&1;return a|0}case 30:{a=((c[5642]|0)+1|0)<2&1;return a|0}case 14:case 13:case 12:{a=(c[5642]|0)<1&1;return a|0}case 24:{a=c[5641]|0;a=(a>>>7^a>>>11|a>>>6)&1;return a|0}default:{a=(c[5642]|0)>>>31^(uf()|0)|(c[5642]|0)==0;return a|0}}return 0}function Rf(a,b){a=a|0;b=b|0;if(!((c[5647]|0)>>>17&1|c[5732]&1^1)){b=Yg(a,0,b)|0;return b|0}else{b=Wg(a,0,b)|0;return b|0}return 0}function Sf(a,b){a=a|0;b=b|0;var d=0,f=0,g=0;d=c[5647]|0;f=d&131072;if(!((c[5732]&1|0)!=0&(f|0)==0))if((f|0)==0|(d&12288|0)==12288){b=Wg(a,1,0)|0;return b|0}else{c[5746]=13;c[5747]=0;b=-1;return b|0}if(!(d&16384)){b=Yg(a,1,0)|0;return b|0}d=c[5714]|0;f=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((f|d)&1)if(!(zf(d,1,0,2)|0)){g=c[5762]|0;break}else{b=-1;return b|0}else g=e[f+d>>1]|0;while(0);if(g&4|0){c[5746]=10;c[5747]=g&65532;b=-1;return b|0}d=(g>>>1&2^2)+6|0;if((g|7)>>>0>(c[22740+(d<<4)+8>>2]|0)>>>0){c[5746]=10;c[5747]=g&65532;b=-1;return b|0}f=(c[22740+(d<<4)+4>>2]|0)+(g&-8)|0;d=c[23084+(f>>>12<<2)>>2]|0;if((d|f)&3)if(!(zf(f,2,0,0)|0))d=23048;else{b=-1;return b|0}else d=d+f|0;a=c[d>>2]|0;d=f+4|0;f=c[23084+(d>>>12<<2)>>2]|0;if((f|d)&3)if(!(zf(d,2,0,0)|0))d=23048;else{b=-1;return b|0}else d=f+d|0;d=c[d>>2]|0;if((d&5888|0)==768){b=Xg(g&65535,a,d,1,b,0,0)|0;return b|0}else{c[5746]=10;c[5747]=g&65532;b=-1;return b|0}return 0}function Tf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[5770]|0;e=c[23084+(d+(b>>>12)<<2)>>2]|0;do if((e|b)&3)if(!(zf(b,2,0,2)|0)){d=c[5770]|0;e=23048;break}else{a=-1;return a|0}else e=e+b|0;while(0);f=c[e>>2]|0;e=b+4|0;d=c[23084+(d+(e>>>12)<<2)>>2]|0;if((d|e)&3)if(!(zf(e,2,0,2)|0))d=23048;else{a=-1;return a|0}else d=d+e|0;a=c[22528+(a<<2)>>2]|0;if(!((a|0)<(f|0)?1:(a|0)>(c[d>>2]|0))){a=0;return a|0}c[5746]=5;c[5747]=0;a=-1;return a|0}function Uf(){var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=c[5755]|0;i=g<<9&65536;j=i+-1|0;f=g&15;k=c[5638]|0;l=c[5639]|0;f=(j&k)+(c[22740+(((f|0)==0?3:f+-1|0)<<4)+4>>2]|0)|0;h=(j&l)+(c[5686]|0)|0;if(g&48){g=c[5633]|0;if(!(g&j)){l=0;return l|0}b=c[5770]|0;e=c[23084+(b+(f>>>12)<<2)>>2]|0;do if(e&1)if(!(zf(f,0,0,2)|0)){e=c[5762]|0;b=c[5770]|0;break}else{l=-1;return l|0}else e=d[e+f>>0]|0;while(0);b=c[8411692+(b+(h>>>12)<<2)>>2]|0;if(b&1){if(Bf(h,e,0,2)|0){l=-1;return l|0}}else a[b+h>>0]=e;i=0-i|0;h=c[5646]|0;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i;l=g+-1&j;c[5633]=l|g&i;if(l|0){l=1;return l|0}}else{b=c[5770]|0;e=c[23084+(b+(f>>>12)<<2)>>2]|0;do if(e&1)if(!(zf(f,0,0,2)|0)){e=c[5762]|0;b=c[5770]|0;break}else{l=-1;return l|0}else e=d[e+f>>0]|0;while(0);b=c[8411692+(b+(h>>>12)<<2)>>2]|0;if(b&1){if(Bf(h,e,0,2)|0){l=-1;return l|0}}else a[b+h>>0]=e;i=0-i|0;h=c[5646]|0;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i}l=0;return l|0}function Vf(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0;o=l;l=l+16|0;b=o+4|0;d=o;h=c[5755]|0;j=h&128;a=(j|0)==0;j=j<<9;k=j+-1|0;g=h&15;m=c[5638]|0;n=c[5639]|0;g=(k&m)+(c[22740+(((g|0)==0?3:g+-1|0)<<4)+4>>2]|0)|0;i=(k&n)+(c[5686]|0)|0;a:do if(h&48){h=c[5633]|0;if(!(h&k)){n=0;l=o;return n|0}b:do if(a&(c[5646]|0)==1?((g|i)&3|0)==0:0){f=(4096-(g&4095)|0)>>>2;f=h>>>0>f>>>0?f:h;e=(4096-(i&4095)|0)>>>2;f=f>>>0>e>>>0?e:f;do if(!(Qg(b,g,0)|0)){e=c[b>>2]|0;if(e|0){if(Qg(d,i,1)|0)break;b=c[d>>2]|0;if(b|0){if((f|0)>0){a=0;do{c[b+(a<<2)>>2]=c[e+(a<<2)>>2];a=a+1|0}while(a>>>0<f>>>0)}k=f<<2;c[5638]=k+m;c[5639]=k+n;n=h-f|0;c[5633]=n;if(!n)break a;else a=1;l=o;return a|0}}break b}while(0);n=-1;l=o;return n|0}while(0);a=c[5770]|0;b=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((b|g)&3)if(!(zf(g,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{n=-1;l=o;return n|0}else{d=a;a=b+g|0}while(0);b=c[a>>2]|0;a=c[8411692+(d+(i>>>12)<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){n=-1;l=o;return n|0}}else c[a+i>>2]=b;j=0-j|0;i=c[5646]<<2;c[5638]=i+m&k|m&j;c[5639]=i+n&k|n&j;n=h+-1&k;c[5633]=n|h&j;if(n|0){n=1;l=o;return n|0}}else{a=c[5770]|0;b=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((b|g)&3)if(!(zf(g,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{n=-1;l=o;return n|0}else{d=a;a=b+g|0}while(0);b=c[a>>2]|0;a=c[8411692+(d+(i>>>12)<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){n=-1;l=o;return n|0}}else c[a+i>>2]=b;j=0-j|0;i=c[5646]<<2;c[5638]=i+m&k|m&j;c[5639]=i+n&k|n&j}while(0);n=0;l=o;return n|0}function Wf(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0;e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5639]|0;i=(g&h)+(c[5686]|0)|0;if(e&48){b=c[5633]|0;if(!(b&g)){i=0;return i|0}d=c[5632]|0;e=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(e&1){if(Bf(i,d,0,2)|0){i=-1;return i|0}}else a[e+i>>0]=d;f=0-f|0;c[5639]=(c[5646]|0)+h&g|h&f;i=b+-1&g;c[5633]=i|b&f;if(i|0){i=1;return i|0}}else{b=c[5632]|0;d=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if(d&1){if(Bf(i,b,0,2)|0){i=-1;return i|0}}else a[d+i>>0]=b;c[5639]=(c[5646]|0)+h&g|h&0-f}i=0;return i|0}function Xf(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+16|0;b=k;f=c[5755]|0;a=f&128;g=a<<9;h=g+-1|0;j=c[5639]|0;i=(h&j)+(c[5686]|0)|0;a:do if(f&48){f=c[5633]|0;if(!(f&h)){j=0;l=k;return j|0}do if((i&3|a|0)==0&(c[5646]|0)==1){e=(4096-(i&4095)|0)>>>2;e=f>>>0>e>>>0?e:f;if(Qg(b,i,1)|0){j=-1;l=k;return j|0}d=c[b>>2]|0;if(!d)break;b=c[5632]|0;if((e|0)>0){a=0;do{c[d+(a<<2)>>2]=b;a=a+1|0}while(a>>>0<e>>>0)}c[5639]=(e<<2)+j;j=f-e|0;c[5633]=j;if(!j)break a;else a=1;l=k;return a|0}while(0);a=c[5632]|0;b=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((b|i)&3){if(Bf(i,a,2,2)|0){j=-1;l=k;return j|0}}else c[b+i>>2]=a;i=0-g|0;c[5639]=(c[5646]<<2)+j&h|j&i;j=f+-1&h;c[5633]=j|f&i;if(j|0){j=1;l=k;return j|0}}else{a=c[5632]|0;b=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((b|i)&3){if(Bf(i,a,2,2)|0){j=-1;l=k;return j|0}}else c[b+i>>2]=a;c[5639]=(c[5646]<<2)+j&h|j&0-g}while(0);j=0;l=k;return j|0}function Yf(){var a=0,b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=c[5755]|0;h=f<<9&65536;i=h+-1|0;e=f&15;j=c[5638]|0;k=c[5639]|0;e=(i&j)+(c[22740+(((e|0)==0?3:e+-1|0)<<4)+4>>2]|0)|0;g=(i&k)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&i)){k=0;return k|0}a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if(b&1)if(!(zf(e,0,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=d[b+e>>0]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(g,0,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=d[a+g>>0]|0;while(0);c[5641]=a;a=b-a<<24;c[5642]=a>>24;c[5643]=6;h=0-h|0;b=c[5646]|0;c[5638]=b+j&i|j&h;c[5639]=b+k&i|k&h;b=f+-1&i;c[5633]=b|f&h;a=(a|0)==0;if(!(c[5755]&16)){if(a){k=0;return k|0}}else if(!a){k=0;return k|0}if(b|0){k=1;return k|0}}else{a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if(b&1)if(!(zf(e,0,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=d[b+e>>0]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(g,0,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=d[a+g>>0]|0;while(0);c[5641]=a;c[5642]=b-a<<24>>24;c[5643]=6;h=0-h|0;g=c[5646]|0;c[5638]=g+j&i|j&h;c[5639]=g+k&i|k&h}k=0;return k|0}function Zf(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=c[5755]|0;h=f<<9&65536;i=h+-1|0;e=f&15;j=c[5638]|0;k=c[5639]|0;e=(i&j)+(c[22740+(((e|0)==0?3:e+-1|0)<<4)+4>>2]|0)|0;g=(i&k)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&i)){k=0;return k|0}a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if((b|e)&3)if(!(zf(e,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{k=-1;return k|0}else{d=a;a=b+e|0}while(0);b=c[a>>2]|0;a=c[23084+(d+(g>>>12)<<2)>>2]|0;if((a|g)&3)if(!(zf(g,2,0,2)|0))a=23048;else{k=-1;return k|0}else a=a+g|0;a=c[a>>2]|0;c[5641]=a;a=b-a|0;c[5642]=a;c[5643]=8;h=0-h|0;b=c[5646]<<2;c[5638]=b+j&i|j&h;c[5639]=b+k&i|k&h;b=f+-1&i;c[5633]=b|f&h;a=(a|0)==0;if(!(c[5755]&16)){if(a){k=0;return k|0}}else if(!a){k=0;return k|0}if(b|0){k=1;return k|0}}else{a=c[5770]|0;b=c[23084+(a+(e>>>12)<<2)>>2]|0;do if((b|e)&3)if(!(zf(e,2,0,2)|0)){d=c[5770]|0;a=23048;break}else{k=-1;return k|0}else{d=a;a=b+e|0}while(0);b=c[a>>2]|0;a=c[23084+(d+(g>>>12)<<2)>>2]|0;if((a|g)&3)if(!(zf(g,2,0,2)|0))a=23048;else{k=-1;return k|0}else a=a+g|0;g=c[a>>2]|0;c[5641]=g;c[5642]=b-g;c[5643]=8;h=0-h|0;g=c[5646]<<2;c[5638]=g+j&i|j&h;c[5639]=g+k&i|k&h}k=0;return k|0}function _f(){var a=0,b=0,e=0,f=0,g=0,h=0;e=c[5755]|0;f=e<<9&65536;g=f+-1|0;b=e&15;h=c[5638]|0;b=(g&h)+(c[22740+(((b|0)==0?3:b+-1|0)<<4)+4>>2]|0)|0;if(e&48){e=c[5633]|0;if(!(e&g)){h=0;return h|0}a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(b,0,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=d[a+b>>0]|0;while(0);c[5632]=c[5632]&-256|a;f=0-f|0;c[5638]=(c[5646]|0)+h&g|h&f;h=e+-1&g;c[5633]=h|e&f;if(h|0){h=1;return h|0}}else{a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(b,0,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=d[a+b>>0]|0;while(0);c[5632]=c[5632]&-256|a;c[5638]=(c[5646]|0)+h&g|h&0-f}h=0;return h|0}function $f(){var a=0,b=0,d=0,e=0,f=0,g=0;d=c[5755]|0;e=d<<9&65536;f=e+-1|0;b=d&15;g=c[5638]|0;b=(f&g)+(c[22740+(((b|0)==0?3:b+-1|0)<<4)+4>>2]|0)|0;if(d&48){d=c[5633]|0;if(!(d&f)){g=0;return g|0}a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;if((a|b)&3)if(!(zf(b,2,0,2)|0))a=23048;else{g=-1;return g|0}else a=a+b|0;c[5632]=c[a>>2];e=0-e|0;c[5638]=(c[5646]<<2)+g&f|g&e;g=d+-1&f;c[5633]=g|d&e;if(g|0){g=1;return g|0}}else{a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;if((a|b)&3)if(!(zf(b,2,0,2)|0))a=23048;else{g=-1;return g|0}else a=a+b|0;c[5632]=c[a>>2];c[5638]=(c[5646]<<2)+g&f|g&0-e}g=0;return g|0}function ag(){var a=0,b=0,e=0,f=0,g=0,h=0,i=0;b=c[5755]|0;g=b<<9&65536;h=g+-1|0;i=c[5639]|0;e=(h&i)+(c[5686]|0)|0;if(b&48){f=c[5633]|0;if(!(f&h)){i=0;return i|0}a=c[23084+((c[5770]|0)+(e>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(e,0,0,2)|0)){a=c[5762]|0;e=c[5755]|0;break}else{i=-1;return i|0}else{a=d[a+e>>0]|0;e=b}while(0);b=c[5632]|0;c[5641]=a;a=b-a<<24;c[5642]=a>>24;c[5643]=6;g=0-g|0;c[5639]=(c[5646]|0)+i&h|i&g;b=f+-1&h;c[5633]=b|f&g;a=(a|0)==0;if(!(e&16)){if(a){i=0;return i|0}}else if(!a){i=0;return i|0}if(b|0){i=1;return i|0}}else{a=c[23084+((c[5770]|0)+(e>>>12)<<2)>>2]|0;do if(a&1)if(!(zf(e,0,0,2)|0)){a=c[5762]|0;break}else{i=-1;return i|0}else a=d[a+e>>0]|0;while(0);f=c[5632]|0;c[5641]=a;c[5642]=f-a<<24>>24;c[5643]=6;c[5639]=(c[5646]|0)+i&h|i&0-g}i=0;return i|0}function bg(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;a=c[5755]|0;g=a<<9&65536;h=g+-1|0;i=c[5639]|0;d=(h&i)+(c[5686]|0)|0;if(a&48){e=c[5633]|0;if(!(e&h)){i=0;return i|0}b=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((b|d)&3)if(!(zf(d,2,0,2)|0)){f=c[5755]|0;a=23048;break}else{i=-1;return i|0}else{f=a;a=b+d|0}while(0);a=c[a>>2]|0;b=c[5632]|0;c[5641]=a;a=b-a|0;c[5642]=a;c[5643]=8;g=0-g|0;c[5639]=(c[5646]<<2)+i&h|i&g;b=e+-1&h;c[5633]=b|e&g;a=(a|0)==0;if(!(f&16)){if(a){i=0;return i|0}}else if(!a){i=0;return i|0}if(b|0){i=1;return i|0}}else{a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;if((a|d)&3)if(!(zf(d,2,0,2)|0))a=23048;else{i=-1;return i|0}else a=a+d|0;f=c[a>>2]|0;e=c[5632]|0;c[5641]=f;c[5642]=e-f;c[5643]=8;c[5639]=(c[5646]<<2)+i&h|i&0-g}i=0;return i|0}function cg(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[5634]|0;e=d&65535;d=ig(d&65535,0,0)|0;if((d|0)<0){if((c[5746]|0)!=32){j=d;return j|0}b=c[5755]|0;if(b&48){b=(c[5766]|0)+120|0;i=b;j=c[i+4>>2]|0;c[b>>2]=c[i>>2]|8;c[b+4>>2]=j;b=c[5755]|0}j=(c[5766]|0)+120|0;i=j;h=c[i+4>>2]|0;c[j>>2]=c[i>>2]|(b&128^128)+128;c[j+4>>2]=h;j=(c[5766]|0)+120|0;h=j;i=c[h+4>>2]|0;c[j>>2]=c[h>>2]|4;c[j+4>>2]=i;j=d;return j|0}f=c[5755]|0;g=f<<9&65536;h=g+-1|0;i=c[5639]|0;j=(h&i)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&h)){j=0;return j|0}b=j>>>12;if(c[8411692+((c[5770]|0)+b<<2)>>2]&1|0?zf(j,0,1,2)|0:0){j=-1;return j|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,e,0)|0;b=c[8411692+((c[5770]|0)+b<<2)>>2]|0;if(b&1){if(Bf(j,d,0,2)|0){j=-1;return j|0}}else a[b+j>>0]=d;g=0-g|0;c[5639]=(c[5646]|0)+i&h|i&g;j=f+-1&h;c[5633]=j|f&g;if(j|0){j=1;return j|0}}else{b=j>>>12;if(c[8411692+((c[5770]|0)+b<<2)>>2]&1|0?zf(j,0,1,2)|0:0){j=-1;return j|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,e,0)|0;b=c[8411692+((c[5770]|0)+b<<2)>>2]|0;if(b&1){if(Bf(j,d,0,2)|0){j=-1;return j|0}}else a[b+j>>0]=d;c[5639]=(c[5646]|0)+i&h|i&0-g}j=0;return j|0}function dg(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=c[5634]|0;d=b&65535;b=ig(b&65535,2,0)|0;if((b|0)<0){if((c[5746]|0)!=32){i=b;return i|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;h=a;i=c[h+4>>2]|0;c[a>>2]=c[h>>2]|8;c[a+4>>2]=i;a=c[5755]|0}i=(c[5766]|0)+120|0;h=i;g=c[h+4>>2]|0;c[i>>2]=c[h>>2]|(a&128^128)+128;c[i+4>>2]=g;i=(c[5766]|0)+120|0;g=i;h=c[g+4>>2]|0;c[i>>2]=c[g>>2]|4;c[i+4>>2]=h;i=b;return i|0}e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5639]|0;i=(g&h)+(c[5686]|0)|0;if(e&48){e=c[5633]|0;if(!(e&g)){i=0;return i|0}a=i>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|i)&3|0?zf(i,2,1,2)|0:0){i=-1;return i|0}b=Ya[c[16808512>>2]&63](c[4202130]|0,d,2)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){i=-1;return i|0}}else c[a+i>>2]=b;f=0-f|0;c[5639]=(c[5646]<<2)+h&g|h&f;i=e+-1&g;c[5633]=i|e&f;if(i|0){i=1;return i|0}}else{a=i>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|i)&3|0?zf(i,2,1,2)|0:0){i=-1;return i|0}b=Ya[c[16808512>>2]&63](c[4202130]|0,d,2)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|i)&3){if(Bf(i,b,2,2)|0){i=-1;return i|0}}else c[a+i>>2]=b;c[5639]=(c[5646]<<2)+h&g|h&0-f}i=0;return i|0}function eg(){var a=0,b=0,e=0,f=0,g=0,h=0,i=0,j=0;b=c[5634]|0;j=b&65535;e=c[5755]&15;e=(e|0)==0?3:e+-1|0;b=ig(b&65535,0,0)|0;if((b|0)<0){if((c[5746]|0)!=32){j=b;return j|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;i=a;j=c[i+4>>2]|0;c[a>>2]=c[i>>2]|8;c[a+4>>2]=j;a=c[5755]|0}h=(c[5766]|0)+120|0;g=h;j=c[g+4>>2]|0;c[h>>2]=c[g>>2]|(a&128^128)+128;c[h+4>>2]=j;h=e<<10|4;j=(c[5766]|0)+120|0;g=j;i=c[g+4>>2]|((h|0)<0)<<31>>31;c[j>>2]=c[g>>2]|h;c[j+4>>2]=i;j=b;return j|0}f=c[5755]|0;g=f<<9&65536;h=g+-1|0;i=c[5638]|0;if(f&48){f=c[5633]|0;if(!(f&h)){j=0;return j|0}a=(c[22740+(e<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if(b&1)if(!(zf(a,0,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=d[b+a>>0]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,0);g=0-g|0;c[5638]=(c[5646]|0)+i&h|i&g;j=f+-1&h;c[5633]=j|f&g;if(j|0){j=1;return j|0}}else{a=(c[22740+(e<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if(b&1)if(!(zf(a,0,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=d[b+a>>0]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,0);c[5638]=(c[5646]|0)+i&h|i&0-g}j=0;return j|0}function fg(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=c[5634]|0;i=b&65535;d=c[5755]&15;d=(d|0)==0?3:d+-1|0;b=ig(b&65535,2,0)|0;if((b|0)<0){if((c[5746]|0)!=32){i=b;return i|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;h=a;i=c[h+4>>2]|0;c[a>>2]=c[h>>2]|8;c[a+4>>2]=i;a=c[5755]|0}g=(c[5766]|0)+120|0;f=g;i=c[f+4>>2]|0;c[g>>2]=c[f>>2]|(a&128^128)+128;c[g+4>>2]=i;g=d<<10|4;i=(c[5766]|0)+120|0;f=i;h=c[f+4>>2]|((g|0)<0)<<31>>31;c[i>>2]=c[f>>2]|g;c[i+4>>2]=h;i=b;return i|0}e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5638]|0;if(e&48){e=c[5633]|0;if(!(e&g)){i=0;return i|0}a=(c[22740+(d<<4)+4>>2]|0)+(g&h)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;if((b|a)&3)if(!(zf(a,2,0,2)|0))a=23048;else{i=-1;return i|0}else a=b+a|0;gb[c[16808516>>2]&63](c[4202130]|0,i,c[a>>2]|0,2);f=0-f|0;c[5638]=(c[5646]<<2)+h&g|h&f;i=e+-1&g;c[5633]=i|e&f;if(i|0){i=1;return i|0}}else{a=(c[22740+(d<<4)+4>>2]|0)+(g&h)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;if((b|a)&3)if(!(zf(a,2,0,2)|0))a=23048;else{i=-1;return i|0}else a=b+a|0;gb[c[16808516>>2]&63](c[4202130]|0,i,c[a>>2]|0,2);c[5638]=(c[5646]<<2)+h&g|h&0-f}i=0;return i|0}function gg(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;u=l;l=l+160|0;j=u+144|0;s=u+128|0;t=u+16|0;r=u;k=u+112|0;m=u+96|0;n=u+80|0;o=u+64|0;p=u+48|0;q=u+32|0;a:do switch(f|0){case 8:{s=(c[5648]|0)+7|0;t=s&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;s=22608+((g+1+s&7)<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 57:case 41:case 9:{t=c[5648]|0;s=22608+((t+g&7)<<4)|0;c[j>>2]=c[s>>2];c[j+4>>2]=c[s+4>>2];c[j+8>>2]=c[s+8>>2];c[j+12>>2]=c[s+12>>2];t=22608+(t<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2];t=0;l=u;return t|0}case 10:{if(!g){h=c[5732]|0;if(h&12|0){c[5746]=7;c[5747]=0;t=-1;l=u;return t|0}if((h&32|0)==0|(b[11298]&128)==0){t=0;l=u;return t|0}c[5746]=16;c[5747]=0;t=-1;l=u;return t|0}break}case 12:switch(g|0){case 0:{t=22608+(c[5648]<<4)+8|0;b[t>>1]=b[t>>1]^-32768;t=0;l=u;return t|0}case 1:{t=22608+(c[5648]<<4)+8|0;b[t>>1]=b[t>>1]&32767;t=0;l=u;return t|0}case 4:{t=22608+(c[5648]<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[2600];c[j+4>>2]=c[2601];c[j+8>>2]=c[2602];c[j+12>>2]=c[2603];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=0;l=u;return t|0}case 5:{i=c[5648]|0;j=22608+(i<<4)|0;g=c[j>>2]|0;j=c[j+4>>2]|0;i=b[22608+(i<<4)+8>>1]|0;h=b[11298]&-18177|(i&65535)>>>6&512;b[11298]=h;i=i&32767;b:do if(i<<16>>16<32767){switch(i<<16>>16){case 0:break;default:break b}h=h&65535;if((g|0)==0&(j|0)==0){b[11298]=h|16384;t=0;l=u;return t|0}else{b[11298]=h|17408;t=0;l=u;return t|0}}else{switch(i<<16>>16){case 32767:break;default:break b}if((j|0)>=0){t=0;l=u;return t|0}h=h&65535;if((g|0)==0&(j|0)==-2147483648){b[11298]=h|1280;t=0;l=u;return t|0}else{b[11298]=h|256;t=0;l=u;return t|0}}while(0);b[11298]=h|1024;t=0;l=u;return t|0}default:break a}case 13:{if((g|0)!=7){t=(c[5648]|0)+7&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;s=10304+(g<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}break}case 14:switch(g|0){case 0:{c[s>>2]=c[5684];Zh(80,s);r=22608+(c[5648]<<4)|0;c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];Ii(t,j,s);c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];t=0;l=u;return t|0}case 1:{c[t>>2]=c[5684];Zh(80,t);p=c[5648]|0;q=22608+((p+1&7)<<4)|0;p=22608+(p<<4)|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Ri(r,s,j,t);c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 2:{c[j>>2]=c[5684];Zh(80,j);t=(Qi(22608+(c[5648]<<4)|0,j)|0)==0;h=e[11298]|0;if(t){b[11298]=h&64511;t=(c[5648]|0)+7&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;c[t>>2]=c[2576];c[t+4>>2]=c[2577];c[t+8>>2]=c[2578];c[t+12>>2]=c[2579]}else b[11298]=h|1024;t=0;l=u;return t|0}case 3:{c[t>>2]=c[5684];Zh(80,t);p=c[5648]|0;q=22608+((p+1&7)<<4)|0;p=22608+(p<<4)|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Ji(r,s,j,t);c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 4:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Ei(s,j,22736);t=c[5648]|0;r=22608+(t<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];t=t+7&7;c[5648]=t;a[22600+t>>0]=0;t=22608+(t<<4)|0;c[t>>2]=c[j>>2];c[t+4>>2]=c[j+4>>2];c[t+8>>2]=c[j+8>>2];c[t+12>>2]=c[j+12>>2];t=0;l=u;return t|0}case 5:{b[11298]=b[11298]&-18177;h=c[5648]|0;q=22608+(h<<4)|0;h=22608+((h+1&7)<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];h=Ki(s,j,t,r,22736)|0;if((h|0)>-1){if(!h){h=c[r>>2]|0;if(!((h&1|0)==0&0==0))b[11298]=b[11298]|512;if(!((h&2|0)==0&0==0))b[11298]=b[11298]|16384;if(!((h&4|0)==0&0==0)){h=256;i=40}}else{h=1024;i=40}if((i|0)==40)b[11298]=b[11298]|h;s=22608+(c[5648]<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 6:{c[5648]=(c[5648]|0)+7&7;b[11298]=b[11298]&-18177;t=0;l=u;return t|0}default:{c[5648]=(c[5648]|0)+1&7;b[11298]=b[11298]&-18177;t=0;l=u;return t|0}}case 15:switch(g|0){case 0:{b[11298]=b[11298]&-18177;h=c[5648]|0;q=22608+(h<<4)|0;h=22608+((h+1&7)<<4)|0;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];h=Ni(s,j,t,r,22736)|0;if((h|0)>-1){if(!h){h=c[r>>2]|0;if(!((h&1|0)==0&0==0))b[11298]=b[11298]|512;if(!((h&2|0)==0&0==0))b[11298]=b[11298]|16384;if(!((h&4|0)==0&0==0)){h=256;i=53}}else{h=1024;i=53}if((i|0)==53)b[11298]=b[11298]|h;s=22608+(c[5648]<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 1:{c[t>>2]=c[5684];Zh(80,t);p=c[5648]|0;q=22608+((p+1&7)<<4)|0;p=22608+(p<<4)|0;c[s>>2]=c[p>>2];c[s+4>>2]=c[p+4>>2];c[s+8>>2]=c[p+8>>2];c[s+12>>2]=c[p+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Si(r,s,j,t);c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 2:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];si(s,j,22736);c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 3:{r=22608+(c[5648]<<4)|0;c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];r=(Oi(j,s,t,22736)|0)<0;h=e[11298]|0;if(r)b[11298]=h|1024;else{b[11298]=h&64511;r=c[5648]|0;q=22608+(r<<4)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];s=r+7&7;c[5648]=s;a[22600+s>>0]=0;s=22608+(s<<4)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 5:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+1&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[q>>2];c[j+4>>2]=c[q+4>>2];c[j+8>>2]=c[q+8>>2];c[j+12>>2]=c[q+12>>2];Fi(t,s,j,22736);c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];t=0;l=u;return t|0}case 4:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];ki(s,j,22736);c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 6:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=(Oi(j,s,0,22736)|0)<0;h=e[11298]|0;if(t)b[11298]=h|1024;else{b[11298]=h&64511;t=22608+(c[5648]<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}t=0;l=u;return t|0}default:{t=22608+(c[5648]<<4)|0;c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=(Oi(j,0,s,22736)|0)<0;h=e[11298]|0;if(t)b[11298]=h|1024;else{b[11298]=h&64511;t=22608+(c[5648]<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2]}t=0;l=u;return t|0}}case 7:case 6:case 5:case 4:case 39:case 38:case 37:case 36:case 55:case 54:case 53:case 52:case 49:case 48:case 33:case 32:case 1:case 0:{h=c[5648]|0;i=22608+(h<<4)|0;h=22608+((h+g&7)<<4)|0;c[t>>2]=c[i>>2];c[t+4>>2]=c[i+4>>2];c[t+8>>2]=c[i+8>>2];c[t+12>>2]=c[i+12>>2];c[r>>2]=c[h>>2];c[r+4>>2]=c[h+4>>2];c[r+8>>2]=c[h+8>>2];c[r+12>>2]=c[h+12>>2];switch(f&7){case 0:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];li(k,s,j,22736);c[t>>2]=c[k>>2];c[t+4>>2]=c[k+4>>2];c[t+8>>2]=c[k+8>>2];c[t+12>>2]=c[k+12>>2];break}case 1:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];qi(m,s,j,22736);c[t>>2]=c[m>>2];c[t+4>>2]=c[m+4>>2];c[t+8>>2]=c[m+8>>2];c[t+12>>2]=c[m+12>>2];break}case 4:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];pi(n,s,j,22736);c[t>>2]=c[n>>2];c[t+4>>2]=c[n+4>>2];c[t+8>>2]=c[n+8>>2];c[t+12>>2]=c[n+12>>2];break}case 5:{c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];pi(o,s,j,22736);c[t>>2]=c[o>>2];c[t+4>>2]=c[o+4>>2];c[t+8>>2]=c[o+8>>2];c[t+12>>2]=c[o+12>>2];break}case 6:{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[j>>2]=c[r>>2];c[j+4>>2]=c[r+4>>2];c[j+8>>2]=c[r+8>>2];c[j+12>>2]=c[r+12>>2];ri(p,s,j,22736);c[t>>2]=c[p>>2];c[t+4>>2]=c[p+4>>2];c[t+8>>2]=c[p+8>>2];c[t+12>>2]=c[p+12>>2];break}default:{c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];ri(q,s,j,22736);c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2]}}if((f|0)>31){c[h>>2]=c[t>>2];c[h+4>>2]=c[t+4>>2];c[h+8>>2]=c[t+8>>2];c[h+12>>2]=c[t+12>>2];if((f|0)>47){t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7}}else{c[i>>2]=c[t>>2];c[i+4>>2]=c[t+4>>2];c[i+8>>2]=c[t+8>>2];c[i+12>>2]=c[t+12>>2]}t=0;l=u;return t|0}case 34:case 2:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=0;l=u;return t|0}case 50:case 35:case 3:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 21:{if((g|0)==1){q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+1&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,1,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;a[22600+(t+1&7)>>0]=1;c[5648]=t+2&7;t=0;l=u;return t|0}break}case 28:switch(g|0){case 2:{b[11298]=b[11298]&32512;t=0;l=u;return t|0}case 3:{b[11298]=0;c[5648]=0;b[11299]=895;t=22600;c[t>>2]=16843009;c[t+4>>2]=16843009;Yh(0,22736);t=(e[11299]|0)>>>8&255;Zh((t&3)==0?32:(t&3)==2?64:80,22736);t=0;l=u;return t|0}case 4:case 1:case 0:{t=0;l=u;return t|0}default:break a}case 29:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Ug(s,j);t=0;l=u;return t|0}case 30:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Vg(s,j);t=0;l=u;return t|0}case 40:{a[22600+((c[5648]|0)+g&7)>>0]=1;t=0;l=u;return t|0}case 42:{s=c[5648]|0;t=22608+((s+g&7)<<4)|0;s=22608+(s<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}case 59:case 58:case 11:case 43:{t=c[5648]|0;s=22608+((t+g&7)<<4)|0;r=22608+(t<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 44:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,1,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=0;l=u;return t|0}case 45:{q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+g&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,1,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 51:{if((g|0)==1){q=c[5648]|0;r=22608+(q<<4)|0;q=22608+((q+1&7)<<4)|0;c[t>>2]=c[q>>2];c[t+4>>2]=c[q+4>>2];c[t+8>>2]=c[q+8>>2];c[t+12>>2]=c[q+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];t=Gi(s,j,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(t+1<<1)>>1];t=c[5648]|0;a[22600+t>>0]=1;a[22600+(t+1&7)>>0]=1;c[5648]=t+2&7;t=0;l=u;return t|0}break}case 56:{t=c[5648]|0;a[22600+(t+g&7)>>0]=1;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 60:{if(!g){c[5632]=c[5632]&-65536|b[11298]&-14337&65535|c[5648]<<11&63488;t=0;l=u;return t|0}break}case 61:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Ug(s,j);t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 62:{t=c[5648]|0;r=22608+(t<<4)|0;t=22608+((t+g&7)<<4)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[j>>2]=c[t>>2];c[j+4>>2]=c[t+4>>2];c[j+8>>2]=c[t+8>>2];c[j+12>>2]=c[t+12>>2];Vg(s,j);t=c[5648]|0;a[22600+t>>0]=1;c[5648]=t+1&7;t=0;l=u;return t|0}case 19:case 18:case 17:case 16:case 27:case 26:case 25:case 24:{c:do switch(f&3){case 0:{h=nf(22528)|0;break}case 1:{h=(c[5642]|0)==0&1;break}case 2:{h=Of()|0;break}case 3:if((c[5643]|0)==24){h=(c[5641]|0)>>>2&1;break c}else{h=d[21168+(c[5642]&255)>>0]|0;break c}default:{}}while(0);if((h|0)==(f>>>3&1|0)){t=0;l=u;return t|0}s=c[5648]|0;t=22608+(s<<4)|0;s=22608+((s+g&7)<<4)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];t=0;l=u;return t|0}default:{}}while(0);c[5746]=6;c[5747]=0;t=-1;l=u;return t|0}function hg(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+224|0;C=D+208|0;r=D+64|0;v=D;j=D+192|0;m=D+176|0;q=D+160|0;n=D+144|0;w=D+128|0;x=D+112|0;z=D+96|0;s=D+80|0;t=D+48|0;u=D+32|0;p=D+16|0;a:do switch(f|0){case 8:case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:case 24:case 23:case 22:case 21:case 20:case 19:case 18:case 17:case 16:case 40:case 39:case 38:case 37:case 36:case 35:case 34:case 33:case 32:case 56:case 55:case 54:case 53:case 52:case 51:case 50:case 49:case 48:{switch(f>>>4&268435455|0){case 0:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+g|0;ci(j,c[h>>2]|0,22736);c[v>>2]=c[j>>2];c[v+4>>2]=c[j+4>>2];c[v+8>>2]=c[j+8>>2];c[v+12>>2]=c[j+12>>2];break}case 1:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+g|0;$h(m,c[h>>2]|0,22736);c[v>>2]=c[m>>2];c[v+4>>2]=c[m+4>>2];c[v+8>>2]=c[m+8>>2];c[v+12>>2]=c[m+12>>2];break}case 2:{h=c[5770]|0;i=c[23084+(h+(g>>>12)<<2)>>2]|0;do if((i|g)&3)if(!(zf(g,2,0,2)|0)){h=c[5770]|0;i=23048;break}else{g=-1;l=D;return g|0}else i=i+g|0;while(0);j=c[i>>2]|0;i=g+4|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+i|0;di(q,j,c[h>>2]|0,22736);c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];break}default:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+g|0;$h(n,c[h>>2]<<16>>16,22736);c[v>>2]=c[n>>2];c[v+4>>2]=c[n+4>>2];c[v+8>>2]=c[n+8>>2];c[v+12>>2]=c[n+12>>2]}}switch(f&15){case 0:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];li(w,r,C,22736);c[g>>2]=c[w>>2];c[g+4>>2]=c[w+4>>2];c[g+8>>2]=c[w+8>>2];c[g+12>>2]=c[w+12>>2];break a}case 1:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];qi(x,r,C,22736);c[g>>2]=c[x>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];c[g+12>>2]=c[x+12>>2];break a}case 2:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];g=Gi(r,C,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(g+1<<1)>>1];break a}case 3:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];g=Gi(r,C,0,22736)|0;b[11298]=b[11298]&-17665|b[15272+(g+1<<1)>>1];g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break a}case 4:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];pi(z,r,C,22736);c[g>>2]=c[z>>2];c[g+4>>2]=c[z+4>>2];c[g+8>>2]=c[z+8>>2];c[g+12>>2]=c[z+12>>2];break a}case 5:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];c[C>>2]=c[g>>2];c[C+4>>2]=c[g+4>>2];c[C+8>>2]=c[g+8>>2];c[C+12>>2]=c[g+12>>2];pi(s,r,C,22736);c[g>>2]=c[s>>2];c[g+4>>2]=c[s+4>>2];c[g+8>>2]=c[s+8>>2];c[g+12>>2]=c[s+12>>2];break a}case 6:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[g>>2];c[r+4>>2]=c[g+4>>2];c[r+8>>2]=c[g+8>>2];c[r+12>>2]=c[g+12>>2];c[C>>2]=c[v>>2];c[C+4>>2]=c[v+4>>2];c[C+8>>2]=c[v+8>>2];c[C+12>>2]=c[v+12>>2];ri(t,r,C,22736);c[g>>2]=c[t>>2];c[g+4>>2]=c[t+4>>2];c[g+8>>2]=c[t+8>>2];c[g+12>>2]=c[t+12>>2];break a}case 7:{g=22608+(c[5648]<<4)|0;c[r>>2]=c[v>>2];c[r+4>>2]=c[v+4>>2];c[r+8>>2]=c[v+8>>2];c[r+12>>2]=c[v+12>>2];c[C>>2]=c[g>>2];c[C+4>>2]=c[g+4>>2];c[C+8>>2]=c[g+8>>2];c[C+12>>2]=c[g+12>>2];ri(u,r,C,22736);c[g>>2]=c[u>>2];c[g+4>>2]=c[u+4>>2];c[g+8>>2]=c[u+8>>2];c[g+12>>2]=c[u+12>>2];break a}default:{g=(c[5648]|0)+7&7;c[5648]=g;a[22600+g>>0]=0;g=22608+(g<<4)|0;c[g>>2]=c[v>>2];c[g+4>>2]=c[v+4>>2];c[g+8>>2]=c[v+8>>2];c[g+12>>2]=c[v+12>>2];break a}}}case 11:case 10:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=ii(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 27:case 26:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=ei(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 43:case 42:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=ji(C,22736)|0;j=y;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 59:case 58:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=Ci(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&1){if(Bf(g,h<<16>>16,1,2)|0){g=-1;l=D;return g|0}}else b[i+g>>1]=h;if(f&1|0){g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7}break}case 25:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=fi(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 41:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=hi(C,22736)|0;j=y;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 57:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=Di(C,22736)|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&1){if(Bf(g,h<<16>>16,1,2)|0){g=-1;l=D;return g|0}}else b[i+g>>1]=h;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 12:{if(Sg(g,(c[5755]|0)>>>8&1^1)|0){g=-1;l=D;return g|0}break}case 13:{h=c[23084+((c[5770]|0)+(g>>>12)<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,2)|0)){h=c[5762]|0;break}else{g=-1;l=D;return g|0}else h=e[h+g>>1]|0;while(0);g=h&65535;b[11299]=g;switch((g&65535)>>>10&3){case 0:{i=0;break}case 1:{i=1;break}case 2:{i=2;break}case 3:{i=3;break}default:{}}Yh(i,22736);g=(e[11299]|0)>>>8&255;Zh((g&3)==0?32:(g&3)==2?64:80,22736);break}case 14:{if(Tg(g,(c[5755]|0)>>>8&1^1)|0){g=-1;l=D;return g|0}break}case 15:{h=b[11299]|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){b[i+g>>1]=h;break a}if(Bf(g,h&65535,1,2)|0){g=-1;l=D;return g|0}break}case 29:{h=c[5770]|0;i=c[23084+(h+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(!(zf(g,2,0,2)|0)){k=c[5770]|0;o=23048;A=90}}else{k=h;o=i+g|0;A=90}do if((A|0)==90){m=c[o>>2]|0;h=g+4|0;i=c[23084+(k+(h>>>12)<<2)>>2]|0;if(!((i|h)&3))h=i+h|0;else{if(zf(h,2,0,2)|0)break;k=c[5770]|0;h=23048}j=c[h>>2]|0;i=g+8|0;h=c[23084+(k+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0)break;h=c[5762]|0}f=(c[5648]|0)+7&7;c[5648]=f;a[22600+f>>0]=0;g=22608+(f<<4)|0;B=g;c[B>>2]=m;c[B+4>>2]=j;b[22608+(f<<4)+8>>1]=h;g=g+10|0;b[g>>1]=b[C>>1]|0;b[g+2>>1]=b[C+2>>1]|0;b[g+4>>1]=b[C+4>>1]|0;break a}while(0);g=-1;l=D;return g|0}case 31:{k=c[5648]|0;j=22608+(k<<4)|0;h=c[j>>2]|0;j=c[j+4>>2]|0;k=b[22608+(k<<4)+8>>1]|0;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;h=g+8|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1){if(Bf(h,k&65535,1,2)|0){g=-1;l=D;return g|0}}else b[i+h>>1]=k;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 44:{h=(c[5755]|0)>>>8&1^1;b:do if(!(Sg(g,h)|0)){m=(14<<h)+g|0;n=0;while(1){h=c[5770]|0;i=c[23084+(h+(m>>>12)<<2)>>2]|0;if(!((i|m)&3))i=i+m|0;else{if(zf(m,2,0,2)|0)break b;h=c[5770]|0;i=23048}k=c[i>>2]|0;i=m+4|0;j=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((j|i)&3))i=j+i|0;else{if(zf(i,2,0,2)|0)break b;h=c[5770]|0;i=23048}j=c[i>>2]|0;i=m+8|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if(!((h|i)&1))h=e[h+i>>1]|0;else{if(zf(i,1,0,2)|0)break b;h=c[5762]|0}f=(c[5648]|0)+n&7;g=22608+(f<<4)|0;B=g;c[B>>2]=k;c[B+4>>2]=j;b[22608+(f<<4)+8>>1]=h;g=g+10|0;b[g>>1]=b[C>>1]|0;b[g+2>>1]=b[C+2>>1]|0;b[g+4>>1]=b[C+4>>1]|0;n=n+1|0;if(n>>>0>=8)break;else m=m+10|0}break a}while(0);g=-1;l=D;return g|0}case 46:{h=(c[5755]|0)>>>8&1^1;if(Tg(g,h)|0){g=-1;l=D;return g|0}k=(14<<h)+g|0;m=0;while(1){n=(c[5648]|0)+m&7;j=22608+(n<<4)|0;h=c[j>>2]|0;j=c[j+4>>2]|0;n=b[22608+(n<<4)+8>>1]|0;i=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((i|k)&3){if(Bf(k,h,2,2)|0){B=-1;A=183;break}}else c[i+k>>2]=h;h=k+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){B=-1;A=183;break}}else c[i+h>>2]=j;h=k+8|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&1){if(Bf(h,n&65535,1,2)|0){B=-1;A=183;break}}else b[i+h>>1]=n;m=m+1|0;if(m>>>0>=8){A=139;break}else k=k+10|0}if((A|0)==139){b[11298]=0;c[5648]=0;b[11299]=895;g=22600;c[g>>2]=16843009;c[g+4>>2]=16843009;Yh(0,22736);g=(e[11299]|0)>>>8&255;Zh((g&3)==0?32:(g&3)==2?64:80,22736);break a}else if((A|0)==183){l=D;return B|0}break}case 47:{h=c[5648]<<11|b[11298]&-14337&65535;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if(!((i|g)&1)){b[i+g>>1]=h;break a}if(Bf(g,h,1,2)|0){g=-1;l=D;return g|0}break}case 60:{j=8;k=0;m=0;while(1){h=j+g|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1))h=d[i+h>>0]|0;else{if(zf(h,0,0,2)|0)break;h=c[5762]|0}B=Dl(k|0,m|0,100,0)|0;f=(h>>4)*10|0;B=xl(B|0,y|0,h&15|0,0)|0;k=xl(B|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;m=y;if(!j){A=149;break}else j=j+-1|0}do if((A|0)==149){h=g+9|0;i=c[23084+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(!(i&1))h=d[i+h>>0]|0;else{if(zf(h,0,0,2)|0)break;h=c[5762]|0}f=(h&128|0)==0;B=yl(0,0,k|0,m|0)|0;g=(c[5648]|0)+7&7;c[5648]=g;a[22600+g>>0]=0;g=22608+(g<<4)|0;bi(C,f?k:B,f?m:y,22736);c[g>>2]=c[C>>2];c[g+4>>2]=c[C+4>>2];c[g+8>>2]=c[C+8>>2];c[g+12>>2]=c[C+12>>2];break a}while(0);g=-1;l=D;return g|0}case 62:{i=22608+(c[5648]<<4)|0;c[C>>2]=c[i>>2];c[C+4>>2]=c[i+4>>2];c[C+8>>2]=c[i+8>>2];c[C+12>>2]=c[i+12>>2];i=gi(C,22736)|0;h=y;f=(h|0)<0;z=yl(0,0,i|0,h|0)|0;C=y;o=Il(i|0,h|0,56)|0;o=o&128;n=0;i=f?z:i;h=f?C:h;do{if((i|0)==0&(h|0)==0){j=0;i=0;h=0}else{f=Bl(i|0,h|0,100,0)|0;C=y;j=Dl(f|0,C|0,100,0)|0;i=yl(i|0,h|0,j|0,y|0)|0;j=(i|0)/10|0;j=j<<4|i-(j*10|0);i=f;h=C}k=n+g|0;m=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if(m&1){if(Bf(k,j,0,2)|0){B=-1;A=183;break}}else a[m+k>>0]=j;n=n+1|0}while(n>>>0<9);if((A|0)==183){l=D;return B|0}h=g+9|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if(i&1){if(Bf(h,o,0,2)|0){g=-1;l=D;return g|0}}else a[i+h>>0]=o;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}case 61:{h=c[5770]|0;i=c[23084+(h+(g>>>12)<<2)>>2]|0;do if((i|g)&3)if(!(zf(g,2,0,2)|0)){h=c[5770]|0;i=23048;break}else{g=-1;l=D;return g|0}else i=i+g|0;while(0);j=c[i>>2]|0;i=g+4|0;h=c[23084+(h+(i>>>12)<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,2)|0))h=23048;else{g=-1;l=D;return g|0}else h=h+i|0;C=c[h>>2]|0;g=(c[5648]|0)+7&7;c[5648]=g;a[22600+g>>0]=0;g=22608+(g<<4)|0;bi(p,j,C,22736);c[g>>2]=c[p>>2];c[g+4>>2]=c[p+4>>2];c[g+8>>2]=c[p+8>>2];c[g+12>>2]=c[p+12>>2];break}case 63:{h=22608+(c[5648]<<4)|0;c[C>>2]=c[h>>2];c[C+4>>2]=c[h+4>>2];c[C+8>>2]=c[h+8>>2];c[C+12>>2]=c[h+12>>2];h=gi(C,22736)|0;j=y;i=c[8411692+((c[5770]|0)+(g>>>12)<<2)>>2]|0;if((i|g)&3){if(Bf(g,h,2,2)|0){g=-1;l=D;return g|0}}else c[i+g>>2]=h;h=g+4|0;i=c[8411692+((c[5770]|0)+(h>>>12)<<2)>>2]|0;if((i|h)&3){if(Bf(h,j,2,2)|0){g=-1;l=D;return g|0}}else c[i+h>>2]=j;g=c[5648]|0;a[22600+g>>0]=1;c[5648]=g+1&7;break}default:{c[5746]=6;c[5747]=0;g=-1;l=D;return g|0}}while(0);g=0;l=D;return g|0}function ig(b,f,g){b=b|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=c[5647]|0;i=h>>>12&3;do if(c[5732]&1|0){if((h&131072|0)==0?i>>>0>=(d[22968]|0)>>>0:0)break;j=c[5715]|0;if(!((c[5716]&36608|0)!=35072|j>>>0<103)){h=(c[5714]|0)+102|0;i=c[23084+(h>>>12<<2)>>2]|0;do if((i|h)&1)if(!(zf(h,1,0,0)|0)){h=c[5762]|0;j=c[5715]|0;break}else{g=-1;return g|0}else h=e[i+h>>1]|0;while(0);k=b&65535;h=h+(k>>>3)|0;if((h+1|0)>>>0<=j>>>0){h=(c[5714]|0)+h|0;i=c[23084+(h>>>12<<2)>>2]|0;do if((i|h)&1)if(!(zf(h,1,0,0)|0)){h=c[5762]|0;break}else{g=-1;return g|0}else h=e[i+h>>1]|0;while(0);if(!(h>>>(k&7)&(1<<(1<<f))+-1))break}}c[5746]=13;c[5747]=0;g=-1;return g|0}while(0);h=c[5766]|0;if(!h){g=0;return g|0}if(!(c[h+12>>2]&134217728)){g=0;return g|0}k=b&65535;i=(c[h+64>>2]&-4096)+(k>>>3)|0;h=Ge(c[4202123]|0,i,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0)h=a[(c[h+40>>2]|0)+(i-(c[h+8>>2]|0))>>0]|0;else h=0;j=h&255;h=i+1|0;i=Ge(c[4202123]|0,h,0)|0;if((i|0)!=0?(c[i+32>>2]|0)!=0:0)h=a[(c[i+40>>2]|0)+(h-(c[i+8>>2]|0))>>0]|0;else h=0;if(!(((h&255)<<8|j)>>>(k&7)&(1<<(1<<f))+-1)){g=0;return g|0}c[5746]=32;b=(c[5766]|0)+112|0;c[b>>2]=123;c[b+4>>2]=0;f=1<<f+4|k<<16|g^1;g=(c[5766]|0)+120|0;c[g>>2]=f;c[g+4>>2]=((f|0)<0)<<31>>31;g=-1;return g|0}function jg(){var a=0,b=0,e=0,f=0,g=0;a=nf(22528)|0;if((c[5643]|0)==24)b=0;else{b=c[5642]|0;a=(d[21168+(b&255)>>0]|0)<<2|a;b=b>>>31<<7}uf()|0;b=b|a|(vf()|0);f=c[5632]|0;e=(b>>>4&1|(f&14)>>>0>9|0)==0;a=e?f:f+6|0;g=a&255;b=(b&1|g>>>0>159|0)==0;a=b?g:a+96&255;c[5632]=a|f&-256;b=(e?0:16)|(d[21168+a>>0]|0)<<2|(b^1)&1|((a|0)==0&1)<<6;c[5641]=b|a&128;c[5642]=b>>>6&1^1;c[5643]=24;return}function kg(){var a=0,b=0,e=0,f=0,g=0,h=0;a=nf(22528)|0;if((c[5643]|0)==24)b=0;else{b=c[5642]|0;a=(d[21168+(b&255)>>0]|0)<<2|a;b=b>>>31<<7}uf()|0;f=b|a|(vf()|0);b=f&1;h=c[5632]|0;e=h&255;f=(f>>>4&1|(h&14)>>>0>9|0)==0;a=f?e:h+250&255;g=(b|e>>>0>153|0)==0;a=g?a:a+160&255;c[5632]=a|h&-256;b=(d[21168+a>>0]|0)<<2|(g^1)&1|(f?0:e>>>0<6|(b|0)!=0?17:16)|((a|0)==0&1)<<6;c[5641]=b|a&128;c[5642]=b>>>6&1^1;c[5643]=24;return}function lg(){var a=0,b=0,e=0,f=0,g=0;a=nf(22528)|0;if((c[5643]|0)==24){g=c[5641]|0;b=g>>>7&1;a=g&4|a|((c[5642]|0)==0&1)<<6}else{g=c[5642]|0;b=g>>>31;a=(d[21168+(g&255)>>0]|0)<<2|a|((g|0)==0&1)<<6}b=b<<7|a|(uf()|0)<<11;b=b|(vf()|0);g=c[5632]|0;e=g>>>8;a=g&15;if(!(b>>>4&1|a>>>0>9)){f=b&-18;b=e}else{f=b|17;b=e+1+((g&254)>>>0>249&1)|0;a=g+6&15}c[5632]=a|g&-65536|b<<8&65280;c[5641]=f;c[5642]=f>>>6&1^1;c[5643]=24;return}function mg(){var a=0,b=0,e=0,f=0,g=0;a=nf(22528)|0;if((c[5643]|0)==24){g=c[5641]|0;b=g>>>7&1;a=g&4|a|((c[5642]|0)==0&1)<<6}else{g=c[5642]|0;b=g>>>31;a=(d[21168+(g&255)>>0]|0)<<2|a|((g|0)==0&1)<<6}b=b<<7|a|(uf()|0)<<11;b=b|(vf()|0);g=c[5632]|0;e=g>>>8;a=g&15;if(!(b>>>4&1|a>>>0>9)){f=b&-18;b=e}else{f=b|17;b=e+255+(((g&254)>>>0<6)<<31>>31)|0;a=g+10&15}c[5632]=a|g&-65536|b<<8&65280;c[5641]=f;c[5642]=f>>>6&1^1;c[5643]=24;return}function ng(a){a=a|0;var b=0,d=0,e=0;if(!a){c[5746]=0;c[5747]=0;a=-1;return a|0}else{d=c[5632]|0;e=d&255;b=(e|0)/(a|0)|0;a=e-(N(b,a)|0)|0;c[5632]=a|d&-65536|b<<8;c[5642]=a<<24>>24;c[5643]=12;a=0;return a|0}return 0}function og(a){a=a|0;var b=0;b=c[5632]|0;a=(N(b>>>8&255,a)|0)+b|0;c[5632]=a&255|b&-65536;c[5642]=a<<24>>24;c[5643]=12;return}function pg(a,f){a=a|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;k=(a&-64|0)==192;do if(!k){g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&1)){j=0;i=e[g+f>>1]|0;break}if(!(zf(f,1,1,2)|0)){j=0;i=c[5762]|0;break}else{f=-1;return f|0}}else{i=a&7;j=i;i=c[22528+(i<<2)>>2]&65535}while(0);h=c[22528+((a>>>3&7)<<2)>>2]|0;g=nf(22528)|0;if((c[5643]|0)==24){l=c[5641]|0;a=l>>>7&1;g=l&4|g|((c[5642]|0)==0&1)<<6}else{l=c[5642]|0;a=l>>>31;g=(d[21168+(l&255)>>0]|0)<<2|g|((l|0)==0&1)<<6}a=a<<7|g|(uf()|0)<<11;a=a|(vf()|0);c[5641]=a;g=h&3;if((i&3)>>>0<g>>>0){a=g|i&-4;do if(!k){g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&1)){b[g+f>>1]=a;break}if(Bf(f,a,1,2)|0){l=-1;return l|0}}else{l=22528+(j<<2)|0;c[l>>2]=c[l>>2]&-65536|a&65535}while(0);g=c[5641]|64}else g=a&-65;c[5641]=g;c[5642]=g>>>6&1^1;c[5643]=24;l=0;return l|0}function qg(a){a=a|0;var b=0;a:do switch(a>>1|0){case 0:{b=uf()|0;break}case 1:{b=nf(22528)|0;break}case 2:{b=(c[5642]|0)==0&1;break}case 3:{b=Of()|0;break}case 4:if((c[5643]|0)==24){b=(c[5641]|0)>>>7&1;break a}else{b=(c[5642]|0)>>>31;break a}case 5:if((c[5643]|0)==24){b=(c[5641]|0)>>>2&1;break a}else{b=d[21168+(c[5642]&255)>>0]|0;break a}case 6:{b=Pf()|0;break}case 7:{b=Qf()|0;break}default:ra()}while(0);return b^a&1|0}function rg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;f=(b|0)!=0;e=f?10:13;g=a&65535;h=a&65532;do if(!h){c[5710]=0;c[5711]=0}else{if(a&4|0){c[5746]=e;c[5747]=h;h=-1;return h|0}b=a&65528;if((b|7)>>>0>(c[5719]|0)>>>0){c[5746]=e;c[5747]=h;h=-1;return h|0}a=(c[5718]|0)+b|0;b=c[23084+(a>>>12<<2)>>2]|0;if((b|a)&3)if(!(zf(a,2,0,0)|0))b=23048;else{h=-1;return h|0}else b=b+a|0;d=c[b>>2]|0;b=a+4|0;a=c[23084+(b>>>12<<2)>>2]|0;if((a|b)&3)if(!(zf(b,2,0,0)|0))b=23048;else{h=-1;return h|0}else b=a+b|0;b=c[b>>2]|0;if((b&7936|0)!=512){c[5746]=e;c[5747]=h;h=-1;return h|0}if(b&32768|0){c[5710]=b&-16777216|d>>>16|b<<16&16711680;h=b&983040|d&65535;c[5711]=(b&8388608|0)==0?h:h<<12|4095;c[5712]=b;break}c[5746]=f?10:11;c[5747]=h;h=-1;return h|0}while(0);c[5709]=g;h=0;return h|0}function sg(a,b){a=a|0;b=b|0;var e=0,f=0,g=0;do if((a&65532|0)!=0?(e=(a>>>1&2^2)+6|0,(a|7)>>>0<=(c[22740+(e<<4)+8>>2]|0)>>>0):0){e=(c[22740+(e<<4)+4>>2]|0)+(a&-8)|0;if((c[23084+(e>>>12<<2)>>2]|e)&3|0?zf(e,2,0,0)|0:0){b=-1;return b|0}e=e+4|0;f=c[23084+(e>>>12<<2)>>2]|0;if((f|e)&3)if(!(zf(e,2,0,0)|0))e=23048;else{b=-1;return b|0}else e=f+e|0;g=c[e>>2]|0;if(g&4096){e=a&3;f=g>>>13&3;a=d[22968]|0;if(!(g&2048)){if(f>>>0<e>>>0|f>>>0<a>>>0){e=0;break}if((g>>>9&1^1)&b|0){e=0;break}}else{if(b|0){e=0;break}if(!(g&512)){e=1;break}if((g&1024|0)==0?f>>>0<e>>>0|f>>>0<a>>>0:0){e=0;break}}e=1}else e=0}else e=0;while(0);a=nf(22528)|0;if((c[5643]|0)==24){g=c[5641]|0;f=g&4;g=g>>>7&1}else{g=c[5642]|0;f=(d[21168+(g&255)>>0]|0)<<2;g=g>>>31}b=g<<7|(f|a)|(uf()|0)<<11;b=b|(vf()|0);b=(e|0)==0?b&-65:b|64;c[5641]=b;c[5642]=b>>>6&1^1;c[5643]=24;b=0;return b|0}function tg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;if(a[22968]|0?c[5735]&4|0:0){c[5746]=13;c[5747]=0;e=-1;return e|0}e=c[5766]|0;if(e|0?c[e+12>>2]&16384|0:0){c[5746]=32;e=e+112|0;c[e>>2]=110;c[e+4>>2]=0;e=(c[5766]|0)+120|0;c[e>>2]=0;c[e+4>>2]=0;e=-1;return e|0}f=22976;g=c[f>>2]|0;f=c[f+4>>2]|0;e=22976;c[e>>2]=b;c[e+4>>2]=d;d=Wa[c[16808504>>2]&15](c[4202127]|0)|0;b=y;e=22976;c[e>>2]=g;c[e+4>>2]=f;e=c[5766]|0;if(e){g=e+80|0;d=xl(c[g>>2]|0,c[g+4>>2]|0,d|0,b|0)|0;b=y}c[5632]=d;c[5634]=b;g=0;return g|0}function ug(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;a:do if((f&65532|0)!=0?(g=(f>>>1&2^2)+6|0,(f|7)>>>0<=(c[22740+(g<<4)+8>>2]|0)>>>0):0){h=(c[22740+(g<<4)+4>>2]|0)+(f&-8)|0;g=c[23084+(h>>>12<<2)>>2]|0;if((g|h)&3)if(!(zf(h,2,0,0)|0))g=23048;else{a=-1;return a|0}else g=g+h|0;j=c[g>>2]|0;g=h+4|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{a=-1;return a|0}else g=h+g|0;i=c[g>>2]|0;g=f&3;h=i>>>13&3;f=d[22968]|0;if(!(i&4096)){switch(i>>>8&15){case 11:case 9:case 3:case 2:case 1:break;case 12:case 5:case 4:{if(b|0){f=0;i=0;break a}break}default:{f=0;i=0;break a}}if(h>>>0<f>>>0|h>>>0<g>>>0){f=0;i=0;break}}else if((i>>>10&1&i>>>11|0)==0?h>>>0<f>>>0|h>>>0<g>>>0:0){f=0;i=0;break}if(!b){f=1;i=i&15793920;break}else{b=i&983040|j&65535;f=1;i=(i&8388608|0)==0?b:b<<12|4095;break}}else{f=0;i=0}while(0);g=nf(22528)|0;if((c[5643]|0)==24){b=c[5641]|0;h=b>>>7&1;g=b&4|g|((c[5642]|0)==0&1)<<6}else{b=c[5642]|0;h=b>>>31;g=(d[21168+(b&255)>>0]|0)<<2|g|((b|0)==0&1)<<6}g=h<<7|g|(uf()|0)<<11;g=g|(vf()|0);c[5641]=g;do if(f){c[5641]=g|64;g=22528+(e<<2)|0;if(!a){c[g>>2]=c[g>>2]&-65536|i&65535;break}else{c[g>>2]=i;break}}else c[5641]=g&-65;while(0);c[5642]=(c[5641]|0)>>>6&1^1;c[5643]=24;a=0;return a|0}function vg(a,b){a=a|0;b=b|0;switch(a|0){case 3:case 2:case 1:case 0:{c[22944+(a<<2)>>2]=b;return}case 6:{c[5740]=b&57359|-61456;return}case 7:{c[5741]=b&-56321|1024;return}default:return}}function wg(a,b){a=a|0;b=b|0;var d=0;switch(b|0){case 3:case 2:case 1:case 0:{d=22944+(b<<2)|0;break}case 6:{d=22960;break}case 7:{d=22964;break}default:ra()}c[a>>2]=c[d>>2];return}function xg(){var a=0;a=c[5632]|0;if((a|0)>=0)if(!a){c[5632]=1;c[5635]=1752462657;c[5634]=1769238117;c[5633]=909662307;return}else{c[5632]=1347;c[5635]=2048;c[5633]=0;c[5634]=33137;return}switch(a|0){case -2147483648:{c[5632]=-2147483638;c[5635]=1752462657;c[5634]=1769238117;c[5633]=909662307;return}case -2147483647:{c[5632]=1347;c[5635]=0;c[5633]=4;c[5634]=134250865;return}case -2147483640:{c[5632]=8224;c[5635]=0;c[5633]=0;c[5634]=0;return}case -2147483639:case -2147483641:case -2147483642:case -2147483643:case -2147483644:case -2147483645:case -2147483646:{c[5632]=0;c[5633]=0;c[5634]=0;c[5635]=0;return}default:{c[5632]=0;c[5635]=1;c[5633]=0;c[5634]=1;return}}}function yg(b,d){b=b|0;d=d|0;var e=0;if(a[22968]|0?(c[5735]&256|0)==0:0){c[5746]=13;c[5747]=0;e=-1;return e|0}e=c[5766]|0;if(e|0?c[e+12>>2]&32768|0:0){c[5746]=32;e=e+112|0;c[e>>2]=111;c[e+4>>2]=0;e=(c[5766]|0)+120|0;c[e>>2]=0;c[e+4>>2]=0;e=-1;return e|0}if((c[5633]|0)==1073741824){c[5632]=b;c[5634]=d;e=0;return e|0}else{c[5746]=13;c[5747]=0;e=-1;return e|0}return 0}function zg(){var a=0,b=0;a=c[5633]|0;a:do if(!(Rg(a,1)|0)){b=c[5632]|0;if((a|0)<-1073741567)switch(a|0){case -1073741696:{c[5764]=b&4096;a=0;break a}case -1073741568:{c[5702]=b;a=0;break a}default:{a=0;break a}}if((a|0)<-1073741565){switch(a|0){case -1073741567:break;default:{a=0;break a}}c[5706]=b;a=0;break}if((a|0)<-1073676009){switch(a|0){case -1073741565:break;default:{a=0;break a}}c[5763]=b;a=0;break}else{switch(a|0){case -1073676009:break;default:{a=0;break a}}c[5765]=b;a=0;break}}else a=-1;while(0);return a|0}function Ag(){var a=0;a=c[5633]|0;if(Rg(a,0)|0){a=-1;return a|0}a:do if((a|0)>=-1073741567){if((a|0)<-1073741565){switch(a|0){case -1073741567:break;default:{a=0;break a}}a=c[5706]|0;break}if((a|0)<-1073676009){switch(a|0){case -1073741565:break;default:{a=0;break a}}a=c[5763]|0;break}else{switch(a|0){case -1073676009:break;default:{a=0;break a}}a=c[5765]|0;break}}else switch(a|0){case -1073741696:{a=c[5764]|0;break a}case -1073741568:{a=c[5702]|0;break a}default:{a=0;break a}}while(0);c[5632]=a;c[5634]=0;a=0;return a|0}function Bg(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=c[5632]|0;g=c[5634]|0;i=c[5635]|0;k=c[5633]|0;b=c[5770]|0;l=a>>>12;e=c[23084+(b+l<<2)>>2]|0;do if((e|a)&3)if(!(zf(a,2,0,2)|0)){b=c[5770]|0;e=23048;break}else{n=-1;return n|0}else e=e+a|0;while(0);n=c[e>>2]|0;j=a+4|0;h=j>>>12;e=c[23084+(b+h<<2)>>2]|0;do if((e|j)&3)if(!(zf(j,2,0,2)|0)){b=c[5770]|0;e=23048;break}else{n=-1;return n|0}else e=e+j|0;while(0);m=c[e>>2]|0;g=(f|0)==(n|0)&(g|0)==(m|0);e=g?i:n;f=g?k:m;b=c[8411692+(b+l<<2)>>2]|0;if((b|a)&3){if(Bf(a,e,2,2)|0){n=-1;return n|0}}else c[b+a>>2]=e;b=c[8411692+((c[5770]|0)+h<<2)>>2]|0;if((b|j)&3){if(Bf(j,f,2,2)|0){n=-1;return n|0}}else c[b+j>>2]=f;b=nf(22528)|0;if((c[5643]|0)==24){a=c[5641]|0;e=a>>>7&1;b=a&4|b|((c[5642]|0)==0&1)<<6}else{a=c[5642]|0;e=a>>>31;b=(d[21168+(a&255)>>0]|0)<<2|b|((a|0)==0&1)<<6}b=e<<7|b|(uf()|0)<<11;b=b|(vf()|0);c[5641]=b;if(g)b=b|64;else{c[5632]=n;c[5634]=m;b=b&-65}c[5641]=b;c[5642]=b>>>6&1^1;c[5643]=24;n=0;return n|0}function Cg(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0;g=c[5770]|0;f=c[23084+(g+(d>>>12)<<2)>>2]|0;do if((f|d)&1)if(!(zf(d,1,0,2)|0)){h=c[5762]|0;f=c[5770]|0;break}else{a=-1;return a|0}else{h=e[f+d>>1]|0;f=g}while(0);g=d+2|0;f=c[23084+(f+(g>>>12)<<2)>>2]|0;do if((f|g)&1)if(!(zf(g,1,0,2)|0)){g=c[5762]|0;break}else{a=-1;return a|0}else g=e[f+g>>1]|0;while(0);f=22528+(b<<2)|0;if(Cf(a,g)|0){a=-1;return a|0}c[f>>2]=c[f>>2]&-65536|h&65535;a=0;return a|0}function Dg(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;switch(b|0){case 0:{if(!(f&31))return e|0;b=f&15;i=e&65535;b=i>>>(16-b|0)|i<<b;if((c[5643]|0)==24){g=c[5641]|0;f=g>>>7&1;g=((c[5642]|0)==0&1)<<6|g&4}else{g=c[5642]|0;f=g>>>31;g=(d[21168+(g&255)>>0]|0)<<2|((g|0)==0&1)<<6}i=f<<7|g|(vf()|0);c[5641]=(b^e)>>>4&2048|b&1|i;c[5642]=i>>>6&1^1;c[5643]=24;e=b;return e|0}case 1:{if(!(f&31))return e|0;b=f&15;i=e&65535;b=i<<16-b|i>>>b;if((c[5643]|0)==24){g=c[5641]|0;f=g>>>7&1;g=((c[5642]|0)==0&1)<<6|g&4}else{g=c[5642]|0;f=g>>>31;g=(d[21168+(g&255)>>0]|0)<<2|((g|0)==0&1)<<6}i=f<<7|g|(vf()|0);c[5641]=(b^e)>>>4&2048|b>>>15&1|i;c[5642]=i>>>6&1^1;c[5643]=24;e=b;return e|0}case 2:{b=a[21424+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&65535;g=(nf(22528)|0)<<h+-1|((b<<24>>24==1?0:i>>>(17-h|0))|i<<h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)>>>4&2048|i>>>(16-h|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 3:{b=a[21424+(f&31)>>0]|0;h=b&255;if(!(b<<24>>24))return e|0;i=e&65535;g=(nf(22528)|0)<<16-h|((b<<24>>24==1?0:i<<17-h)|i>>>h);if((c[5643]|0)==24){f=c[5641]|0;b=f>>>7&1;f=((c[5642]|0)==0&1)<<6|f&4}else{f=c[5642]|0;b=f>>>31;f=(d[21168+(f&255)>>0]|0)<<2|((f|0)==0&1)<<6}f=b<<7|f|(vf()|0);c[5641]=(g^e)>>>4&2048|i>>>(h+-1|0)&1|f;c[5642]=f>>>6&1^1;c[5643]=24;e=g;return e|0}case 6:case 4:{b=f&31;f=e<<b<<16>>16;if(!b)return e|0;c[5641]=e<<b+-1;c[5642]=f;c[5643]=16;e=f;return e|0}case 5:{b=f&31;f=e&65535;g=f>>>b<<16>>16;if(!b)return e|0;c[5641]=f>>>(b+-1|0);c[5642]=g;c[5643]=19;e=g;return e|0}case 7:{b=f&31;f=e<<16>>16;g=f>>b;if(!b)return e|0;c[5641]=f>>b+-1;c[5642]=g;c[5643]=19;e=g;return e|0}default:ra()}return 0}function Eg(){var a=0,d=0,e=0,f=0,g=0,h=0;e=(c[5636]|0)+-16|0;a=(e&c[5729])+(c[5694]|0)|0;d=7;while(1){g=c[22528+(d<<2)>>2]|0;f=c[8411692+((c[5770]|0)+(a>>>12)<<2)>>2]|0;if((f|a)&1){if(Bf(a,g,1,2)|0){a=-1;h=7;break}}else b[f+a>>1]=g;if(!d)break;else{a=a+2|0;d=d+-1|0}}if((h|0)==7)return a|0;h=c[5729]|0;c[5636]=c[5636]&~h|h&e;h=0;return h|0}function Fg(){var a=0,b=0,d=0,f=0,g=0;b=7;d=(c[5729]&c[5636])+(c[5694]|0)|0;while(1){if((b|0)!=4){a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;if(!((a|d)&1))a=e[a+d>>1]|0;else{if(zf(d,1,0,2)|0){a=-1;f=10;break}a=c[5762]|0}g=22528+(b<<2)|0;c[g>>2]=c[g>>2]&-65536|a&65535}if(!b)break;else{b=b+-1|0;d=d+2|0}}if((f|0)==10)return a|0;f=c[5636]|0;g=c[5729]|0;c[5636]=f&~g|f+16&g;g=0;return g|0}function Gg(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=d&31;g=c[5637]|0;n=(c[5636]|0)+-2|0;h=(c[5729]&n)+(c[5694]|0)|0;f=c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|0;if((f|h)&1){if(Bf(h,g,1,2)|0){n=-1;return n|0}}else b[f+h>>1]=g;a:do switch(d&31){case 0:{d=n;break}case 1:{d=n;j=14;break}default:{d=n;while(1){g=g+-2|0;j=c[5729]|0;l=c[5694]|0;f=(j&g)+l|0;k=c[5770]|0;h=c[23084+((f>>>12)+k<<2)>>2]|0;if(!((h|f)&1)){m=e[h+f>>1]|0;f=l}else{if(zf(f,1,0,2)|0){d=-1;j=21;break}m=c[5762]|0;j=c[5729]|0;f=c[5694]|0;k=c[5770]|0}d=d+-2|0;h=(j&d)+f|0;f=c[8411692+((h>>>12)+k<<2)>>2]|0;if((f|h)&1){if(Bf(h,m,1,2)|0){d=-1;j=21;break}}else b[f+h>>1]=m;if((i|0)<=2){j=14;break a}else i=i+-1|0}if((j|0)==21)return d|0}}while(0);do if((j|0)==14){d=d+-2|0;f=(c[5729]&d)+(c[5694]|0)|0;g=c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|0;if(!((g|f)&1)){b[g+f>>1]=n;break}if(Bf(f,n,1,2)|0){n=-1;return n|0}}while(0);g=d-a|0;d=c[5729]|0;f=g&d;h=f+(c[5694]|0)|0;do if((c[8411692+((h>>>12)+(c[5770]|0)<<2)>>2]|h)&1)if(!(zf(h,1,1,2)|0)){d=c[5729]|0;f=d&g;break}else{n=-1;return n|0}while(0);c[5637]=c[5637]&-65536|n&65535;c[5636]=c[5636]&~d|f;n=0;return n|0}function Hg(){var a=0,b=0,d=0,f=0;f=c[5637]|0;a=c[5729]|0;b=(a&f)+(c[5694]|0)|0;d=c[23084+((b>>>12)+(c[5770]|0)<<2)>>2]|0;do if((d|b)&1)if(!(zf(b,1,0,2)|0)){b=c[5762]|0;d=c[5637]|0;a=c[5729]|0;break}else{f=-1;return f|0}else{b=e[d+b>>1]|0;d=f}while(0);c[5637]=d&-65536|b&65535;c[5636]=c[5636]&~a|a&f+2;f=0;return f|0}function Ig(a,b){a=a|0;b=b|0;var d=0,f=0,g=0,h=0;f=c[5770]|0;d=c[23084+(f+(b>>>12)<<2)>>2]|0;do if((d|b)&1)if(!(zf(b,1,0,2)|0)){d=c[5762]|0;g=c[5770]|0;break}else{a=-1;return a|0}else{d=e[d+b>>1]|0;g=f}while(0);h=d<<16>>16;f=b+2|0;d=c[23084+(g+(f>>>12)<<2)>>2]|0;do if((d|f)&1)if(!(zf(f,1,0,2)|0)){d=c[5762]|0;break}else{a=-1;return a|0}else d=e[d+f>>1]|0;while(0);a=c[22528+(a<<2)>>2]<<16>>16;if(!((a|0)<(h|0)|(a|0)>(d<<16>>16|0))){a=0;return a|0}c[5746]=5;c[5747]=0;a=-1;return a|0}function Jg(){var a=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=c[5755]|0;i=g<<9&65536;j=i+-1|0;f=g&15;k=c[5638]|0;l=c[5639]|0;f=(j&k)+(c[22740+(((f|0)==0?3:f+-1|0)<<4)+4>>2]|0)|0;h=(j&l)+(c[5686]|0)|0;if(g&48){g=c[5633]|0;if(!(g&j)){l=0;return l|0}a=c[5770]|0;d=c[23084+(a+(f>>>12)<<2)>>2]|0;do if((d|f)&1)if(!(zf(f,1,0,2)|0)){d=c[5762]|0;a=c[5770]|0;break}else{l=-1;return l|0}else d=e[d+f>>1]|0;while(0);a=c[8411692+(a+(h>>>12)<<2)>>2]|0;if((a|h)&1){if(Bf(h,d,1,2)|0){l=-1;return l|0}}else b[a+h>>1]=d;i=0-i|0;h=c[5646]<<1;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i;l=g+-1&j;c[5633]=l|g&i;if(l|0){l=1;return l|0}}else{a=c[5770]|0;d=c[23084+(a+(f>>>12)<<2)>>2]|0;do if((d|f)&1)if(!(zf(f,1,0,2)|0)){d=c[5762]|0;a=c[5770]|0;break}else{l=-1;return l|0}else d=e[d+f>>1]|0;while(0);a=c[8411692+(a+(h>>>12)<<2)>>2]|0;if((a|h)&1){if(Bf(h,d,1,2)|0){l=-1;return l|0}}else b[a+h>>1]=d;i=0-i|0;h=c[5646]<<1;c[5638]=h+k&j|k&i;c[5639]=h+l&j|l&i}l=0;return l|0}function Kg(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0;f=c[5755]|0;h=f<<9&65536;i=h+-1|0;d=f&15;j=c[5638]|0;k=c[5639]|0;d=(i&j)+(c[22740+(((d|0)==0?3:d+-1|0)<<4)+4>>2]|0)|0;g=(i&k)+(c[5686]|0)|0;if(f&48){f=c[5633]|0;if(!(f&i)){k=0;return k|0}a=c[5770]|0;b=c[23084+(a+(d>>>12)<<2)>>2]|0;do if((b|d)&1)if(!(zf(d,1,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=e[b+d>>1]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((a|g)&1)if(!(zf(g,1,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=e[a+g>>1]|0;while(0);c[5641]=a;a=b-a<<16;c[5642]=a>>16;c[5643]=7;h=0-h|0;b=c[5646]<<1;c[5638]=b+j&i|j&h;c[5639]=b+k&i|k&h;b=f+-1&i;c[5633]=b|f&h;a=(a|0)==0;if(!(c[5755]&16)){if(a){k=0;return k|0}}else if(!a){k=0;return k|0}if(b|0){k=1;return k|0}}else{a=c[5770]|0;b=c[23084+(a+(d>>>12)<<2)>>2]|0;do if((b|d)&1)if(!(zf(d,1,0,2)|0)){b=c[5762]|0;a=c[5770]|0;break}else{k=-1;return k|0}else b=e[b+d>>1]|0;while(0);a=c[23084+(a+(g>>>12)<<2)>>2]|0;do if((a|g)&1)if(!(zf(g,1,0,2)|0)){a=c[5762]|0;break}else{k=-1;return k|0}else a=e[a+g>>1]|0;while(0);c[5641]=a;c[5642]=b-a<<16>>16;c[5643]=7;h=0-h|0;g=c[5646]<<1;c[5638]=g+j&i|j&h;c[5639]=g+k&i|k&h}k=0;return k|0}function Lg(){var a=0,b=0,d=0,f=0,g=0,h=0;d=c[5755]|0;f=d<<9&65536;g=f+-1|0;b=d&15;h=c[5638]|0;b=(g&h)+(c[22740+(((b|0)==0?3:b+-1|0)<<4)+4>>2]|0)|0;if(d&48){d=c[5633]|0;if(!(d&g)){h=0;return h|0}a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if((a|b)&1)if(!(zf(b,1,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=e[a+b>>1]|0;while(0);c[5632]=c[5632]&-65536|a;f=0-f|0;c[5638]=(c[5646]<<1)+h&g|h&f;h=d+-1&g;c[5633]=h|d&f;if(h|0){h=1;return h|0}}else{a=c[23084+((c[5770]|0)+(b>>>12)<<2)>>2]|0;do if((a|b)&1)if(!(zf(b,1,0,2)|0)){a=c[5762]|0;break}else{h=-1;return h|0}else a=e[a+b>>1]|0;while(0);c[5632]=c[5632]&-65536|a;c[5638]=(c[5646]<<1)+h&g|h&0-f}h=0;return h|0}function Mg(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0;b=c[5755]|0;g=b<<9&65536;h=g+-1|0;i=c[5639]|0;d=(h&i)+(c[5686]|0)|0;if(b&48){f=c[5633]|0;if(!(f&h)){i=0;return i|0}a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((a|d)&1)if(!(zf(d,1,0,2)|0)){a=c[5762]|0;d=c[5755]|0;break}else{i=-1;return i|0}else{a=e[a+d>>1]|0;d=b}while(0);b=c[5632]|0;c[5641]=a;a=b-a<<16;c[5642]=a>>16;c[5643]=7;g=0-g|0;c[5639]=(c[5646]<<1)+i&h|i&g;b=f+-1&h;c[5633]=b|f&g;a=(a|0)==0;if(!(d&16)){if(a){i=0;return i|0}}else if(!a){i=0;return i|0}if(b|0){i=1;return i|0}}else{a=c[23084+((c[5770]|0)+(d>>>12)<<2)>>2]|0;do if((a|d)&1)if(!(zf(d,1,0,2)|0)){a=c[5762]|0;break}else{i=-1;return i|0}else a=e[a+d>>1]|0;while(0);f=c[5632]|0;c[5641]=a;c[5642]=f-a<<16>>16;c[5643]=7;c[5639]=(c[5646]<<1)+i&h|i&0-g}i=0;return i|0}function Ng(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0;e=c[5755]|0;f=e<<9&65536;g=f+-1|0;h=c[5639]|0;i=(g&h)+(c[5686]|0)|0;if(e&48){a=c[5633]|0;if(!(a&g)){i=0;return i|0}d=c[5632]|0;e=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((e|i)&1){if(Bf(i,d,1,2)|0){i=-1;return i|0}}else b[e+i>>1]=d;f=0-f|0;c[5639]=(c[5646]<<1)+h&g|h&f;i=a+-1&g;c[5633]=i|a&f;if(i|0){i=1;return i|0}}else{a=c[5632]|0;d=c[8411692+((c[5770]|0)+(i>>>12)<<2)>>2]|0;if((d|i)&1){if(Bf(i,a,1,2)|0){i=-1;return i|0}}else b[d+i>>1]=a;c[5639]=(c[5646]<<1)+h&g|h&0-f}i=0;return i|0}function Og(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+16|0;e=n;d=c[5634]|0;g=d&65535;d=ig(d&65535,1,0)|0;if((d|0)<0){if((c[5746]|0)!=32){m=d;l=n;return m|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;k=a;m=c[k+4>>2]|0;c[a>>2]=c[k>>2]|8;c[a+4>>2]=m;a=c[5755]|0}m=(c[5766]|0)+120|0;k=m;j=c[k+4>>2]|0;c[m>>2]=c[k>>2]|(a&128^128)+128;c[m+4>>2]=j;m=(c[5766]|0)+120|0;j=m;k=c[j+4>>2]|0;c[m>>2]=c[j>>2]|4;c[m+4>>2]=k;m=d;l=n;return m|0}h=c[5755]|0;a=h&128;i=a<<9;j=i+-1|0;m=c[5639]|0;k=(j&m)+(c[5686]|0)|0;a:do if(h&48){h=c[5633]|0;if(!(h&j)){m=0;l=n;return m|0}do if((k&1|a|0)==0&(c[5646]|0)==1){f=(4096-(k&4095)|0)>>>1;f=h>>>0>f>>>0?f:h;if(Qg(e,k,1)|0){m=-1;l=n;return m|0}d=c[e>>2]|0;if(!d)break;if(f|0){a=0;do{b[d+(a<<1)>>1]=Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0;a=a+1|0}while(a>>>0<f>>>0)}c[5639]=(f<<1)+m;m=h-f|0;c[5633]=m;if(!m)break a;else a=1;l=n;return a|0}while(0);a=k>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|k)&1|0?zf(k,1,1,2)|0:0){m=-1;l=n;return m|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|k)&1){if(Bf(k,d,1,2)|0){m=-1;l=n;return m|0}}else b[a+k>>1]=d;k=0-i|0;c[5639]=(c[5646]<<1)+m&j|m&k;m=h+-1&j;c[5633]=m|h&k;if(m|0){m=1;l=n;return m|0}}else{a=k>>>12;if((c[8411692+((c[5770]|0)+a<<2)>>2]|k)&1|0?zf(k,1,1,2)|0:0){m=-1;l=n;return m|0}d=Ya[c[16808512>>2]&63](c[4202130]|0,g,1)|0;a=c[8411692+((c[5770]|0)+a<<2)>>2]|0;if((a|k)&1){if(Bf(k,d,1,2)|0){m=-1;l=n;return m|0}}else b[a+k>>1]=d;c[5639]=(c[5646]<<1)+m&j|m&0-i}while(0);m=0;l=n;return m|0} +function zi(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;B=l;l=l+32|0;p=B+16|0;n=B;v=e;o=c[v>>2]|0;v=c[v+4>>2]|0;r=e+8|0;q=c[r>>2]|0;r=c[r+4>>2]|0;m=r&65535;s=Il(q|0,r|0,48)|0;s=s&32767;k=f;i=c[k>>2]|0;k=c[k+4>>2]|0;w=f+8|0;j=c[w>>2]|0;w=c[w+4>>2]|0;h=w&65535;x=Il(j|0,w|0,48)|0;x=x&32767;z=w^r;A=Il(j^q|0,z|0,63)|0;A=A&255;do if((s|0)==32767){if((q|o|0)==0&(m|v|0)==0?(t=j|i,u=h|k,(t|0)==0&(u|0)==0|(x|0)!=32767):0){if((t|x|0)==0&(u|0)==0)break;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648|2147418112;l=B;return};c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];ui(b,n,p,g);l=B;return}else{if((x|0)==32767){if(!((j|i|0)==0&(h|k|0)==0)){c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];ui(b,n,p,g);l=B;return}if((q|o|s|0)==0&(m|v|0)==0)break;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648|2147418112;l=B;return}do if(!s){if((q|o|0)==0&(m|v|0)==0){A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648;l=B;return}if(!((q|0)==0&(m|0)==0)){u=m>>>0<1|(m|0)==1&q>>>0<0;f=u?q:m;e=f>>>0<65536;f=e?f<<16:f;e=e?16:0;s=f>>>0<16777216;f=(((u?32:0)|(s?e|8:e)&255)+(d[10416+((s?f<<8:f)>>>24)>>0]|0)<<24)+-251658240|0;s=f>>24;e=Jl(o|0,v|0,s|0)|0;r=y;f=(f|0)==0;u=Jl(q|0,m|0,s|0)|0;p=y;t=Il(o|0,v|0,0-s&63|0)|0;s=1-s|0;m=f?m:y|p;o=e;v=r;q=f?q:t|u;break}s=v>>>0<1|(v|0)==1&o>>>0<0;u=s?o:v;t=u>>>0<65536;u=t?u<<16:u;t=t?16:0;n=u>>>0<16777216;u=(((s?32:0)|(n?t|8:t)&255)+(d[10416+((n?u<<8:u)>>>24)>>0]|0)<<24)+-251658240|0;n=u>>24;if((u|0)<0){q=Il(o|0,v|0,0-n|0)|0;m=y;o=Jl(o|0,v|0,n&63|0)|0;p=y}else{q=Jl(o|0,v|0,n|0)|0;m=y;o=0;p=0}s=-63-n|0;v=p}while(0);do if(!x){if((j|i|0)==0&(h|k|0)==0){A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=z&-2147483648;l=B;return}if(!((j|0)==0&(h|0)==0)){t=h>>>0<1|(h|0)==1&j>>>0<0;x=t?j:h;f=x>>>0<65536;x=f?x<<16:x;f=f?16:0;p=x>>>0<16777216;x=(((t?32:0)|(p?f|8:f)&255)+(d[10416+((p?x<<8:x)>>>24)>>0]|0)<<24)+-251658240|0;p=x>>24;f=Jl(i|0,k|0,p|0)|0;t=y;x=(x|0)==0;w=Jl(j|0,h|0,p|0)|0;z=y;u=Il(i|0,k|0,0-p&63|0)|0;p=1-p|0;i=f;k=t;j=x?j:u|w;h=x?h:y|z;break}w=k>>>0<1|(k|0)==1&i>>>0<0;z=w?i:k;x=z>>>0<65536;z=x?z<<16:z;x=x?16:0;j=z>>>0<16777216;z=(((w?32:0)|(j?x|8:x)&255)+(d[10416+((j?z<<8:z)>>>24)>>0]|0)<<24)+-251658240|0;j=z>>24;if((z|0)<0){n=Il(i|0,k|0,0-j|0)|0;h=y;i=Jl(i|0,k|0,j&63|0)|0;k=y}else{n=Jl(i|0,k|0,j|0)|0;h=y;i=0;k=0}p=-63-j|0;j=n}else p=x;while(0);p=p+s|0;D=m|65536;H=Jl(i|0,k|0,16)|0;e=Jl(j|0,h|0,16)|0;u=Il(i|0,k|0,48)|0;r=y;n=Il(i|0,k|0,16)|0;H=H&-65536;z=Dl(H|0,0,o|0,0)|0;x=y;f=Dl(n|0,0,o|0,0)|0;s=y;t=Dl(H|0,0,v|0,0)|0;C=y;K=Dl(n|0,0,v|0,0)|0;E=y;s=xl(f|0,s|0,t|0,C|0)|0;f=y;x=xl(0,s|0,z|0,x|0)|0;z=y;F=Il(j|0,h|0,16)|0;e=u|e&-65536;u=Dl(e|0,r|0,o|0,0)|0;w=y;m=Dl(F|0,0,o|0,0)|0;k=y;i=Dl(e|0,r|0,v|0,0)|0;J=y;G=Dl(F|0,0,v|0,0)|0;I=y;k=xl(i|0,J|0,m|0,k|0)|0;m=y;w=xl(0,k|0,u|0,w|0)|0;u=y;h=xl(w|0,u|0,K|0,E|0)|0;h=xl(h|0,y|0,f|0,(f>>>0<C>>>0|(f|0)==(C|0)&s>>>0<t>>>0)&1|0)|0;h=xl(h|0,y|0,(z>>>0<s>>>0|(z|0)==(s|0)&x>>>0<0)&1|0,0)|0;j=y;s=Dl(e|0,r|0,q|0,0)|0;t=y;C=Dl(F|0,0,q|0,0)|0;f=y;r=Dl(e|0,r|0,D|0,0)|0;e=y;F=Dl(F|0,0,D|0,0)|0;E=y;f=xl(r|0,e|0,C|0,f|0)|0;C=y;t=xl(0,f|0,s|0,t|0)|0;s=y;I=xl(t|0,s|0,G|0,I|0)|0;i=xl(I|0,y|0,m|0,(m>>>0<J>>>0|(m|0)==(J|0)&k>>>0<i>>>0)&1|0)|0;k=xl(i|0,y|0,(u>>>0<k>>>0|(u|0)==(k|0)&w>>>0<0)&1|0,0)|0;w=xl(k|0,y|0,(j>>>0<u>>>0|(j|0)==(u|0)&h>>>0<w>>>0)&1|0,0)|0;u=y;k=Dl(H|0,0,q|0,0)|0;i=y;J=Dl(n|0,0,q|0,0)|0;m=y;H=Dl(H|0,0,D|0,0)|0;I=y;n=Dl(n|0,0,D|0,0)|0;G=y;m=xl(J|0,m|0,H|0,I|0)|0;J=y;G=xl(J|0,(J>>>0<I>>>0|(J|0)==(I|0)&m>>>0<H>>>0)&1|0,n|0,G|0)|0;n=y;i=xl(0,m|0,k|0,i|0)|0;k=y;m=xl(G|0,n|0,(k>>>0<m>>>0|(k|0)==(m|0)&i>>>0<0)&1|0,0)|0;n=y;j=xl(h|0,j|0,i|0,k|0)|0;h=y;i=xl(m|0,n|0,(h>>>0<k>>>0|(h|0)==(k|0)&j>>>0<i>>>0)&1|0,0)|0;i=xl(i|0,y|0,w|0,u|0)|0;k=y;n=xl(i|0,k|0,o|0,v|0)|0;m=y;v=xl(F|0,E|0,q|0,D|0)|0;v=xl(v|0,y|0,C|0,(C>>>0<e>>>0|(C|0)==(e|0)&f>>>0<r>>>0)&1|0)|0;v=xl(v|0,y|0,(s>>>0<f>>>0|(s|0)==(f|0)&t>>>0<0)&1|0,0)|0;v=xl(v|0,y|0,(u>>>0<s>>>0|(u|0)==(s|0)&w>>>0<t>>>0)&1|0,0)|0;w=xl(v|0,y|0,(k>>>0<u>>>0|(k|0)==(u|0)&i>>>0<w>>>0)&1|0,0)|0;i=xl(w|0,y|0,(m>>>0<k>>>0|(m|0)==(k|0)&n>>>0<i>>>0)&1|0,0)|0;k=y;j=j|((x|0)!=0|(z|0)!=0)&1;if(k>>>0>131071|(k|0)==131071&i>>>0>4294967295){J=Jl(n|0,m|0,63)|0;K=y;I=Jl(i|0,k|0,63)|0;o=y;n=Il(n|0,m|0,1)|0;m=o|y;i=Il(i|0,k|0,1)|0;o=p+-16383|0;k=y;n=I|n;j=J|((j|0)!=0|(h|0)!=0)&1;h=K}else o=p+-16384|0;yi(b,A,o,i,k,n,m,j,h,g);l=B;return}while(0);K=g+2|0;a[K>>0]=a[K>>0]|1;K=b;c[K>>2]=0;c[K+4>>2]=0;K=b+8|0;c[K>>2]=0;c[K+4>>2]=-32768;l=B;return}function Ai(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;H=l;l=l+32|0;t=H+16|0;s=H;j=e;h=c[j>>2]|0;j=c[j+4>>2]|0;w=e+8|0;m=c[w>>2]|0;w=c[w+4>>2]|0;i=w&65535;r=Il(m|0,w|0,48)|0;r=r&32767;o=f;k=c[o>>2]|0;o=c[o+4>>2]|0;u=f+8|0;p=c[u>>2]|0;u=c[u+4>>2]|0;q=u&65535;n=Il(p|0,u|0,48)|0;v=n&32767;x=u^w;G=Il(p^m|0,x|0,63)|0;G=G&255;a:do if((r|0)==32767){if(!((m|h|0)==0&(i|j|0)==0)){c[s>>2]=c[e>>2];c[s+4>>2]=c[e+4>>2];c[s+8>>2]=c[e+8>>2];c[s+12>>2]=c[e+12>>2];c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];ui(b,s,t,g);l=H;return}if((v|0)!=32767){G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648|2147418112;l=H;return}if(!((p|k|0)==0&(q|o|0)==0)){c[s>>2]=c[e>>2];c[s+4>>2]=c[e+4>>2];c[s+8>>2]=c[e+8>>2];c[s+12>>2]=c[e+12>>2];c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];ui(b,s,t,g);l=H;return}}else{n=n&32767;b:do if(n<<16>>16>=32767){switch(n<<16>>16){case 32767:break;default:break b}if((p|k|0)==0&(q|o|0)==0){G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648;l=H;return}else{c[s>>2]=c[e>>2];c[s+4>>2]=c[e+4>>2];c[s+8>>2]=c[e+8>>2];c[s+12>>2]=c[e+12>>2];c[t>>2]=c[f>>2];c[t+4>>2]=c[f+4>>2];c[t+8>>2]=c[f+8>>2];c[t+12>>2]=c[f+12>>2];ui(b,s,t,g);l=H;return}}else{switch(n<<16>>16){case 0:break;default:break b}if((p|k|0)==0&(q|o|0)==0){if((m|h|r|0)==0&(i|j|0)==0)break a;G=g+2|0;a[G>>0]=a[G>>0]|4;G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648|2147418112;l=H;return}if(!((p|0)==0&(q|0)==0)){B=q>>>0<1|(q|0)==1&p>>>0<0;E=B?p:q;A=E>>>0<65536;E=A?E<<16:E;A=A?16:0;v=E>>>0<16777216;E=(((B?32:0)|(v?A|8:A)&255)+(d[10416+((v?E<<8:E)>>>24)>>0]|0)<<24)+-251658240|0;v=E>>24;A=Jl(k|0,o|0,v|0)|0;B=y;E=(E|0)==0;D=Jl(p|0,q|0,v|0)|0;F=y;C=Il(k|0,o|0,0-v&63|0)|0;v=1-v|0;k=A;o=B;p=E?p:C|D;q=E?q:y|F;break}D=o>>>0<1|(o|0)==1&k>>>0<0;F=D?k:o;E=F>>>0<65536;F=E?F<<16:F;E=E?16:0;n=F>>>0<16777216;F=(((D?32:0)|(n?E|8:E)&255)+(d[10416+((n?F<<8:F)>>>24)>>0]|0)<<24)+-251658240|0;n=F>>24;if((F|0)<0){p=Il(k|0,o|0,0-n|0)|0;q=y;k=Jl(k|0,o|0,n&63|0)|0;o=y}else{p=Jl(k|0,o|0,n|0)|0;q=y;k=0;o=0}v=-63-n|0}while(0);do if(!r){if((m|h|0)==0&(i|j|0)==0){G=b;c[G>>2]=0;c[G+4>>2]=0;G=b+8|0;c[G>>2]=0;c[G+4>>2]=x&-2147483648;l=H;return}if(!((m|0)==0&(i|0)==0)){B=i>>>0<1|(i|0)==1&m>>>0<0;E=B?m:i;A=E>>>0<65536;E=A?E<<16:E;A=A?16:0;r=E>>>0<16777216;E=(((B?32:0)|(r?A|8:A)&255)+(d[10416+((r?E<<8:E)>>>24)>>0]|0)<<24)+-251658240|0;r=E>>24;A=Jl(h|0,j|0,r|0)|0;B=y;E=(E|0)==0;D=Jl(m|0,i|0,r|0)|0;F=y;C=Il(h|0,j|0,0-r&63|0)|0;r=1-r|0;h=A;j=B;m=E?m:C|D;i=E?i:y|F;break}D=j>>>0<1|(j|0)==1&h>>>0<0;F=D?h:j;E=F>>>0<65536;F=E?F<<16:F;E=E?16:0;i=F>>>0<16777216;F=(((D?32:0)|(i?E|8:E)&255)+(d[10416+((i?F<<8:F)>>>24)>>0]|0)<<24)+-251658240|0;i=F>>24;if((F|0)<0){m=Il(h|0,j|0,0-i|0)|0;n=y;h=Jl(h|0,j|0,i&63|0)|0;j=y}else{m=Jl(h|0,j|0,i|0)|0;n=y;h=0;j=0}r=-63-i|0;i=n}while(0);r=r-v|0;t=Jl(h|0,j|0,15)|0;e=y;s=Jl(m|0,i|0,15)|0;n=y;i=Il(h|0,j|0,49)|0;m=y;s=i|s;n=m|n|-2147483648;E=Jl(k|0,o|0,15)|0;F=y;B=Jl(p|0,q|0,15)|0;A=y|-2147483648;C=Il(k|0,o|0,49)|0;B=C|B;C=y|A;if(!(C>>>0<n>>>0|(C|0)==(n|0)&B>>>0<s>>>0)){i=Jl(i|0,m|0,63)|0;m=y;h=Jl(h|0,j|0,14)|0;if(F>>>0>e>>>0|(F|0)==(e|0)&E>>>0>t>>>0|((B|0)!=(s|0)|(C|0)!=(n|0))){D=r+16381|0;f=n}else{h=i|h&-16384;i=m|y&2147483647;z=34}}else{z=Jl(i|0,m|0,63)|0;i=y;h=Jl(h|0,j|0,14)|0;h=z|h&-16384;i=i|y&2147483647;z=34}if((z|0)==34){s=Il(s|0,n|0,1)|0;D=r+16382|0;f=y;t=h;e=i}if(C>>>0>f>>>0|(C|0)==(f|0)&B>>>0>s>>>0){if(A>>>0>f>>>0|(A|0)==(f|0)&0>s>>>0){j=Fl(s|0,f|0,A|0,0)|0;m=0}else{j=-1;m=0}n=Dl(j|0,0,B|0,0)|0;p=y;x=Dl(j|0,0,A|0,0)|0;z=y;h=yl(t|0,e|0,0,n|0)|0;i=y;n=(e>>>0<n>>>0|(e|0)==(n|0)&t>>>0<0)<<31>>31;z=yl(s|0,f|0,x|0,z|0)|0;p=yl(z|0,y|0,p|0,0)|0;n=xl(p|0,y|0,n|0,((n|0)<0)<<31>>31|0)|0;p=y;if((p|0)<0)while(1){m=xl(m|0,j|0,0,-1)|0;j=y;q=xl(h|0,i|0,0,B|0)|0;r=y;n=xl(n|0,p|0,A|0,0)|0;n=xl(n|0,y|0,(r>>>0<i>>>0|(r|0)==(i|0)&q>>>0<h>>>0)&1|0,0)|0;p=y;if((p|0)<0){h=q;i=r}else{h=r;break}}else h=i;if(A>>>0>n>>>0|(A|0)==(n|0)&0>h>>>0){h=Fl(h|0,n|0,A|0,0)|0;i=y}else{h=-1;i=0}m=h|m;r=i|j;w=B;x=0}else{m=-1;r=-1;w=B;x=0}u=Il(k|0,o|0,17)|0;v=E&-32768;k=Dl(m|0,0,v|0,0)|0;h=y;p=Dl(r|0,0,v|0,0)|0;j=y;N=Dl(m|0,0,u|0,0)|0;i=y;o=Dl(r|0,0,u|0,0)|0;O=y;j=xl(p|0,j|0,N|0,i|0)|0;p=y;h=xl(0,j|0,k|0,h|0)|0;k=y;P=Dl(m|0,0,w|0,x|0)|0;z=y;K=Dl(r|0,0,w|0,x|0)|0;I=y;n=Dl(m|0,0,A|0,0)|0;J=y;M=Dl(r|0,0,A|0,0)|0;L=y;I=xl(K|0,I|0,n|0,J|0)|0;K=y;z=xl(0,I|0,P|0,z|0)|0;P=y;O=xl(z|0,P|0,o|0,O|0)|0;N=xl(O|0,y|0,p|0,(p>>>0<i>>>0|(p|0)==(i|0)&j>>>0<N>>>0)&1|0)|0;j=xl(N|0,y|0,(k>>>0<j>>>0|(k|0)==(j|0)&h>>>0<0)&1|0,0)|0;N=y;i=yl(0,0,h|0,k|0)|0;p=y;O=yl(t|0,e|0,j|0,N|0)|0;o=y;q=(P>>>0<I>>>0|(P|0)==(I|0)&z>>>0<0)<<31>>31;z=(N>>>0<P>>>0|(N|0)==(P|0)&j>>>0<z>>>0)<<31>>31;k=((h|0)!=0|(k|0)!=0)&1;h=(o>>>0<0|(o|0)==0&O>>>0<k>>>0)<<31>>31;k=yl(O|0,o|0,k|0,0)|0;o=y;j=(e>>>0<N>>>0|(e|0)==(N|0)&t>>>0<j>>>0)<<31>>31;f=yl(s|0,f|0,M|0,L|0)|0;f=yl(f|0,y|0,K|0,(K>>>0<J>>>0|(K|0)==(J|0)&I>>>0<n>>>0)&1|0)|0;f=xl(f|0,y|0,q|0,((q|0)<0)<<31>>31|0)|0;z=xl(f|0,y|0,z|0,((z|0)<0)<<31>>31|0)|0;j=xl(z|0,y|0,j|0,((j|0)<0)<<31>>31|0)|0;h=xl(j|0,y|0,h|0,((h|0)<0)<<31>>31|0)|0;j=y;if((j|0)<0){t=i;s=p;q=k;while(1){m=xl(m|0,r|0,-1,-1)|0;r=y;n=xl(t|0,s|0,E|0,F|0)|0;p=y;O=xl(q|0,o|0,B|0,C|0)|0;N=y;P=(p>>>0<s>>>0|(p|0)==(s|0)&n>>>0<t>>>0)&1;k=xl(O|0,N|0,P|0,0)|0;i=y;O=xl(h|0,j|0,(N>>>0<o>>>0|(N|0)==(o|0)&O>>>0<q>>>0)&1|0,0)|0;h=xl(O|0,y|0,(i>>>0<0|(i|0)==0&k>>>0<P>>>0)&1|0,0)|0;j=y;if((j|0)>=0){o=i;t=k;s=p;f=m;e=r;break}else{t=n;s=p;q=k;o=i}}}else{t=k;n=i;s=p;f=m;e=r}if(C>>>0>o>>>0|(C|0)==(o|0)&B>>>0>t>>>0){if(A>>>0>o>>>0|(A|0)==(o|0)&0>t>>>0){k=Fl(t|0,o|0,A|0,0)|0;i=0}else{k=-1;i=0}m=Dl(k|0,0,w|0,x|0)|0;p=y;O=Dl(k|0,0,A|0,0)|0;P=y;h=yl(n|0,s|0,0,m|0)|0;j=y;m=(s>>>0<m>>>0|(s|0)==(m|0)&n>>>0<0)<<31>>31;P=yl(t|0,o|0,O|0,P|0)|0;p=yl(P|0,y|0,p|0,0)|0;m=xl(p|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;p=y;if((p|0)<0)while(1){i=xl(i|0,k|0,0,-1)|0;k=y;q=xl(h|0,j|0,0,B|0)|0;r=y;m=xl(m|0,p|0,A|0,0)|0;m=xl(m|0,y|0,(r>>>0<j>>>0|(r|0)==(j|0)&q>>>0<h>>>0)&1|0,0)|0;p=y;if((p|0)<0){h=q;j=r}else{h=r;break}}else h=j;if(A>>>0>m>>>0|(A|0)==(m|0)&0>h>>>0){h=Fl(h|0,m|0,A|0,0)|0;j=y}else{h=-1;j=0}i=h|i;h=j|k;if(0<0|0==0&(i&16383)>>>0<5){p=Dl(i|0,0,v|0,0)|0;P=y;m=Dl(h|0,0,v|0,0)|0;z=y;k=Dl(i|0,0,u|0,0)|0;j=y;u=Dl(h|0,0,u|0,0)|0;N=y;z=xl(m|0,z|0,k|0,j|0)|0;m=y;P=xl(0,z|0,p|0,P|0)|0;p=y;v=Dl(i|0,0,w|0,x|0)|0;O=y;J=Dl(h|0,0,w|0,x|0)|0;L=y;M=Dl(i|0,0,A|0,0)|0;K=y;A=Dl(h|0,0,A|0,0)|0;I=y;L=xl(J|0,L|0,M|0,K|0)|0;J=y;O=xl(0,L|0,v|0,O|0)|0;v=y;x=xl(O|0,v|0,u|0,N|0)|0;x=xl(x|0,y|0,m|0,(m>>>0<j>>>0|(m|0)==(j|0)&z>>>0<k>>>0)&1|0)|0;z=xl(x|0,y|0,(p>>>0<z>>>0|(p|0)==(z|0)&P>>>0<0)&1|0,0)|0;x=y;k=yl(0,0,P|0,p|0)|0;j=y;w=yl(n|0,s|0,z|0,x|0)|0;m=y;N=(v>>>0<L>>>0|(v|0)==(L|0)&O>>>0<0)<<31>>31;O=(x>>>0<v>>>0|(x|0)==(v|0)&z>>>0<O>>>0)<<31>>31;p=((P|0)!=0|(p|0)!=0)&1;P=(m>>>0<0|(m|0)==0&w>>>0<p>>>0)<<31>>31;p=yl(w|0,m|0,p|0,0)|0;m=y;n=(s>>>0<x>>>0|(s|0)==(x|0)&n>>>0<z>>>0)<<31>>31;o=yl(t|0,o|0,A|0,I|0)|0;o=yl(o|0,y|0,J|0,(J>>>0<K>>>0|(J|0)==(K|0)&L>>>0<M>>>0)&1|0)|0;o=xl(o|0,y|0,N|0,((N|0)<0)<<31>>31|0)|0;o=xl(o|0,y|0,O|0,((O|0)<0)<<31>>31|0)|0;n=xl(o|0,y|0,n|0,((n|0)<0)<<31>>31|0)|0;n=xl(n|0,y|0,P|0,((P|0)<0)<<31>>31|0)|0;o=y;if((o|0)<0)while(1){i=xl(i|0,h|0,-1,-1)|0;h=y;s=xl(k|0,j|0,E|0,F|0)|0;t=y;O=xl(p|0,m|0,B|0,C|0)|0;N=y;P=(t>>>0<j>>>0|(t|0)==(j|0)&s>>>0<k>>>0)&1;q=xl(O|0,N|0,P|0,0)|0;r=y;n=xl(n|0,o|0,(N>>>0<m>>>0|(N|0)==(m|0)&O>>>0<p>>>0)&1|0,0)|0;n=xl(n|0,y|0,(r>>>0<0|(r|0)==0&q>>>0<P>>>0)&1|0,0)|0;o=y;if((o|0)<0){k=s;j=t;p=q;m=r}else{p=q;m=r;k=s;j=t;break}}i=i|((p|n|k|0)!=0|(m|o|j|0)!=0)&1}}else{i=-1;h=-1}O=Jl(i|0,h|0,49)|0;P=y;M=Jl(f|0,e|0,49)|0;N=y;L=Il(i|0,h|0,15)|0;N=y|N;K=Il(f|0,e|0,15)|0;yi(b,G,D,K,y,L|M,N,O,P,g);l=H;return}while(0);P=g+2|0;a[P>>0]=a[P>>0]|1;P=b;c[P>>2]=0;c[P+4>>2]=0;P=b+8|0;c[P>>2]=0;c[P+4>>2]=-32768;l=H;return}function Bi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;D=l;l=l+32|0;C=D+12|0;B=D+6|0;p=D;w=b[f+8>>1]|0;m=w&32767;o=m<<16>>16==0;v=f;z=c[v>>2]|0;v=c[v+4>>2]|0;a:do if(o|(v|0)<0){q=m&65535;r=g+8|0;j=c[r>>2]|0;r=c[r+4>>2]|0;u=r&65535;k=g;i=c[k>>2]|0;k=c[k+4>>2]|0;g=Il(j|0,r|0,48)|0;n=g&32767;s=Il(j|0,r|0,63)|0;t=y;A=s&255^(w&65535)>>>15&255;if(m<<16>>16==32767){m=v&2147483647;b:do if((z|0)==0&(m|0)==0){g=g&32767;c:do if(g<<16>>16>=32767){switch(g<<16>>16){case 32767:break;default:break c}if(!((j|i|0)==0&(u|k|0)==0))break b}else{switch(g<<16>>16){case 0:break;default:break c}if((j|i|0)==0&(u|k|0)==0)break a;h=h+2|0;a[h>>0]=a[h>>0]|2}while(0);h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(A&255)<<15|32767;l=D;return}while(0);if(0==0&(r&2147450880|0)==2147418112?!((i|j|0)==0&(k|r&32767|0)==0):0){A=h+2|0;a[A>>0]=a[A>>0]|1}q=Jl(j|0,r|0,16)|0;r=y;i=Il(i|0,k|0,48)|0;r=Il(i|q|0,y|r|0,1)|0;i=y;q=(r|0)==0&(i|0)==0;r=q?0:r;i=q?-1073741824:i|-2147483648;q=Jl(s|0,t|0,15)|0;q=(q|32767)&65535;b[C>>1]=b[p>>1]|0;b[C+2>>1]=b[p+2>>1]|0;b[C+4>>1]=b[p+4>>1]|0;p=f+10|0;b[B>>1]=b[p>>1]|0;b[B+2>>1]=b[p+2>>1]|0;b[B+4>>1]=b[p+4>>1]|0;m=(z|0)==0&(m|0)==0;p=(z|0)==(z|0)&(v|0)==(v&-1073741825|0)&((z|0)!=0|(v&1073741823|0)!=0);n=(r|0)!=0|(i&2147483647|0)!=0;j=(r|0)!=0|(i&1073741823|0)!=0;k=(r|0)==(r|0)&(i|0)==(i&-1073741825|0);o=k&j;g=v|-1073741824;i=i|-1073741824;if(p|o){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(p)if(!o)if(n){h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}else{h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;break}else x=20;else{if(m){h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}if(n&(k&j^1))x=20;else{h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0}}while(0);do if((x|0)==20){if(g>>>0<i>>>0|(g|0)==(i|0)&z>>>0<r>>>0){h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}if(i>>>0<g>>>0|(i|0)==(g|0)&r>>>0<z>>>0){h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;break}if((w&65535)<(q&65535)){h=e;c[h>>2]=z;c[h+4>>2]=g;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;break}else{h=e;c[h>>2]=r;c[h+4>>2]=i;b[e+8>>1]=q;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;break}}while(0);l=D;return}if((n|0)==32767){if((j|i|0)==0&(u|k|0)==0){if(o){if((z|0)==0&(v|0)==0)break;h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(A&255)<<15|32767;l=D;return}if(0==0&(r&2147450880|0)==2147418112?!((i|j|0)==0&(k|r&32767|0)==0):0){A=h+2|0;a[A>>0]=a[A>>0]|1}g=Jl(j|0,r|0,16)|0;j=y;i=Il(i|0,k|0,48)|0;i=Il(i|g|0,y|j|0,1)|0;j=y;g=(i|0)==0&(j|0)==0;i=g?0:i;j=g?-1073741824:j|-2147483648;g=Jl(s|0,t|0,15)|0;b[C>>1]=b[B>>1]|0;b[C+2>>1]=b[B+2>>1]|0;b[C+4>>1]=b[B+4>>1]|0;if((i|0)==(i|0)&(j|0)==(j&-1073741825|0)&((i|0)!=0|(j&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=i;c[h+4>>2]=j|-1073741824;b[e+8>>1]=g|32767;h=e+10|0;b[h>>1]=b[C>>1]|0;b[h+2>>1]=b[C+2>>1]|0;b[h+4>>1]=b[C+4>>1]|0;l=D;return}do if(o){if(!((z|0)==0&(v|0)==0)){C=h+2|0;a[C>>0]=a[C>>0]|2;C=v>>>0<1|(v|0)==1&z>>>0<0;q=C?z:v;o=q>>>0<65536;q=o?q<<16:q;o=o?16:0;p=q>>>0<16777216;q=((C?32:0)|(p?o|8:o)&255)+(d[10416+((p?q<<8:q)>>>24)>>0]|0)<<24>>24;p=Jl(z|0,v|0,q|0)|0;q=1-q|0;o=y;break}if(!((j|i|0)==0&(u|k|0)==0|(n|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=(A&255)<<15;l=D;return}else{p=z;o=v}while(0);do if(!n){if((j|i|0)==0&(u|k|0)==0){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=(A&255)<<15;l=D;return}C=h+2|0;a[C>>0]=a[C>>0]|2;if(!((j|0)==0&(u|0)==0)){x=u>>>0<1|(u|0)==1&j>>>0<0;C=x?j:u;w=C>>>0<65536;C=w?C<<16:C;w=w?16:0;n=C>>>0<16777216;C=(((x?32:0)|(n?w|8:w)&255)+(d[10416+((n?C<<8:C)>>>24)>>0]|0)<<24)+-251658240|0;n=C>>24;w=Jl(i|0,k|0,n|0)|0;x=y;C=(C|0)==0;B=Jl(j|0,u|0,n|0)|0;g=y;z=Il(i|0,k|0,0-n&63|0)|0;n=1-n|0;i=w;k=x;j=C?j:z|B;g=C?u:y|g;break}z=k>>>0<1|(k|0)==1&i>>>0<0;C=z?i:k;B=C>>>0<65536;C=B?C<<16:C;B=B?16:0;j=C>>>0<16777216;C=(((z?32:0)|(j?B|8:B)&255)+(d[10416+((j?C<<8:C)>>>24)>>0]|0)<<24)+-251658240|0;j=C>>24;if((C|0)<0){m=Il(i|0,k|0,0-j|0)|0;g=y;i=Jl(i|0,k|0,j&63|0)|0;k=y}else{m=Jl(i|0,k|0,j|0)|0;g=y;i=0;k=0}n=-63-j|0;j=m}else g=u|65536;while(0);f=Jl(i|0,k|0,15)|0;w=Jl(j|0,g|0,15)|0;B=Il(i|0,k|0,49)|0;u=y;m=Il(i|0,k|0,17)|0;f=f&-32768;z=Dl(f|0,0,p|0,0)|0;t=y;f=Dl(f|0,0,o|0,0)|0;C=y;v=Dl(m|0,0,p|0,0)|0;s=y;m=Dl(m|0,0,o|0,0)|0;r=y;C=xl(f|0,C|0,v|0,s|0)|0;f=y;t=xl(0,C|0,z|0,t|0)|0;z=y;x=Il(j|0,g|0,17)|0;i=w&-32768|B;B=Dl(i|0,u|0,p|0,0)|0;w=y;i=Dl(i|0,u|0,o|0,0)|0;u=y;k=Dl(x|0,0,p|0,0)|0;j=y;x=Dl(x|0,0,o|0,0)|0;p=y;u=xl(i|0,u|0,k|0,j|0)|0;o=y;p=xl(o|0,(o>>>0<j>>>0|(o|0)==(j|0)&u>>>0<k>>>0)&1|0,x|0,p|0)|0;x=y;w=xl(0,u|0,B|0,w|0)|0;B=y;u=xl(p|0,x|0,(B>>>0<u>>>0|(B|0)==(u|0)&w>>>0<0)&1|0,0)|0;x=y;r=xl(w|0,B|0,m|0,r|0)|0;v=xl(r|0,y|0,f|0,(f>>>0<s>>>0|(f|0)==(s|0)&C>>>0<v>>>0)&1|0)|0;t=xl(v|0,y|0,(z>>>0<C>>>0|(z|0)==(C|0)&t>>>0<0)&1|0,0)|0;C=y;w=xl(u|0,x|0,(C>>>0<B>>>0|(C|0)==(B|0)&t>>>0<w>>>0)&1|0,0)|0;B=y;x=(B|0)>0|(B|0)==0&w>>>0>0;u=Jl(w|0,B|0,1)|0;z=y;v=Il(t|0,C|0,63)|0;z=z|y;C=Jl(t|0,C|0,x&1|0)|0;oi(e,a[h+3>>0]|0,A,n+q+(x?-16383:-16382)|0,x?u|v:w,x?z:B,C,y,h);l=D;return}while(0);h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=D;return}function Ci(d,e){d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if(b[d+8>>1]&32767?(c[d+4>>2]|0)>=0:0){e=e+2|0;a[e>>0]=a[e>>0]|1;e=-32768;l=g;return e|0};c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];f=ei(f,e)|0;if((f+32768|0)>>>0>65535){a[e+2>>0]=1;e=-32768;l=g;return e|0}else{e=f&65535;l=g;return e|0}return 0}function Di(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=b[d+8>>1]|0;g=f&32767;j=d;k=c[j>>2]|0;j=c[j+4>>2]|0;do if(!(g<<16>>16))if((k|0)==0&(j|0)==0)d=0;else l=8;else{if((j|0)>=0){l=e+2|0;a[l>>0]=a[l>>0]|1;l=-32768;return l|0}d=g&65535;h=(f&65535)>>>15;i=h&255;if((g&65535)<=16414){if((g&65535)<16383){l=8;break}f=16446-d|0;g=Il(k|0,j|0,f|0)|0;d=i<<24>>24==0?g:0-g|0;if((d>>>31|0)==(h&65535|0)){i=Jl(g|0,y|0,f|0)|0;if(!((i|0)==(k|0)&(y|0)==(j|0))){k=e+2|0;a[k>>0]=a[k>>0]|32}}else{d=i;l=10}}else{d=g<<16>>16!=32767|(k|0)==0&(j&2147483647|0)==0?i:0;l=10}if((l|0)==10){k=e+2|0;a[k>>0]=a[k>>0]|1;d=d<<24>>24==0?2147483647:-2147483648}if((d+32768|0)>>>0>65535){a[e+2>>0]=1;l=-32768;return l|0}}while(0);if((l|0)==8){d=e+2|0;a[d>>0]=a[d>>0]|32;d=0}l=d&65535;return l|0}function Ei(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+32|0;m=v+12|0;s=v+6|0;p=v;i=f;h=c[i>>2]|0;i=c[i+4>>2]|0;r=f+8|0;o=b[r>>1]|0;t=f+10|0;b[s>>1]=b[t>>1]|0;b[s+2>>1]=b[t+2>>1]|0;b[s+4>>1]=b[t+4>>1]|0;n=o&32767;j=n&65535;u=o&-32768;a:do if(!(n<<16>>16)){k=g+2|0;j=a[k>>0]|0;if((h|0)==0&(i|0)==0){a[k>>0]=j|4;c[f>>2]=0;c[f+4>>2]=0;b[r>>1]=u;b[t>>1]=b[p>>1]|0;b[t+2>>1]=b[p+2>>1]|0;b[t+4>>1]=b[p+4>>1]|0;u=e;c[u>>2]=0;c[u+4>>2]=-2147483648;b[e+8>>1]=-1;l=v;return}else q=13}else{if((i|0)>=0){u=g+2|0;a[u>>0]=a[u>>0]|1;b[s>>1]=b[7197]|0;b[s+2>>1]=b[7198]|0;b[s+4>>1]=b[7199]|0;u=f;c[u>>2]=0;c[u+4>>2]=-1073741824;b[r>>1]=-1;Ml(t|0,14394,6)|0;u=e;c[u>>2]=0;c[u+4>>2]=-1073741824;b[e+8>>1]=-1;e=e+10|0;b[e>>1]=b[s>>1]|0;b[e+2>>1]=b[s+2>>1]|0;b[e+4>>1]=b[s+4>>1]|0;l=v;return}k=o&32767;if(k<<16>>16<32767){switch(k<<16>>16){case 0:break;default:break a}k=g+2|0;j=a[k>>0]|0;q=13;break}switch(k<<16>>16){case 32767:break;default:break a}if((h|0)==0&(i&2147483647|0)==0){b[t>>1]=b[s>>1]|0;b[t+2>>1]=b[s+2>>1]|0;b[t+4>>1]=b[s+4>>1]|0;u=e;c[u>>2]=0;c[u+4>>2]=-2147483648;b[e+8>>1]=32767;l=v;return};b[m>>1]=b[s>>1]|0;b[m+2>>1]=b[s+2>>1]|0;b[m+4>>1]=b[s+4>>1]|0;if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&(((h|0)!=0|(i&1073741823|0)!=0)&n<<16>>16==32767)){u=g+2|0;a[u>>0]=a[u>>0]|1};b[s>>1]=b[m>>1]|0;b[s+2>>1]=b[m+2>>1]|0;b[s+4>>1]=b[m+4>>1]|0;u=f;c[u>>2]=h;c[u+4>>2]=i;b[r>>1]=o;b[t>>1]=b[s>>1]|0;b[t+2>>1]=b[s+2>>1]|0;b[t+4>>1]=b[s+4>>1]|0;u=e;c[u>>2]=h;c[u+4>>2]=i;b[e+8>>1]=o;e=e+10|0;b[e>>1]=b[s>>1]|0;b[e+2>>1]=b[s+2>>1]|0;b[e+4>>1]=b[s+4>>1]|0;l=v;return}while(0);if((q|0)==13){a[k>>0]=j|2;o=i>>>0<1|(i|0)==1&h>>>0<0;j=o?h:i;p=j>>>0<65536;j=p?j<<16:j;p=p?16:0;q=j>>>0<16777216;j=((o?32:0)|(q?p|8:p)&255)+(d[10416+((q?j<<8:j)>>>24)>>0]|0)<<24>>24;h=Jl(h|0,i|0,j|0)|0;j=1-j|0;i=y}c[f>>2]=h;c[f+4>>2]=i;b[r>>1]=u|16383;b[t>>1]=b[s>>1]|0;b[t+2>>1]=b[s+2>>1]|0;b[t+4>>1]=b[s+4>>1]|0;h=j+-16383|0;if(!h){h=0;i=0;j=0}else{u=h>>>31;i=(u|0)==0?h:16383-j|0;h=i>>>0<65536;f=h?i<<16:i;h=h?16:0;j=f>>>0<16777216;h=((d[10416+((j?f<<8:f)>>>24)>>0]|0)+((j?h|8:h)&255)<<24)+536870912>>24;i=Jl(i|0,0,h|0)|0;h=(u<<15|16446)-h&65535;j=y}u=e;c[u>>2]=i;c[u+4>>2]=j;b[e+8>>1]=h;l=v;return}function Fi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;B=l;l=l+16|0;v=B+6|0;u=B;x=b[f+8>>1]|0;p=x&32767;q=p<<16>>16==0;if(!(!q?(c[f+4>>2]|0)>=0:0))z=3;if((z|0)==3?(w=b[g+8>>1]|0,s=w&32767,r=s<<16>>16==0,i=g,j=c[i>>2]|0,i=c[i+4>>2]|0,r|(i|0)<0):0){m=f;n=c[m>>2]|0;m=c[m+4>>2]|0;k=p&65535;t=(x&65535)>>>15&255;o=s&65535;A=(w&65535)>>>15&255;if(p<<16>>16==32767){o=m&2147483647;do if((n|0)==0&(o|0)==0){if(s<<16>>16==32767){k=i&2147483647;if(!((j|0)==0&(k|0)==0)){p=j;break}if(A<<24>>24){h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=B;return}}else if(r&((j|0)!=0|(i|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|2};c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}else{p=j;k=i&2147483647}while(0);q=g+10|0;b[v>>1]=b[q>>1]|0;b[v+2>>1]=b[q+2>>1]|0;b[v+4>>1]=b[q+4>>1]|0;q=f+10|0;b[u>>1]=b[q>>1]|0;b[u+2>>1]=b[q+2>>1]|0;b[u+4>>1]=b[q+4>>1]|0;q=(n|0)==0&(o|0)==0;r=(n|0)==(n|0)&(m|0)==(m&-1073741825|0)&((n|0)!=0|(m&1073741823|0)!=0);o=s<<16>>16==32767;p=o&((p|0)!=0|(k|0)!=0);o=(j|0)==(j|0)&(i|0)==(i&-1073741825|0)&(o&((j|0)!=0|(i&1073741823|0)!=0));k=m|-1073741824;i=i|-1073741824;if(r|o){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(r)if(!o)if(p){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else z=20;else{if(q){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(p&(o^1))z=20;else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0}}while(0);do if((z|0)==20){if(k>>>0<i>>>0|(k|0)==(i|0)&n>>>0<j>>>0){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(i>>>0<k>>>0|(i|0)==(k|0)&j>>>0<n>>>0){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}if((x&65535)<(w&65535)){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else{h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}while(0);l=B;return}if(s<<16>>16==32767){if(!((j|0)==0&(i&2147483647|0)==0)){f=g+10|0;b[v>>1]=b[f>>1]|0;b[v+2>>1]=b[f+2>>1]|0;b[v+4>>1]=b[f+4>>1]|0;if((j|0)==(j|0)&(i|0)==(i&-1073741825|0)&((j|0)!=0|(i&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=j;c[h+4>>2]=i|-1073741824;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;l=B;return}if((n|p&65535|0)==0&(m|0)==0)if(!(A<<24>>24)){h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=B;return}else{c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}if(q&((n|0)!=0|(m|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|2}if(!(A<<24>>24)){h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=x|32767;l=B;return}else{h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=x&-32768;l=B;return}}do if(q){if(r&((j|0)!=0|(i|0)!=0)){z=h+2|0;a[z>>0]=a[z>>0]|2}if((n|0)==0&(m|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}w=h+2|0;a[w>>0]=a[w>>0]|2;w=m>>>0<1|(m|0)==1&n>>>0<0;k=w?n:m;x=k>>>0<65536;k=x?k<<16:k;x=x?16:0;z=k>>>0<16777216;k=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?k<<8:k)>>>24)>>0]|0)<<24>>24;n=Jl(n|0,m|0,k|0)|0;m=y;k=1-k|0;if((s&65535)<16383){z=(n|0)==0&(m|0)==0?k+-64|0:k;w=m>>>0<1|(m|0)==1&n>>>0<0;f=w?n:m;x=f>>>0<65536;f=x?f<<16:f;x=x?16:0;A=f>>>0<16777216;f=((w?32:0)|(A?x|8:x)&255)+(d[10416+((A?f<<8:f)>>>24)>>0]|0)|0;A=f<<24>>24;f=Jl(n|0,m|0,((f&255)<<24>>24==0?0:A)|0)|0;oi(e,80,t,z-A|0,f,y,0,0,h);l=B;return}}else if(r){if(!((j|0)==0&(i|0)==0)){w=h+2|0;a[w>>0]=a[w>>0]|2;w=i>>>0<1|(i|0)==1&j>>>0<0;o=w?j:i;x=o>>>0<65536;o=x?o<<16:o;x=x?16:0;z=o>>>0<16777216;o=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?o<<8:o)>>>24)>>0]|0)<<24>>24;j=Jl(j|0,i|0,o|0)|0;o=1-o|0;i=y;break};c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}while(0);if((o|0)>16398){oi(e,80,t,A<<24>>24==0?32767:-16383,n,m,0,0,h);l=B;return}if((o|0)<16383){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=B;return}else{f=Il(j|0,i|0,16446-o|0)|0;oi(e,80,t,(A<<24>>24==0?f:0-f|0)+k|0,n,m,0,0,h);l=B;return}}h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=B;return}function Gi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;l=b[e+8>>1]|0;p=l&32767;j=e;k=c[j>>2]|0;j=c[j+4>>2]|0;do if(p<<16>>16)if((j|0)<0)if(p<<16>>16==32767)if((k|0)==0&(j&2147483647|0)==0){n=4-((l&65535)>>>15&65535)|0;break}else{n=Il(k|0,j|0,62)|0;n=(n&1)+1|0;break}else n=6;else n=1;else n=(k|0)==0&(j|0)==0?0:5;while(0);e=b[f+8>>1]|0;r=e&32767;i=c[f>>2]|0;f=c[f+4>>2]|0;do if(r<<16>>16){if((f|0)<0)if(r<<16>>16==32767)if((i|0)==0&(f&2147483647|0)==0){o=4-((e&65535)>>>15&65535)|0;t=15;break}else{o=Il(i|0,f|0,62)|0;o=(o&1)+1|0;t=15;break}else{o=6;t=15}}else{o=(i|0)==0&(f|0)==0?0:5;t=15}while(0);if((t|0)==15?!((n|0)==1|(o|0)==1):0){if((n|0)==2|(o|0)==2){if(g|0){t=2;return t|0}t=h+2|0;a[t>>0]=a[t>>0]|1;t=2;return t|0}m=(n|0)==5;q=(o|0)==5;if(m|q){h=h+2|0;a[h>>0]=a[h>>0]|2}l=(l&65535)>>>15&255;g=(e&65535)>>>15&255;e=(o|0)==0;if(!n)return (e?0:g<<24>>24==0?-1:1)|0;if(!(l<<24>>24==g<<24>>24&(e^1))){t=l<<24>>24==0?1:-1;return t|0}if(m){n=j>>>0<1|(j|0)==1&k>>>0<0;h=n?k:j;o=h>>>0<65536;h=o?h<<16:h;o=o?16:0;p=h>>>0<16777216;h=((n?32:0)|(p?o|8:o)&255)+(d[10416+((p?h<<8:h)>>>24)>>0]|0)<<24>>24;k=Jl(k|0,j|0,h|0)|0;h=1-h|0;j=y}else h=p&65535;if(q){p=f>>>0<1|(f|0)==1&i>>>0<0;g=p?i:f;q=g>>>0<65536;g=q?g<<16:g;q=q?16:0;r=g>>>0<16777216;g=((p?32:0)|(r?q|8:q)&255)+(d[10416+((r?g<<8:g)>>>24)>>0]|0)<<24>>24;i=Jl(i|0,f|0,g|0)|0;g=1-g|0;f=y}else g=r&65535;e=(h|0)==(g|0);if((k|0)==(i|0)&(j|0)==(f|0)&e){t=0;return t|0}do if(!(l<<24>>24))if((h|0)>=(g|0))if(e){s=j>>>0<f>>>0|(j|0)==(f|0)&k>>>0<i>>>0;t=36;break}else break;else{t=-1;return t|0}else if((g|0)>=(h|0))if(e){s=f>>>0<j>>>0|(f|0)==(j|0)&i>>>0<k>>>0;t=36;break}else break;else{t=-1;return t|0}while(0);if((t|0)==36?s:0){t=-1;return t|0}t=1;return t|0}t=h+2|0;a[t>>0]=a[t>>0]|1;t=2;return t|0}function Hi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;v=l;l=l+144|0;o=v+128|0;n=v+112|0;q=v+80|0;r=v+64|0;s=v+48|0;t=v+32|0;u=v+16|0;p=v;i=v+96|0;c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[o>>2]=c[d>>2];c[o+4>>2]=c[d+4>>2];c[o+8>>2]=c[d+8>>2];c[o+12>>2]=c[d+12>>2];zi(i,n,o,g);c[p>>2]=c[i>>2];c[p+4>>2]=c[i+4>>2];c[p+8>>2]=c[i+8>>2];c[p+12>>2]=c[i+12>>2];i=f+-1|0;k=e+(i<<4)|0;c[s>>2]=c[k>>2];c[s+4>>2]=c[k+4>>2];c[s+8>>2]=c[k+8>>2];c[s+12>>2]=c[k+12>>2];k=r+8|0;m=q+8|0;do{c[n>>2]=c[s>>2];c[n+4>>2]=c[s+4>>2];c[n+8>>2]=c[s+8>>2];c[n+12>>2]=c[s+12>>2];c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];zi(t,n,o,g);c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];j=i;i=i+-1|0;d=q;f=e+(i<<4)|0;h=d+16|0;do{a[d>>0]=a[f>>0]|0;d=d+1|0;f=f+1|0}while((d|0)<(h|0));c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];d=k;d=Il(c[d>>2]|0,c[d+4>>2]|0,63)|0;d=d&255;h=m;h=Il(c[h>>2]|0,c[h+4>>2]|0,63)|0;if(d<<24>>24==(h&255)<<24>>24){c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];vi(u,n,o,d,g)}else{c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];wi(u,n,o,d,g)};c[s>>2]=c[u>>2];c[s+4>>2]=c[u+4>>2];c[s+8>>2]=c[u+8>>2];c[s+12>>2]=c[u+12>>2]}while((j|0)>1);c[b>>2]=c[s>>2];c[b+4>>2]=c[s+4>>2];c[b+8>>2]=c[s+8>>2];c[b+12>>2]=c[s+12>>2];l=v;return}function Ii(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;E=l;l=l+192|0;t=E+176|0;s=E+160|0;w=E+128|0;x=E+112|0;z=E+96|0;A=E+80|0;B=E+64|0;C=E+48|0;D=E+32|0;u=E+16|0;v=E;k=E+144|0;o=b[f+8>>1]|0;m=o&32767;h=f;i=c[h>>2]|0;h=c[h+4>>2]|0;if(!(m<<16>>16==0|(h|0)<0)){g=g+2|0;a[g>>0]=a[g>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=E;return}j=m&65535;n=(o&65535)>>>15;q=n&255;p=o&32767;a:do if(p<<16>>16>=32767){switch(p<<16>>16){case 32767:break;default:{r=15;break a}}if(!((i|0)==0&(h&2147483647|0)==0)){D=f+10|0;b[t>>1]=b[D>>1]|0;b[t+2>>1]=b[D+2>>1]|0;b[t+4>>1]=b[D+4>>1]|0;if((i|0)==(i|0)&(h|0)==(h&-1073741825|0)&(m<<16>>16==32767&((i|0)!=0|(h&1073741823|0)!=0))){g=g+2|0;a[g>>0]=a[g>>0]|1}g=e;c[g>>2]=i;c[g+4>>2]=h;b[e+8>>1]=o;g=e+10|0;b[g>>1]=b[t>>1]|0;b[g+2>>1]=b[t+2>>1]|0;b[g+4>>1]=b[t+4>>1]|0;l=E;return}if(!(q<<24>>24)){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=E;return}else{c[e>>2]=c[3600];c[e+4>>2]=c[3601];c[e+8>>2]=c[3602];c[e+12>>2]=c[3603];l=E;return}}else{switch(p<<16>>16){case 0:break;default:{r=15;break a}}if(!((i|0)==0&(h|0)==0)){B=g+2|0;a[B>>0]=a[B>>0]|34;B=h>>>0<1|(h|0)==1&i>>>0<0;j=B?i:h;C=j>>>0<65536;j=C?j<<16:j;C=C?16:0;D=j>>>0<16777216;j=((B?32:0)|(D?C|8:C)&255)+(d[10416+((D?j<<8:j)>>>24)>>0]|0)<<24>>24;i=Jl(i|0,h|0,j|0)|0;j=1-j|0;h=y;break};c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=E;return}while(0);if((r|0)==15){r=g+2|0;a[r>>0]=a[r>>0]|32;if((m&65535)>=16383)if(o<<16>>16==-16385&((i|0)==0&(h&2147483647|0)==0)){c[e>>2]=c[3608];c[e+4>>2]=c[3609];c[e+8>>2]=c[3610];c[e+12>>2]=c[3611];l=E;return}else{c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=E;return}if((m&65535)>=16315){F=Jl(i|0,h|0,49)|0;o=y;r=Il(i|0,h|0,15)|0;f=y&65535;q=Jl(n&65535|0,0,63)|0;h=y;p=Jl(m&65535|0,0,48)|0;j=v;c[j>>2]=F;c[j+4>>2]=o;j=v+8|0;c[j>>2]=p|q|r;c[j+4>>2]=y|h|f;c[s>>2]=c[v>>2];c[s+4>>2]=c[v+4>>2];c[s+8>>2]=c[v+8>>2];c[s+12>>2]=c[v+12>>2];c[t>>2]=c[3604];c[t+4>>2]=c[3605];c[t+8>>2]=c[3606];c[t+12>>2]=c[3607];zi(k,s,t,g);c[v>>2]=c[k>>2];c[v+4>>2]=c[k+4>>2];c[v+8>>2]=c[k+8>>2];c[v+12>>2]=c[k+12>>2];c[u>>2]=c[k>>2];c[u+4>>2]=c[k+4>>2];c[u+8>>2]=c[k+8>>2];c[u+12>>2]=c[k+12>>2];c[C>>2]=c[k>>2];c[C+4>>2]=c[k+4>>2];c[C+8>>2]=c[k+8>>2];c[C+12>>2]=c[k+12>>2];c[z>>2]=c[2740];c[z+4>>2]=c[2741];c[z+8>>2]=c[2742];c[z+12>>2]=c[2743];j=x+8|0;f=w+8|0;h=14;do{c[s>>2]=c[z>>2];c[s+4>>2]=c[z+4>>2];c[s+8>>2]=c[z+8>>2];c[s+12>>2]=c[z+12>>2];c[t>>2]=c[C>>2];c[t+4>>2]=c[C+4>>2];c[t+8>>2]=c[C+8>>2];c[t+12>>2]=c[C+12>>2];zi(A,s,t,g);c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=h;h=h+-1|0;k=10736+(h<<4)|0;c[w>>2]=c[k>>2];c[w+4>>2]=c[k+4>>2];c[w+8>>2]=c[k+8>>2];c[w+12>>2]=c[k+12>>2];c[x>>2]=c[A>>2];c[x+4>>2]=c[A+4>>2];c[x+8>>2]=c[A+8>>2];c[x+12>>2]=c[A+12>>2];k=j;k=Il(c[k>>2]|0,c[k+4>>2]|0,63)|0;k=k&255;F=f;F=Il(c[F>>2]|0,c[F+4>>2]|0,63)|0;if(k<<24>>24==(F&255)<<24>>24){c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];vi(B,s,t,k,g)}else{c[s>>2]=c[x>>2];c[s+4>>2]=c[x+4>>2];c[s+8>>2]=c[x+8>>2];c[s+12>>2]=c[x+12>>2];c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];wi(B,s,t,k,g)};c[z>>2]=c[B>>2];c[z+4>>2]=c[B+4>>2];c[z+8>>2]=c[B+8>>2];c[z+12>>2]=c[B+12>>2]}while(i>>>0>1);c[D>>2]=c[z>>2];c[D+4>>2]=c[z+4>>2];c[D+8>>2]=c[z+8>>2];c[D+12>>2]=c[z+12>>2];c[s>>2]=c[D>>2];c[s+4>>2]=c[D+4>>2];c[s+8>>2]=c[D+8>>2];c[s+12>>2]=c[D+12>>2];c[t>>2]=c[u>>2];c[t+4>>2]=c[u+4>>2];c[t+8>>2]=c[u+8>>2];c[t+12>>2]=c[u+12>>2];zi(v,s,t,g);c[t>>2]=c[v>>2];c[t+4>>2]=c[v+4>>2];c[t+8>>2]=c[v+8>>2];c[t+12>>2]=c[v+12>>2];ti(e,t,g);l=E;return}}Dl(i|0,0,-1073741824,0)|0;C=y;F=Dl(h|0,0,-1073741824,0)|0;w=y;D=Dl(i|0,0,-774932053,0)|0;A=y;t=Dl(h|0,0,-774932053,0)|0;x=y;v=Dl(i|0,0,-1317922825,0)|0;u=y;B=Dl(h|0,0,-1317922825,0)|0;z=y;x=xl(t|0,x|0,v|0,u|0)|0;t=y;z=xl(t|0,(t>>>0<u>>>0|(t|0)==(u|0)&x>>>0<v>>>0)&1|0,B|0,z|0)|0;B=y;A=xl(0,x|0,D|0,A|0)|0;D=y;x=xl(z|0,B|0,(D>>>0<x>>>0|(D|0)==(x|0)&A>>>0<0)&1|0,0)|0;B=y;w=xl(C|0,0,F|0,w|0)|0;w=xl(w|0,y|0,A|0,D|0)|0;F=y;A=xl(x|0,B|0,(F>>>0<D>>>0|(F|0)==(D|0)&w>>>0<A>>>0)&1|0,0)|0;D=y;B=(D|0)>0|(D|0)==0&A>>>0>0;x=Jl(A|0,D|0,1)|0;C=y;z=Il(w|0,F|0,63)|0;C=C|y;F=Jl(w|0,F|0,B&1|0)|0;oi(e,80,q,j+(B<<31>>31)|0,B?x|z:A,B?C:D,F,y,g);l=E;return}function Ji(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;O=l;l=l+240|0;M=O+224|0;L=O+208|0;G=O+32|0;z=O+16|0;A=O;r=O+192|0;s=O+176|0;H=O+160|0;v=O+144|0;x=O+128|0;B=O+112|0;C=O+96|0;D=O+80|0;E=O+64|0;F=O+48|0;t=b[f+8>>1]|0;i=t&32767;q=i<<16>>16==0;if(!(!q?(c[f+4>>2]|0)>=0:0))K=3;if((K|0)==3?(N=b[g+8>>1]|0,j=N&32767,m=j<<16>>16==0,o=g,p=c[o>>2]|0,o=c[o+4>>2]|0,m|(o|0)<0):0){u=f;w=c[u>>2]|0;u=c[u+4>>2]|0;k=i&65535;I=(t&65535)>>>15&255;n=j&65535;J=(N&65535)>>>15&255;if(j<<16>>16==32767){if(!((p|0)==0&(o&2147483647|0)==0)){n=g+10|0;b[M>>1]=b[n>>1]|0;b[M+2>>1]=b[n+2>>1]|0;b[M+4>>1]=b[n+4>>1]|0;n=f+10|0;b[L>>1]=b[n>>1]|0;b[L+2>>1]=b[n+2>>1]|0;b[L+4>>1]=b[n+4>>1]|0;n=i<<16>>16==32767;k=n&((w|0)!=0|(u&2147483647|0)!=0);n=(w|0)==(w|0)&(u|0)==(u&-1073741825|0)&(n&((w|0)!=0|(u&1073741823|0)!=0));g=(p|0)!=0|(o&1073741823|0)!=0;j=(p|0)==(p|0)&(o|0)==(o&-1073741825|0);m=j&g;i=u|-1073741824;f=o|-1073741824;if(n|m){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(n)if(m)K=15;else{h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0}else{if(!k){h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}if(j&g){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0}else K=15}while(0);do if((K|0)==15){if(i>>>0<f>>>0|(i|0)==(f|0)&w>>>0<p>>>0){h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}if(f>>>0<i>>>0|(f|0)==(i|0)&p>>>0<w>>>0){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}if((t&65535)<(N&65535)){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}else{h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}}while(0);l=O;return}if(i<<16>>16!=32767){if(q&((w|0)!=0|(u|0)!=0)){M=h+2|0;a[M>>0]=a[M>>0]|2}f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870;break}case 3:{K=h+2|0;a[K>>0]=a[K>>0]|32;K=61;break}default:{h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=61}}if((K|0)==61){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16383;l=O;return}if(!((w|0)==0&(u&2147483647|0)==0)){j=g+10|0;b[M>>1]=b[j>>1]|0;b[M+2>>1]=b[j+2>>1]|0;b[M+4>>1]=b[j+4>>1]|0;j=f+10|0;b[L>>1]=b[j>>1]|0;b[L+2>>1]=b[j+2>>1]|0;b[L+4>>1]=b[j+4>>1]|0;j=(w|0)==(w|0)&(u|0)==(u&-1073741825|0)&((w|0)!=0|(u&1073741823|0)!=0);g=(p|0)==(p|0)&(o|0)==(o&-1073741825|0)&((p|0)!=0|(o&1073741823|0)!=0);i=u|-1073741824;f=o|-1073741824;if(j|g){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(j){if(!g){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}if(i>>>0<f>>>0|(i|0)==(f|0)&w>>>0<p>>>0){h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}if(f>>>0<i>>>0|(f|0)==(i|0)&p>>>0<w>>>0){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}if((t&65535)<(N&65535)){h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0;break}else{h=e;c[h>>2]=p;c[h+4>>2]=f;b[e+8>>1]=N;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0;break}}else{h=e;c[h>>2]=w;c[h+4>>2]=i;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[L>>1]|0;b[e+2>>1]=b[L+2>>1]|0;b[e+4>>1]=b[L+4>>1]|0}while(0);l=O;return}f=a[h+1>>0]|0;i=f<<24>>24==0;if(!(I<<24>>24)){do if(i){f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870}else{if(f<<24>>24!=3){h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870;break}}else{h=h+2|0;a[h>>0]=a[h>>0]|32}f=560513588;i=-921707870}while(0);h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16382;l=O;return}else{do if(i){f=h+2|0;a[f>>0]=a[f>>0]|32;f=-1727098456;i=-1765022727}else{if(f<<24>>24!=3){h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=-1727098456;i=-1765022727;break}}else{h=h+2|0;a[h>>0]=a[h>>0]|32}f=-1727098457;i=-1765022727}while(0);h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16384;l=O;return}}a:do if(i<<16>>16==32767){if((w|0)==0&(u&2147483647|0)==0){if(!(m&((p|0)!=0|(o|0)!=0)))break;M=h+2|0;a[M>>0]=a[M>>0]|2;break}f=f+10|0;b[M>>1]=b[f>>1]|0;b[M+2>>1]=b[f+2>>1]|0;b[M+4>>1]=b[f+4>>1]|0;f=u|-1073741824;if((w|0)==(w|0)&(u|0)==(u&-1073741825|0)&((w|0)!=0|(u&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1;h=e;c[h>>2]=w;c[h+4>>2]=f;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0}else{h=e;c[h>>2]=w;c[h+4>>2]=f;b[e+8>>1]=t;e=e+10|0;b[e>>1]=b[M>>1]|0;b[e+2>>1]=b[M+2>>1]|0;b[e+4>>1]=b[M+4>>1]|0}l=O;return}else{do if(m){if(!((p|0)==0&(o|0)==0)){j=h+2|0;a[j>>0]=a[j>>0]|2;j=o>>>0<1|(o|0)==1&p>>>0<0;n=j?p:o;m=n>>>0<65536;n=m?n<<16:n;m=m?16:0;t=n>>>0<16777216;n=((j?32:0)|(t?m|8:m)&255)+(d[10416+((t?n<<8:n)>>>24)>>0]|0)<<24>>24;p=Jl(p|0,o|0,n|0)|0;n=1-n|0;o=y;break}if(!(q&((w|0)!=0|(u|0)!=0)))break a;M=h+2|0;a[M>>0]=a[M>>0]|2;break a}while(0);do if(q){if(!((w|0)==0&(u|0)==0)){m=h+2|0;f=a[m>>0]|2;a[m>>0]=f;t=u>>>0<1|(u|0)==1&w>>>0<0;k=t?w:u;g=k>>>0<65536;k=g?k<<16:k;g=g?16:0;j=k>>>0<16777216;k=((t?32:0)|(j?g|8:g)&255)+(d[10416+((j?k<<8:k)>>>24)>>0]|0)<<24>>24;j=Jl(w|0,u|0,k|0)|0;k=1-k|0;g=y;break}f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870;break}case 3:{K=h+2|0;a[K>>0]=a[K>>0]|32;K=91;break}default:{h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=91}}if((K|0)==91){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16383;l=O;return}else{f=h+2|0;m=f;f=a[f>>0]|0;j=w;g=u}while(0);i=f|32;a[m>>0]=i;f=(k|0)==(n|0);if((j|0)==(p|0)&(g|0)==(o|0)&f){f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{a[m>>0]=i;f=560513589;i=-921707870;break}case 3:{a[m>>0]=i;K=99;break}default:{a[m>>0]=i;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=99}}if((K|0)==99){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16382;l=O;return}xi(r,0,k+-16|0,j,g,0,0,h);xi(s,0,n+-16|0,p,o,0,0,h);if((k|0)>(n|0)|(g>>>0>o>>>0|(g|0)==(o|0)&j>>>0>p>>>0)&f){c[L>>2]=c[s>>2];c[L+4>>2]=c[s+4>>2];c[L+8>>2]=c[s+8>>2];c[L+12>>2]=c[s+12>>2];c[M>>2]=c[r>>2];c[M+4>>2]=c[r+4>>2];c[M+8>>2]=c[r+8>>2];c[M+12>>2]=c[r+12>>2];Ai(H,L,M,h);j=0}else{c[L>>2]=c[r>>2];c[L+4>>2]=c[r+4>>2];c[L+8>>2]=c[r+8>>2];c[L+12>>2]=c[r+12>>2];c[M>>2]=c[s>>2];c[M+4>>2]=c[s+4>>2];c[M+8>>2]=c[s+8>>2];c[M+12>>2]=c[s+12>>2];Ai(H,L,M,h);j=1}i=H+8|0;f=c[i>>2]|0;i=c[i+4>>2]|0;g=Il(f|0,i|0,48)|0;g=g&32767;if(g>>>0>=16344){do if(i>>>0>1073643519|(i|0)==1073643519&f>>>0>4294967295){c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];wi(z,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];vi(z,L,M,f,h)};c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];vi(A,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];wi(A,L,M,f,h)};c[L>>2]=c[z>>2];c[L+4>>2]=c[z+4>>2];c[L+8>>2]=c[z+8>>2];c[L+12>>2]=c[z+12>>2];c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];Ai(H,L,M,h);i=1;f=0;g=H}else{if(g>>>0<=16380){i=0;f=0;g=H;break};c[L>>2]=c[H>>2];c[L+4>>2]=c[H+4>>2];c[L+8>>2]=c[H+8>>2];c[L+12>>2]=c[H+12>>2];c[M>>2]=c[3616];c[M+4>>2]=c[3617];c[M+8>>2]=c[3618];c[M+12>>2]=c[3619];zi(z,L,M,h);c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3616];c[M+4>>2]=c[3617];c[M+8>>2]=c[3618];c[M+12>>2]=c[3619];vi(A,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3616];c[M+4>>2]=c[3617];c[M+8>>2]=c[3618];c[M+12>>2]=c[3619];wi(A,L,M,f,h)};c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];wi(v,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3612];c[M+4>>2]=c[3613];c[M+8>>2]=c[3614];c[M+12>>2]=c[3615];vi(v,L,M,f,h)};c[H>>2]=c[v>>2];c[H+4>>2]=c[v+4>>2];c[H+8>>2]=c[v+8>>2];c[H+12>>2]=c[v+12>>2];c[L>>2]=c[v>>2];c[L+4>>2]=c[v+4>>2];c[L+8>>2]=c[v+8>>2];c[L+12>>2]=c[v+12>>2];c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];Ai(H,L,M,h);i=0;f=1;g=H}while(0);c[A>>2]=c[g>>2];c[A+4>>2]=c[g+4>>2];c[A+8>>2]=c[g+8>>2];c[A+12>>2]=c[g+12>>2];c[z>>2]=c[g>>2];c[z+4>>2]=c[g+4>>2];c[z+8>>2]=c[g+8>>2];c[z+12>>2]=c[g+12>>2];c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];Hi(G,M,10976,11,h);c[L>>2]=c[z>>2];c[L+4>>2]=c[z+4>>2];c[L+8>>2]=c[z+8>>2];c[L+12>>2]=c[z+12>>2];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];zi(x,L,M,h);c[g>>2]=c[x>>2];c[g+4>>2]=c[x+4>>2];c[g+8>>2]=c[x+8>>2];c[g+12>>2]=c[x+12>>2];if(f){c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3620];c[M+4>>2]=c[3621];c[M+8>>2]=c[3622];c[M+12>>2]=c[3623];vi(B,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3620];c[M+4>>2]=c[3621];c[M+8>>2]=c[3622];c[M+12>>2]=c[3623];wi(B,L,M,f,h)};c[g>>2]=c[B>>2];c[g+4>>2]=c[B+4>>2];c[g+8>>2]=c[B+8>>2];c[g+12>>2]=c[B+12>>2]}if(i|0){c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];f=G+8|0;f=Il(c[f>>2]|0,c[f+4>>2]|0,63)|0;f=f&255;if(!(f<<24>>24)){c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3624];c[M+4>>2]=c[3625];c[M+8>>2]=c[3626];c[M+12>>2]=c[3627];vi(C,L,M,0,h)}else{c[L>>2]=c[G>>2];c[L+4>>2]=c[G+4>>2];c[L+8>>2]=c[G+8>>2];c[L+12>>2]=c[G+12>>2];c[M>>2]=c[3624];c[M+4>>2]=c[3625];c[M+8>>2]=c[3626];c[M+12>>2]=c[3627];wi(C,L,M,f,h)};c[g>>2]=c[C>>2];c[g+4>>2]=c[C+4>>2];c[g+8>>2]=c[C+8>>2];c[g+12>>2]=c[C+12>>2]}}if(j|0){c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];N=G+8|0;K=c[N+4>>2]|0;if((K|0)>-1|(K|0)==-1&(c[N>>2]|0)>>>0>4294967295){c[L>>2]=c[3628];c[L+4>>2]=c[3629];c[L+8>>2]=c[3630];c[L+12>>2]=c[3631];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];wi(D,L,M,0,h)}else{c[L>>2]=c[3628];c[L+4>>2]=c[3629];c[L+8>>2]=c[3630];c[L+12>>2]=c[3631];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];vi(D,L,M,0,h)};c[H>>2]=c[D>>2];c[H+4>>2]=c[D+4>>2];c[H+8>>2]=c[D+8>>2];c[H+12>>2]=c[D+12>>2]}if(I<<24>>24){c[G>>2]=c[H>>2];c[G+4>>2]=c[H+4>>2];c[G+8>>2]=c[H+8>>2];c[G+12>>2]=c[H+12>>2];N=G+8|0;K=c[N+4>>2]|0;if((K|0)>-1|(K|0)==-1&(c[N>>2]|0)>>>0>4294967295){c[L>>2]=c[3632];c[L+4>>2]=c[3633];c[L+8>>2]=c[3634];c[L+12>>2]=c[3635];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];wi(E,L,M,0,h)}else{c[L>>2]=c[3632];c[L+4>>2]=c[3633];c[L+8>>2]=c[3634];c[L+12>>2]=c[3635];c[M>>2]=c[G>>2];c[M+4>>2]=c[G+4>>2];c[M+8>>2]=c[G+8>>2];c[M+12>>2]=c[G+12>>2];vi(E,L,M,0,h)};c[H>>2]=c[E>>2];c[H+4>>2]=c[E+4>>2];c[H+8>>2]=c[E+8>>2];c[H+12>>2]=c[E+12>>2]};c[M>>2]=c[H>>2];c[M+4>>2]=c[H+4>>2];c[M+8>>2]=c[H+8>>2];c[M+12>>2]=c[H+12>>2];ti(F,M,h);if(J<<24>>24){h=F+8|0;b[h>>1]=b[h>>1]^-32768};c[e>>2]=c[F>>2];c[e+4>>2]=c[F+4>>2];c[e+8>>2]=c[F+8>>2];c[e+12>>2]=c[F+12>>2];l=O;return}while(0);if(!(I<<24>>24)){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=N&-32768;l=O;return}f=a[h+1>>0]|0;switch(f<<24>>24){case 0:{f=h+2|0;a[f>>0]=a[f>>0]|32;f=560513589;i=-921707870;break}case 3:{K=h+2|0;a[K>>0]=a[K>>0]|32;K=76;break}default:{h=h+2|0;a[h>>0]=a[h>>0]|32;if(J<<24>>24==0?f<<24>>24==2:f<<24>>24==1){f=560513589;i=-921707870}else K=76}}if((K|0)==76){f=560513588;i=-921707870}h=e;c[h>>2]=f;c[h+4>>2]=i;b[e+8>>1]=N&-32768|16384;l=O;return}h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=O;return}function Ki(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+32|0;h=g+16|0;i=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];f=Li(i,h,d,e,0,f)|0;l=g;return f|0}function Li(e,f,g,h,i,j){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;R=l;l=l+80|0;x=R+62|0;v=R+56|0;Q=R+24|0;O=R+16|0;o=R+50|0;r=R+44|0;s=R+38|0;w=R+32|0;P=R;n=h;c[n>>2]=0;c[n+4>>2]=0;n=b[e+8>>1]|0;p=n&32767;t=p<<16>>16==0;if(!(!t?(c[e+4>>2]|0)>=0:0))M=3;if((M|0)==3?(z=b[f+8>>1]|0,u=z&32767,C=f,m=c[C>>2]|0,C=c[C+4>>2]|0,u<<16>>16==0|(C|0)<0):0){N=e;L=c[N>>2]|0;N=c[N+4>>2]|0;q=Q;c[q>>2]=L;c[q+4>>2]=N;q=p&65535;G=(n&65535)>>>15;k=G&65535;if(p<<16>>16==32767){p=N&2147483647;if((L|0)==0&(p|0)==0){k=C&2147483647;if(u<<16>>16!=32767|(m|0)==0&(k|0)==0){j=j+2|0;a[j>>0]=a[j>>0]|1;c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];g=-1;l=R;return g|0}else q=m}else{q=m;k=C&2147483647}s=f+10|0;b[x>>1]=b[s>>1]|0;b[x+2>>1]=b[s+2>>1]|0;b[x+4>>1]=b[s+4>>1]|0;s=e+10|0;b[v>>1]=b[s>>1]|0;b[v+2>>1]=b[s+2>>1]|0;b[v+4>>1]=b[s+4>>1]|0;s=(L|0)==0&(p|0)==0;f=(L|0)==(L|0)&(N|0)==(N&-1073741825|0)&((L|0)!=0|(N&1073741823|0)!=0);p=u<<16>>16==32767;q=p&((q|0)!=0|(k|0)!=0);p=(m|0)==(m|0)&(C|0)==(C&-1073741825|0)&(p&((m|0)!=0|(C&1073741823|0)!=0));k=N|-1073741824;r=C|-1073741824;if(f|p){j=j+2|0;a[j>>0]=a[j>>0]|1}do if(f)if(!p)if(q){b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}else{b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L;break}else M=19;else{if(s){b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}if(q&(p^1))M=19;else{b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L}}while(0);do if((M|0)==19){if(k>>>0<r>>>0|(k|0)==(r|0)&L>>>0<m>>>0){b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}if(r>>>0<k>>>0|(r|0)==(k|0)&m>>>0<L>>>0){b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L;break}if((n&65535)<(z&65535)){b[o>>1]=b[v>>1]|0;b[o+2>>1]=b[v+2>>1]|0;b[o+4>>1]=b[v+4>>1]|0;m=L;break}else{b[o>>1]=b[x>>1]|0;b[o+2>>1]=b[x+2>>1]|0;b[o+4>>1]=b[x+4>>1]|0;n=z;k=r;break}}while(0);j=g;c[j>>2]=m;c[j+4>>2]=k;b[g+8>>1]=n;g=g+10|0;b[g>>1]=b[o>>1]|0;b[g+2>>1]=b[o+2>>1]|0;b[g+4>>1]=b[o+4>>1]|0;g=-1;l=R;return g|0}o=u&65535;p=z&32767;a:do if(p<<16>>16>=32767){switch(p<<16>>16){case 32767:break;default:{f=o;s=C;break a}}if(!((m|0)==0&(C&2147483647|0)==0)){Q=f+10|0;b[x>>1]=b[Q>>1]|0;b[x+2>>1]=b[Q+2>>1]|0;b[x+4>>1]=b[Q+4>>1]|0;if((m|0)==(m|0)&(C|0)==(C&-1073741825|0)&(u<<16>>16==32767&((m|0)!=0|(C&1073741823|0)!=0))){j=j+2|0;a[j>>0]=a[j>>0]|1};b[r>>1]=b[x>>1]|0;b[r+2>>1]=b[x+2>>1]|0;b[r+4>>1]=b[x+4>>1]|0;j=g;c[j>>2]=m;c[j+4>>2]=C|-1073741824;b[g+8>>1]=z;g=g+10|0;b[g>>1]=b[r>>1]|0;b[g+2>>1]=b[r+2>>1]|0;b[g+4>>1]=b[r+4>>1]|0;g=-1;l=R;return g|0}if(!(t&((L|0)!=0|(N|0)!=0))){c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}j=j+2|0;a[j>>0]=a[j>>0]|2;j=N>>>0<1|(N|0)==1&L>>>0<0;o=j?L:N;m=o>>>0<65536;o=m?o<<16:o;m=m?16:0;k=o>>>0<16777216;o=((j?32:0)|(k?m|8:m)&255)+(d[10416+((k?o<<8:o)>>>24)>>0]|0)<<24>>24;k=Jl(L|0,N|0,o|0)|0;m=y;j=Q;c[j>>2]=k;c[j+4>>2]=m;if((N|0)<0){j=g;c[j>>2]=k;c[j+4>>2]=m;b[g+8>>1]=((n&-32768|1)&65535)-o;g=g+10|0;b[g>>1]=b[s>>1]|0;b[g+2>>1]=b[s+2>>1]|0;b[g+4>>1]=b[s+4>>1]|0;g=0;l=R;return g|0}else{c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}}else{switch(p<<16>>16){case 0:break;default:{f=o;s=C;break a}}o=j+2|0;p=a[o>>0]|0;if(!((m|0)==0&(C|0)==0)){a[o>>0]=p|2;z=C>>>0<1|(C|0)==1&m>>>0<0;f=z?m:C;M=f>>>0<65536;f=M?f<<16:f;M=M?16:0;s=f>>>0<16777216;f=((z?32:0)|(s?M|8:M)&255)+(d[10416+((s?f<<8:f)>>>24)>>0]|0)<<24>>24;m=Jl(m|0,C|0,f|0)|0;f=1-f|0;s=y;break}a[o>>0]=p|1;c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];g=-1;l=R;return g|0}while(0);do if(t){if(!((L|0)==0&(N|0)==0)){M=j+2|0;a[M>>0]=a[M>>0]|2;M=N>>>0<1|(N|0)==1&L>>>0<0;q=M?L:N;o=q>>>0<65536;q=o?q<<16:q;o=o?16:0;r=q>>>0<16777216;q=((M?32:0)|(r?o|8:o)&255)+(d[10416+((r?q<<8:q)>>>24)>>0]|0)<<24>>24;r=Jl(L|0,N|0,q|0)|0;o=y;M=Q;c[M>>2]=r;c[M+4>>2]=o;q=1-q|0;break};c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}else{r=L;o=N}while(0);p=q-f|0;M=O;c[M>>2]=0;c[M+4>>2]=0;do if((p|0)<=63){do if((p|0)<0){if((p|0)==-1){L=Jl(r|0,o|0,63)|0;N=y;n=Il(r|0,o|0,1)|0;o=y;M=O;c[M>>2]=L;c[M+4>>2]=N;M=Q;c[M>>2]=n;c[M+4>>2]=o;M=56;break}if((N|0)<0){j=g;c[j>>2]=r;c[j+4>>2]=o;b[g+8>>1]=q+(n&-32768&65535);g=g+10|0;b[g>>1]=b[w>>1]|0;b[g+2>>1]=b[w+2>>1]|0;b[g+4>>1]=b[w+4>>1]|0;g=0;l=R;return g|0}else{c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];g=0;l=R;return g|0}}else if(!p){n=r;M=56}else{n=Mi(r,o,m,s,p,Q,O)|0;o=y;M=58}while(0);if((M|0)==56?!(o>>>0<s>>>0|(o|0)==(s|0)&n>>>0<m>>>0):0){o=yl(n|0,o|0,m|0,s|0)|0;n=Q;c[n>>2]=o;c[n+4>>2]=y;n=1;o=0;M=58}if((M|0)==58){N=h;c[N>>2]=n;c[N+4>>2]=o}if((i|0)==0?(D=Jl(m|0,s|0,63)|0,E=y,A=Il(m|0,s|0,1)|0,B=y,I=Q,H=c[I>>2]|0,I=c[I+4>>2]|0,K=O,J=c[K>>2]|0,K=c[K+4>>2]|0,F=(H|0)!=(A|0)|(I|0)!=(B|0),(I>>>0>B>>>0|(I|0)==(B|0)&H>>>0>=A>>>0)&(F|(K>>>0>E>>>0|(K|0)==(E|0)&J>>>0>=D>>>0))):0){p=B>>>0<I>>>0|(B|0)==(I|0)&A>>>0<H>>>0|(A|0)==(H|0)&(B|0)==(I|0)&(E>>>0<K>>>0|(E|0)==(K|0)&D>>>0<J>>>0);if(!(F|((J|0)!=(D|0)|(K|0)!=(E|0)))){n=h;o=c[n>>2]|0;if(!(p|((o&1|0)!=0|0!=0))){m=f;n=0;break}k=(G^1)&65535;M=xl(o|0,c[n+4>>2]|0,1,0)|0;N=h;c[N>>2]=M;c[N+4>>2]=y;if(!p){m=f;n=0;break}}else{if(!p){m=f;n=0;break}N=h;N=xl(c[N>>2]|0,c[N+4>>2]|0,1,0)|0;k=h;c[k>>2]=N;c[k+4>>2]=y;k=(G^1)&65535}n=yl(m|0,s|0,H|0,I|0)|0;N=((J|0)!=0|(K|0)!=0)<<31>>31;N=xl(n|0,y|0,N|0,((N|0)<0)<<31>>31|0)|0;n=y;M=yl(0,0,J|0,K|0)|0;m=O;c[m>>2]=M;c[m+4>>2]=y;m=Q;c[m>>2]=N;c[m+4>>2]=n;m=f;n=0}else{m=f;n=0}}else{n=p&31|32;Mi(r,o,m,s,n,Q,O)|0;m=q-n|0;n=1}while(0);G=k&255;M=Q;I=c[M>>2]|0;M=c[M+4>>2]|0;J=O;e=c[J>>2]|0;J=c[J+4>>2]|0;h=(I|0)==0&(M|0)==0;I=h?e:I;M=h?J:M;e=h?0:e;J=h?0:J;h=h?m+-64|0:m;Q=M>>>0<1|(M|0)==1&I>>>0<0;L=Q?I:M;O=L>>>0<65536;L=O?L<<16:L;O=O?16:0;H=L>>>0<16777216;L=((Q?32:0)|(H?O|8:O)&255)+(d[10416+((H?L<<8:L)>>>24)>>0]|0)|0;H=L<<24>>24;O=Jl(e|0,J|0,H|0)|0;Q=y;L=(L&255)<<24>>24==0;K=Jl(I|0,M|0,H|0)|0;N=y;J=Il(e|0,J|0,0-H&63|0)|0;oi(P,80,G,h-H|0,L?I:J|K,L?M:y|N,O,Q,j);c[g>>2]=c[P>>2];c[g+4>>2]=c[P+4>>2];c[g+8>>2]=c[P+8>>2];c[g+12>>2]=c[P+12>>2];g=n;l=R;return g|0}j=j+2|0;a[j>>0]=a[j>>0]|1;c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];g=-1;l=R;return g|0}function Mi(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;p=Jl(a|0,b|0,f|0)|0;q=y;o=(f|0)==0;n=Il(a|0,b|0,0-f&63|0)|0;n=o?0:n;o=o?0:y;if(o>>>0<e>>>0|(o|0)==(e|0)&n>>>0<d>>>0){if(e>>>0>o>>>0|(e|0)==(o|0)&0>n>>>0){j=Fl(n|0,o|0,e|0,0)|0;a=0}else{a=0;j=-1}i=Dl(j|0,0,d|0,0)|0;k=y;l=Dl(j|0,0,e|0,0)|0;m=y;b=yl(p|0,q|0,0,i|0)|0;f=y;i=(q>>>0<i>>>0|(q|0)==(i|0)&p>>>0<0)<<31>>31;m=yl(n|0,o|0,l|0,m|0)|0;k=yl(m|0,y|0,k|0,0)|0;i=xl(k|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;k=y;if((k|0)<0)while(1){a=xl(a|0,j|0,0,-1)|0;j=y;l=xl(b|0,f|0,0,d|0)|0;m=y;i=xl(i|0,k|0,e|0,0)|0;i=xl(i|0,y|0,(m>>>0<f>>>0|(m|0)==(f|0)&l>>>0<b>>>0)&1|0,0)|0;k=y;if((k|0)<0){b=l;f=m}else{b=m;f=a;break}}else{b=f;f=a}if(e>>>0>i>>>0|(e|0)==(i|0)&0>b>>>0){a=Fl(b|0,i|0,e|0,0)|0;b=y}else{a=-1;b=0}a=a|f;f=d;i=0;b=b|j}else{a=-1;f=d;i=0;b=-1}u=Dl(a|0,0,f|0,i|0)|0;t=y;j=Dl(b|0,0,f|0,i|0)|0;l=y;m=Dl(a|0,0,e|0,0)|0;k=y;s=Dl(b|0,0,e|0,0)|0;r=y;l=xl(j|0,l|0,m|0,k|0)|0;j=y;f=xl(0,l|0,u|0,t|0)|0;t=y;u=yl(p|0,q|0,f|0,t|0)|0;i=g;c[i>>2]=u;c[i+4>>2]=y;i=(t>>>0<l>>>0|(t|0)==(l|0)&f>>>0<0)<<31>>31;f=(q>>>0<t>>>0|(q|0)==(t|0)&p>>>0<f>>>0)<<31>>31;q=yl(n|0,o|0,s|0,r|0)|0;q=yl(q|0,y|0,j|0,(j>>>0<k>>>0|(j|0)==(k|0)&l>>>0<m>>>0)&1|0)|0;i=xl(q|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;f=xl(i|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;i=y;q=h;c[q>>2]=f;c[q+4>>2]=i;if((i|0)>=0){t=b;u=a;y=t;return u|0}do{a=xl(a|0,b|0,-1,-1)|0;b=y;s=g;u=c[s>>2]|0;s=c[s+4>>2]|0;t=xl(u|0,s|0,d|0,e|0)|0;r=y;q=g;c[q>>2]=t;c[q+4>>2]=r;f=xl(f|0,i|0,(r>>>0<s>>>0|(r|0)==(s|0)&t>>>0<u>>>0)&1|0,0)|0;i=y;u=h;c[u>>2]=f;c[u+4>>2]=i}while((i|0)<0);y=b;return a|0}function Ni(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=l;l=l+32|0;h=g+16|0;i=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];c[i+8>>2]=c[a+8>>2];c[i+12>>2]=c[a+12>>2];c[h>>2]=c[b>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[h+12>>2]=c[b+12>>2];f=Li(i,h,d,e,3,f)|0;l=g;return f|0}function Oi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+176|0;E=H+144|0;D=H+128|0;A=H+64|0;B=H+48|0;C=H+32|0;G=H+16|0;s=H+8|0;t=H;w=H+160|0;j=H+170|0;q=H+164|0;z=H+112|0;x=H+96|0;F=H+80|0;r=t;c[r>>2]=0;c[r+4>>2]=0;r=e+8|0;u=b[r>>1]|0;k=u&32767;i=e;m=c[i>>2]|0;i=c[i+4>>2]|0;a:do if(k<<16>>16==0|(i|0)<0){n=s;c[n>>2]=m;c[n+4>>2]=i;n=k&65535;v=(u&65535)>>>15;p=v&65535;o=u&32767;b:do if(o<<16>>16<32767){switch(o<<16>>16){case 0:break;default:break b}if((m|0)==0&(i|0)==0){c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2];if(f|0){c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2]}if(g|0){c[g>>2]=c[3636];c[g+4>>2]=c[3637];c[g+8>>2]=c[3638];c[g+12>>2]=c[3639]}G=0;l=H;return G|0}j=h+2|0;k=a[j>>0]|0;a[j>>0]=k|2;if((i|0)<0){n=i>>>0<65536;k=Jl(i|0,0,16)|0;k=n?k:i;n=n?16:0;o=k>>>0<16777216;n=(d[10416+((o?k<<8:k)>>>24)>>0]|0)+((o?n|8:n)&255)<<24>>24;m=Jl(m|0,i|0,n|0)|0;i=y;o=s;c[o>>2]=m;c[o+4>>2]=i;n=1-n|0;break}a[j>>0]=k|34;if(!f){c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2]}else{a[j>>0]=k|50;c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2];c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2]}if(g|0){c[g>>2]=c[3636];c[g+4>>2]=c[3637];c[g+8>>2]=c[3638];c[g+12>>2]=c[3639]}G=0;l=H;return G|0}else{switch(o<<16>>16){case 32767:break;default:break b}if((m|0)==0&(i&2147483647|0)==0)break a;G=e+10|0;b[E>>1]=b[G>>1]|0;b[E+2>>1]=b[G+2>>1]|0;b[E+4>>1]=b[G+4>>1]|0;if((m|0)==(m|0)&(i|0)==(i&-1073741825|0)&(k<<16>>16==32767&((m|0)!=0|(i&1073741823|0)!=0))){G=h+2|0;a[G>>0]=a[G>>0]|1};b[j>>1]=b[E>>1]|0;b[j+2>>1]=b[E+2>>1]|0;b[j+4>>1]=b[E+4>>1]|0;b[E>>1]=b[j>>1]|0;b[E+2>>1]=b[j+2>>1]|0;b[E+4>>1]=b[j+4>>1]|0;if(f|0){G=f;c[G>>2]=m;c[G+4>>2]=i;b[f+8>>1]=u;G=f+10|0;b[G>>1]=b[E>>1]|0;b[G+2>>1]=b[E+2>>1]|0;b[G+4>>1]=b[E+4>>1]|0}if(g|0){G=g;c[G>>2]=m;c[G+4>>2]=i;b[g+8>>1]=u;G=g+10|0;b[G>>1]=b[E>>1]|0;b[G+2>>1]=b[E+2>>1]|0;b[G+4>>1]=b[E+4>>1]|0}G=0;l=H;return G|0}while(0);c[w>>2]=p;j=n+-16383|0;if((n|0)>16445){G=-1;l=H;return G|0}p=h+2|0;a[p>>0]=a[p>>0]|32;do if((n|0)<16382){if((n|0)>=16316){o=0;n=n+-16|0;j=0;k=0;break}G=e;c[G>>2]=m;c[G+4>>2]=i;b[r>>1]=n+(u&-32768&65535);G=e+10|0;b[G>>1]=b[q>>1]|0;b[G+2>>1]=b[q+2>>1]|0;b[G+4>>1]=b[q+4>>1]|0;c[E>>2]=c[e>>2];c[E+4>>2]=c[e+4>>2];c[E+8>>2]=c[e+8>>2];c[E+12>>2]=c[e+12>>2];if(f|0){c[f>>2]=c[E>>2];c[f+4>>2]=c[E+4>>2];c[f+8>>2]=c[E+8>>2];c[f+12>>2]=c[E+12>>2]}if(g|0){c[g>>2]=c[3636];c[g+4>>2]=c[3637];c[g+8>>2]=c[3638];c[g+12>>2]=c[3639]}G=0;l=H;return G|0}else{o=Pi(j,w,s,t)|0;i=s;k=t;n=16367;m=c[i>>2]|0;i=c[i+4>>2]|0;j=c[k>>2]|0;k=c[k+4>>2]|0}while(0);xi(z,0,n,m,i,j,k,h);j=v<<16>>16==0?o:0-o|0;if(f|0){i=c[w>>2]|0;c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];if((j&1|0)==0&0==0){c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(A,E,11328,11,h);c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];c[E>>2]=c[A>>2];c[E+4>>2]=c[A+4>>2];c[E+8>>2]=c[A+8>>2];c[E+12>>2]=c[A+12>>2];zi(C,D,E,h);c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2]}else{c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(B,E,11152,11,h);c[G>>2]=c[B>>2];c[G+4>>2]=c[B+4>>2];c[G+8>>2]=c[B+8>>2];c[G+12>>2]=c[B+12>>2];i=0};c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];ti(D,E,h);if(((j&2|0)==0&0==0?i:(i|0)==0&1)|0){v=D+8|0;b[v>>1]=b[v>>1]^-32768};c[x>>2]=c[D>>2];c[x+4>>2]=c[D+4>>2];c[x+8>>2]=c[D+8>>2];c[x+12>>2]=c[D+12>>2];c[f>>2]=c[x>>2];c[f+4>>2]=c[x+4>>2];c[f+8>>2]=c[x+8>>2];c[f+12>>2]=c[x+12>>2]}if(!g){G=0;l=H;return G|0}i=c[w>>2]|0;j=j+1|0;c[G>>2]=c[z>>2];c[G+4>>2]=c[z+4>>2];c[G+8>>2]=c[z+8>>2];c[G+12>>2]=c[z+12>>2];if((j&1|0)==0&0==0){c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(A,E,11328,11,h);c[D>>2]=c[G>>2];c[D+4>>2]=c[G+4>>2];c[D+8>>2]=c[G+8>>2];c[D+12>>2]=c[G+12>>2];c[E>>2]=c[A>>2];c[E+4>>2]=c[A+4>>2];c[E+8>>2]=c[A+8>>2];c[E+12>>2]=c[A+12>>2];zi(C,D,E,h);c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2]}else{c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];Hi(B,E,11152,11,h);c[G>>2]=c[B>>2];c[G+4>>2]=c[B+4>>2];c[G+8>>2]=c[B+8>>2];c[G+12>>2]=c[B+12>>2];i=0};c[E>>2]=c[G>>2];c[E+4>>2]=c[G+4>>2];c[E+8>>2]=c[G+8>>2];c[E+12>>2]=c[G+12>>2];ti(D,E,h);if(((j&2|0)==0&0==0?i:(i|0)==0&1)|0){G=D+8|0;b[G>>1]=b[G>>1]^-32768};c[F>>2]=c[D>>2];c[F+4>>2]=c[D+4>>2];c[F+8>>2]=c[D+8>>2];c[F+12>>2]=c[D+12>>2];c[g>>2]=c[F>>2];c[g+4>>2]=c[F+4>>2];c[g+8>>2]=c[F+8>>2];c[g+12>>2]=c[F+12>>2];G=0;l=H;return G|0}while(0);G=h+2|0;a[G>>0]=a[G>>0]|1;if(f|0){c[f>>2]=c[3596];c[f+4>>2]=c[3597];c[f+8>>2]=c[3598];c[f+12>>2]=c[3599]}if(!g){G=0;l=H;return G|0};c[g>>2]=c[3596];c[g+4>>2]=c[3597];c[g+8>>2]=c[3598];c[g+12>>2]=c[3599];G=0;l=H;return G|0}function Pi(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;do if((a|0)<0){f=d;a=c[f>>2]|0;f=c[f+4>>2]|0;o=Jl(a|0,f|0,63)|0;p=y;f=Il(a|0,f|0,1)|0;a=y;g=e;c[g>>2]=o;c[g+4>>2]=p;g=d;c[g>>2]=f;c[g+4>>2]=a;g=0}else{g=d;h=c[g>>2]|0;g=c[g+4>>2]|0;if(!a){f=xl(h|0,g|0,-560513588,921707869)|0;a=y;if(!(g>>>0>3373259426|(g|0)==-921707870&h>>>0>560513587)){a=g;f=h;g=0;break}g=d;c[g>>2]=f;c[g+4>>2]=a;g=1;break}o=Jl(h|0,g|0,a|0)|0;p=y;m=Il(h|0,g|0,0-a&63|0)|0;n=y;if(n>>>0<3373259426|(n|0)==-921707870&m>>>0<560513588){if(n>>>0<3373259426|(n|0)==-921707870&m>>>0<0){h=Fl(m|0,n|0,-921707870,0)|0;f=0}else{f=0;h=-1}Dl(h|0,0,560513588,0)|0;j=y;g=Dl(h|0,0,0,560513588)|0;l=y;i=yl(o|0,p|0,g|0,l|0)|0;a=y;g=(p>>>0<l>>>0|(p|0)==(l|0)&o>>>0<g>>>0)<<31>>31;l=Dl(h|0,0,921707870,-1)|0;l=xl(l|0,y|0,m|0,n|0)|0;j=yl(l|0,y|0,j|0,0)|0;g=xl(j|0,y|0,g|0,((g|0)<0)<<31>>31|0)|0;j=y;if((j|0)<0)while(1){f=xl(f|0,h|0,0,-1)|0;h=y;k=xl(i|0,a|0,0,560513588)|0;l=y;g=xl(g|0,j|0,-921707870,0)|0;g=xl(g|0,y|0,(a>>>0>3734453707|(a|0)==-560513589&i>>>0>4294967295)&1|0,0)|0;j=y;if((j|0)<0){i=k;a=l}else{a=l;break}}l=g>>>0<3373259426|(g|0)==-921707870&a>>>0<0;g=Fl(a|0,g|0,-921707870,0)|0;g=(l?g:-1)|f;h=(l?y:0)|h}else{g=-1;h=-1}Dl(g|0,0,-1073741824,0)|0;t=y;u=Dl(h|0,0,-1073741824,0)|0;i=y;f=Dl(g|0,0,0,-1073741824)|0;a=y;v=Dl(g|0,0,560513588,0)|0;k=y;s=Dl(h|0,0,560513588,0)|0;q=y;j=Dl(g|0,0,-921707870,0)|0;r=y;q=xl(s|0,q|0,j|0,r|0)|0;s=y;k=xl(0,q|0,v|0,k|0)|0;v=y;i=xl(t|0,0,u|0,i|0)|0;i=xl(i|0,y|0,k|0,v|0)|0;u=y;t=yl(o|0,p|0,i|0,u|0)|0;l=d;c[l>>2]=t;c[l+4>>2]=y;l=(v>>>0<q>>>0|(v|0)==(q|0)&k>>>0<0)<<31>>31;t=Dl(h|0,0,921707870,-1)|0;k=(u>>>0<v>>>0|(u|0)==(v|0)&i>>>0<k>>>0)<<31>>31;i=(p>>>0<u>>>0|(p|0)==(u|0)&o>>>0<i>>>0)<<31>>31;p=xl(t|0,y|0,m|0,n|0)|0;p=yl(p|0,y|0,s|0,(s>>>0<r>>>0|(s|0)==(r|0)&q>>>0<j>>>0)&1|0)|0;p=xl(p|0,y|0,l|0,((l|0)<0)<<31>>31|0)|0;k=xl(p|0,y|0,k|0,((k|0)<0)<<31>>31|0)|0;i=xl(k|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;k=y;p=e;c[p>>2]=i;c[p+4>>2]=k;if((k|0)<0)while(1){g=xl(g|0,h|0,-1,-1)|0;h=y;r=d;s=c[r>>2]|0;r=c[r+4>>2]|0;j=xl(f|0,a|0,0,-1073741824)|0;l=y;v=(f|0)!=0|(a|0)!=0;t=xl((v?560513589:560513588)|0,(v?-921707870:-921707870)|0,s|0,r|0)|0;u=y;s=xl(i|0,k|0,(r>>>0>921707869|(r|0)==921707869&s>>>0>3734453707)&1|0,0)|0;i=xl(s|0,y|0,(u>>>0<0|(u|0)==0&t>>>0<(v&1)>>>0)&1|0,0)|0;k=y;v=d;c[v>>2]=t;c[v+4>>2]=u;v=e;c[v>>2]=i;c[v+4>>2]=k;if((k|0)>=0){f=j;a=l;break}else{f=j;a=l}}v=e;c[v>>2]=f;c[v+4>>2]=a;f=d;a=c[f+4>>2]|0;f=c[f>>2]|0}while(0);i=e;h=c[i>>2]|0;i=c[i+4>>2]|0;if(a>>>0<1686629713|(a|0)==1686629713&f>>>0<280256794){v=g;v=v&3;return v|0}j=(f|0)!=280256794|(a|0)!=1686629713;if(!(j|(i>>>0>1610612735|(i|0)==1610612735&h>>>0>4294967295))){v=g;v=v&3;return v|0}f=a>>>0>1686629713|(a|0)==1686629713&f>>>0>280256794|(f|0)==280256794&(a|0)==1686629713&(i>>>0>1610612736|(i|0)==1610612736&h>>>0>0);do if(j|((h|0)!=0|(i|0)!=1610612736))if(f){c[b>>2]=(c[b>>2]|0)==0&1;a=g+1|0;break}else{v=g;v=v&3;return v|0}else{if(!((g&1|0)!=0|0!=0|f)){v=g;v=v&3;return v|0}c[b>>2]=(c[b>>2]|0)==0&1;a=g+1|0;if(!f){v=a;v=v&3;return v|0}}while(0);v=d;s=c[v>>2]|0;v=c[v+4>>2]|0;t=e;u=c[t>>2]|0;t=c[t+4>>2]|0;q=yl(0,-1073741824,u|0,t|0)|0;r=e;c[r>>2]=q;c[r+4>>2]=y;v=yl(560513588,-921707870,s|0,v|0)|0;u=(t>>>0>3221225472|(t|0)==-1073741824&u>>>0>0)<<31>>31;u=xl(v|0,y|0,u|0,((u|0)<0)<<31>>31|0)|0;v=d;c[v>>2]=u;c[v+4>>2]=y;v=a;v=v&3;return v|0}function Qi(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+192|0;B=I+144|0;w=I+128|0;q=I+48|0;r=I+16|0;s=I+8|0;t=I;u=I+160|0;D=I+164|0;h=I+176|0;p=I+170|0;G=I+112|0;z=I+96|0;A=I+80|0;x=I+64|0;F=I+32|0;i=t;c[i>>2]=0;c[i+4>>2]=0;i=e;o=c[i>>2]|0;i=c[i+4>>2]|0;C=e+8|0;v=b[C>>1]|0;E=e+10|0;b[D>>1]=b[E>>1]|0;b[D+2>>1]=b[E+2>>1]|0;b[D+4>>1]=b[E+4>>1]|0;j=v&32767;n=(i|0)<0;a:do if(n|j<<16>>16==0){k=s;c[k>>2]=o;c[k+4>>2]=i;k=j&65535;g=(v&65535)>>>15&65535;m=v&32767;b:do if(m<<16>>16<32767){switch(m<<16>>16){case 0:break;default:{j=o;break b}}if((o|0)==0&(i|0)==0){H=0;l=I;return H|0}h=f+2|0;j=a[h>>0]|0;a[h>>0]=j|2;if(n){k=i>>>0<65536;n=Jl(i|0,0,16)|0;n=k?n:i;k=k?16:0;j=n>>>0<16777216;k=(d[10416+((j?n<<8:n)>>>24)>>0]|0)+((j?k|8:k)&255)<<24>>24;j=Jl(o|0,i|0,k|0)|0;i=y;o=s;c[o>>2]=j;c[o+4>>2]=i;k=1-k|0;break}a[h>>0]=j|50;H=0;l=I;return H|0}else{switch(m<<16>>16){case 32767:break;default:{j=o;break b}}if((o|0)==0&(i&2147483647|0)==0)break a;b[B>>1]=b[D>>1]|0;b[B+2>>1]=b[D+2>>1]|0;b[B+4>>1]=b[D+4>>1]|0;if((o|0)==(o|0)&(i|0)==(i&-1073741825|0)&(((o|0)!=0|(i&1073741823|0)!=0)&j<<16>>16==32767)){H=f+2|0;a[H>>0]=a[H>>0]|1};b[h>>1]=b[B>>1]|0;b[h+2>>1]=b[B+2>>1]|0;b[h+4>>1]=b[B+4>>1]|0;H=e;c[H>>2]=o;c[H+4>>2]=i;b[C>>1]=v;b[E>>1]=b[h>>1]|0;b[E+2>>1]=b[h+2>>1]|0;b[E+4>>1]=b[h+4>>1]|0;H=0;l=I;return H|0}while(0);c[u>>2]=g;h=k+-16383|0;if((k|0)>16445){H=-1;l=I;return H|0}o=f+2|0;a[o>>0]=a[o>>0]|32;do if((k|0)>=16382){v=((Pi(h,u,s,t)|0)&1|0)==0;xi(G,0,16367,c[s>>2]|0,c[s+4>>2]|0,c[t>>2]|0,c[t+4>>2]|0,f);c[r>>2]=c[G>>2];c[r+4>>2]=c[G+4>>2];c[r+8>>2]=c[G+8>>2];c[r+12>>2]=c[G+12>>2];c[B>>2]=c[r>>2];c[B+4>>2]=c[r+4>>2];c[B+8>>2]=c[r+8>>2];c[B+12>>2]=c[r+12>>2];Hi(q,B,11328,11,f);c[w>>2]=c[G>>2];c[w+4>>2]=c[G+4>>2];c[w+8>>2]=c[G+8>>2];c[w+12>>2]=c[G+12>>2];c[B>>2]=c[q>>2];c[B+4>>2]=c[q+4>>2];c[B+8>>2]=c[q+8>>2];c[B+12>>2]=c[q+12>>2];zi(z,w,B,f);c[B>>2]=c[G>>2];c[B+4>>2]=c[G+4>>2];c[B+8>>2]=c[G+8>>2];c[B+12>>2]=c[G+12>>2];Hi(A,B,11152,11,f);if(v){g=c[u>>2]|0;h=G;H=20;break}else{c[w>>2]=c[A>>2];c[w+4>>2]=c[A+4>>2];c[w+8>>2]=c[A+8>>2];c[w+12>>2]=c[A+12>>2];c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];c[B+8>>2]=c[z+8>>2];c[B+12>>2]=c[z+12>>2];Ai(G,w,B,f);g=(c[u>>2]|0)==0&1;c[u>>2]=g;break}}else{if((k|0)>=16316){xi(G,0,k+-16|0,j,i,0,0,f);c[r>>2]=c[G>>2];c[r+4>>2]=c[G+4>>2];c[r+8>>2]=c[G+8>>2];c[r+12>>2]=c[G+12>>2];c[B>>2]=c[r>>2];c[B+4>>2]=c[r+4>>2];c[B+8>>2]=c[r+8>>2];c[B+12>>2]=c[r+12>>2];Hi(q,B,11328,11,f);c[w>>2]=c[G>>2];c[w+4>>2]=c[G+4>>2];c[w+8>>2]=c[G+8>>2];c[w+12>>2]=c[G+12>>2];c[B>>2]=c[q>>2];c[B+4>>2]=c[q+4>>2];c[B+8>>2]=c[q+8>>2];c[B+12>>2]=c[q+12>>2];zi(z,w,B,f);c[B>>2]=c[G>>2];c[B+4>>2]=c[G+4>>2];c[B+8>>2]=c[G+8>>2];c[B+12>>2]=c[G+12>>2];Hi(A,B,11152,11,f);h=G;H=20;break}H=e;c[H>>2]=j;c[H+4>>2]=i;b[C>>1]=k+(v&-32768&65535);b[E>>1]=b[p>>1]|0;b[E+2>>1]=b[p+2>>1]|0;b[E+4>>1]=b[p+4>>1]|0;H=0;l=I;return H|0}while(0);if((H|0)==20){c[w>>2]=c[z>>2];c[w+4>>2]=c[z+4>>2];c[w+8>>2]=c[z+8>>2];c[w+12>>2]=c[z+12>>2];c[B>>2]=c[A>>2];c[B+4>>2]=c[A+4>>2];c[B+8>>2]=c[A+8>>2];c[B+12>>2]=c[A+12>>2];Ai(x,w,B,f);c[h>>2]=c[x>>2];c[h+4>>2]=c[x+4>>2];c[h+8>>2]=c[x+8>>2];c[h+12>>2]=c[x+12>>2]};c[B>>2]=c[G>>2];c[B+4>>2]=c[G+4>>2];c[B+8>>2]=c[G+8>>2];c[B+12>>2]=c[G+12>>2];ti(F,B,f);f=F;B=c[f>>2]|0;f=c[f+4>>2]|0;H=b[F+8>>1]|0;G=F+10|0;b[D>>1]=b[G>>1]|0;b[D+2>>1]=b[G+2>>1]|0;b[D+4>>1]=b[G+4>>1]|0;G=e;c[G>>2]=B;c[G+4>>2]=f;b[C>>1]=(g|0)==0?H:H^-32768;b[E>>1]=b[D>>1]|0;b[E+2>>1]=b[D+2>>1]|0;b[E+4>>1]=b[D+4>>1]|0;H=0;l=I;return H|0}while(0);H=f+2|0;a[H>>0]=a[H>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];H=0;l=I;return H|0}function Ri(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+160|0;H=I+144|0;G=I+128|0;C=I+80|0;D=I+64|0;r=I+48|0;s=I+32|0;t=I+16|0;p=I;x=I+112|0;z=I+96|0;v=b[f+8>>1]|0;i=v&32767;k=i<<16>>16==0;if(!(!k?(c[f+4>>2]|0)>=0:0))w=3;a:do if((w|0)==3?(E=b[g+8>>1]|0,q=E&32767,o=q<<16>>16==0,A=g,F=c[A>>2]|0,A=c[A+4>>2]|0,o|(A|0)<0):0){u=f;B=c[u>>2]|0;u=c[u+4>>2]|0;j=i&65535;m=(v&65535)>>>15&255;n=(E&65535)>>>15&255^1;if(i<<16>>16==32767){j=u&2147483647;if((B|0)==0&(j|0)==0){i=A&2147483647;if(q<<16>>16!=32767|(F|0)==0&(i|0)==0){if(m<<24>>24)break;if(o){if((F|0)==0&(A|0)==0)break;h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=E|32767;l=I;return}else k=F}else{k=F;i=A&2147483647}n=g+10|0;b[H>>1]=b[n>>1]|0;b[H+2>>1]=b[n+2>>1]|0;b[H+4>>1]=b[n+4>>1]|0;n=f+10|0;b[G>>1]=b[n>>1]|0;b[G+2>>1]=b[n+2>>1]|0;b[G+4>>1]=b[n+4>>1]|0;n=(B|0)==0&(j|0)==0;f=(B|0)==(B|0)&(u|0)==(u&-1073741825|0)&((B|0)!=0|(u&1073741823|0)!=0);j=q<<16>>16==32767;m=j&((k|0)!=0|(i|0)!=0);k=(F|0)==(F|0)&(A|0)==(A&-1073741825|0)&(j&((F|0)!=0|(A&1073741823|0)!=0));j=u|-1073741824;i=A|-1073741824;if(f|k){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(f)if(!k)if(m){h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}else{h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0;break}else w=19;else{if(n){h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}if(m&(k^1))w=19;else{h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0}}while(0);do if((w|0)==19){if(j>>>0<i>>>0|(j|0)==(i|0)&B>>>0<F>>>0){h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}if(i>>>0<j>>>0|(i|0)==(j|0)&F>>>0<B>>>0){h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0;break}if((v&65535)<(E&65535)){h=e;c[h>>2]=B;c[h+4>>2]=j;b[e+8>>1]=v;h=e+10|0;b[h>>1]=b[G>>1]|0;b[h+2>>1]=b[G+2>>1]|0;b[h+4>>1]=b[G+4>>1]|0;break}else{h=e;c[h>>2]=F;c[h+4>>2]=i;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;break}}while(0);l=I;return}if(q<<16>>16==32767){if(!((F|0)==0&(A&2147483647|0)==0)){G=g+10|0;b[H>>1]=b[G>>1]|0;b[H+2>>1]=b[G+2>>1]|0;b[H+4>>1]=b[G+4>>1]|0;if((F|0)==(F|0)&(A|0)==(A&-1073741825|0)&((F|0)!=0|(A&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=F;c[h+4>>2]=A|-1073741824;b[e+8>>1]=E;h=e+10|0;b[h>>1]=b[H>>1]|0;b[h+2>>1]=b[H+2>>1]|0;b[h+4>>1]=b[H+4>>1]|0;l=I;return}if(m<<24>>24?!((B|i&65535|0)==0&(u|0)==0):0)break;if(!(k&((B|0)!=0|(u|0)!=0))){if((i&65535)>=16383){if(i<<16>>16==16383&((B|0)==0&(u&2147483647|0)==0))break;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=E|32767;l=I;return}}else{h=h+2|0;a[h>>0]=a[h>>0]|2}h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(n&255)<<15|32767;l=I;return}do if(!k)if(!(m<<24>>24)){k=u;i=B}else break a;else{if(!((B|0)==0&(u|0)==0)){if(m<<24>>24)break a;w=h+2|0;a[w>>0]=a[w>>0]|2;w=u>>>0<1|(u|0)==1&B>>>0<0;j=w?B:u;k=j>>>0<65536;j=k?j<<16:j;k=k?16:0;i=j>>>0<16777216;j=((w?32:0)|(i?k|8:k)&255)+(d[10416+((i?j<<8:j)>>>24)>>0]|0)<<24>>24;i=Jl(B|0,u|0,j|0)|0;j=1-j|0;k=y;break}if((F|q&65535|0)==0&(A|0)==0)break a;h=h+2|0;a[h>>0]=a[h>>0]|4;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=(n&255)<<15|32767;l=I;return}while(0);do if(o){if(!((F|0)==0&(A|0)==0)){F=h+2|0;a[F>>0]=a[F>>0]|2;break}if((j|0)<16383){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=(n&255)<<15;l=I;return}else{h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=E&-32768;l=I;return}}while(0);if((j|0)==16383&((i|0)==0&(k&2147483647|0)==0)){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=E&-32768;l=I;return}B=h+2|0;a[B>>0]=a[B>>0]|32;B=k>>>0>3037000499|(k|0)==-1257966797&i>>>0>4192101507;j=(B?-16382:-16383)+j|0;w=Jl(i|0,k|0,49)|0;A=y;E=Il(i|0,k|0,15)|0;F=y&65535;B=Jl((B<<31>>31)+16383|0,0,48)|0;i=x;c[i>>2]=w;c[i+4>>2]=A;i=x+8|0;c[i>>2]=B|E;c[i+4>>2]=y|F;c[p>>2]=c[x>>2];c[p+4>>2]=c[x+4>>2];c[p+8>>2]=c[x+8>>2];c[p+12>>2]=c[x+12>>2];c[C>>2]=c[x>>2];c[C+4>>2]=c[x+4>>2];c[C+8>>2]=c[x+8>>2];c[C+12>>2]=c[x+12>>2];i=C+8|0;i=Il(c[i>>2]|0,c[i+4>>2]|0,63)|0;i=i&255;if(!(i<<24>>24)){c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];vi(D,G,H,0,h)}else{c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];wi(D,G,H,i,h)};c[C>>2]=c[p>>2];c[C+4>>2]=c[p+4>>2];c[C+8>>2]=c[p+8>>2];c[C+12>>2]=c[p+12>>2];i=C+8|0;i=Il(c[i>>2]|0,c[i+4>>2]|0,63)|0;i=i&255;if(!(i<<24>>24)){c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];wi(r,G,H,0,h)}else{c[G>>2]=c[C>>2];c[G+4>>2]=c[C+4>>2];c[G+8>>2]=c[C+8>>2];c[G+12>>2]=c[C+12>>2];c[H>>2]=c[3612];c[H+4>>2]=c[3613];c[H+8>>2]=c[3614];c[H+12>>2]=c[3615];vi(r,G,H,i,h)};c[G>>2]=c[r>>2];c[G+4>>2]=c[r+4>>2];c[G+8>>2]=c[r+8>>2];c[G+12>>2]=c[r+12>>2];c[H>>2]=c[D>>2];c[H+4>>2]=c[D+4>>2];c[H+8>>2]=c[D+8>>2];c[H+12>>2]=c[D+12>>2];Ai(s,G,H,h);c[H>>2]=c[s>>2];c[H+4>>2]=c[s+4>>2];c[H+8>>2]=c[s+8>>2];c[H+12>>2]=c[s+12>>2];Hi(C,H,11504,9,h);c[G>>2]=c[s>>2];c[G+4>>2]=c[s+4>>2];c[G+8>>2]=c[s+8>>2];c[G+12>>2]=c[s+12>>2];c[H>>2]=c[C>>2];c[H+4>>2]=c[C+4>>2];c[H+8>>2]=c[C+8>>2];c[H+12>>2]=c[C+12>>2];zi(t,G,H,h);c[G>>2]=c[t>>2];c[G+4>>2]=c[t+4>>2];c[G+8>>2]=c[t+8>>2];c[G+12>>2]=c[t+12>>2];c[H>>2]=c[3640];c[H+4>>2]=c[3641];c[H+8>>2]=c[3642];c[H+12>>2]=c[3643];zi(x,G,H,h);i=((j|0)<0)<<31>>31;if(!j){i=0;j=0;k=0;m=0}else{u=(i|0)>-1|(i|0)==-1&j>>>0>4294967295;t=yl(0,0,j|0,i|0)|0;t=u?j:t;u=u?i:y;B=u>>>0<1|(u|0)==1&t>>>0<0;A=B?t:u;w=A>>>0<65536;A=w?A<<16:A;w=w?16:0;E=A>>>0<16777216;A=(((B?32:0)|(E?w|8:w)&255)+(d[10416+((E?A<<8:A)>>>24)>>0]|0)&255)+49|0;E=A<<24;w=E>>24;E=(E|0)>1056964608;B=E?t:0;v=E?u:0;t=E?0:t;u=E?0:u;A=(E?w+192|0:A)<<24;E=A>>24;m=Jl(t|0,u|0,E|0)|0;j=y;A=(A|0)==0;F=Jl(B|0,v|0,E|0)|0;k=y;E=Il(t|0,u|0,0-E&63|0)|0;k=A?v:y|k;w=Jl(16494-w|0,0,48)|0;i=xl(w|0,y|0,0,i&-2147483648|0)|0;k=xl(i|0,y|0,(A?B:E|F)|0,k|0)|0;i=m;m=y}F=C;c[F>>2]=i;c[F+4>>2]=j;i=C+8|0;c[i>>2]=k;c[i+4>>2]=m;c[D>>2]=c[x>>2];c[D+4>>2]=c[x+4>>2];c[D+8>>2]=c[x+8>>2];c[D+12>>2]=c[x+12>>2];i=D+8|0;i=Il(c[i>>2]|0,c[i+4>>2]|0,63)|0;i=i&255;F=Il(k|0,m|0,63)|0;if(i<<24>>24==(F&255)<<24>>24){c[G>>2]=c[D>>2];c[G+4>>2]=c[D+4>>2];c[G+8>>2]=c[D+8>>2];c[G+12>>2]=c[D+12>>2];c[H>>2]=c[C>>2];c[H+4>>2]=c[C+4>>2];c[H+8>>2]=c[C+8>>2];c[H+12>>2]=c[C+12>>2];vi(z,G,H,i,h)}else{c[G>>2]=c[D>>2];c[G+4>>2]=c[D+4>>2];c[G+8>>2]=c[D+8>>2];c[G+12>>2]=c[D+12>>2];c[H>>2]=c[C>>2];c[H+4>>2]=c[C+4>>2];c[H+8>>2]=c[C+8>>2];c[H+12>>2]=c[C+12>>2];wi(z,G,H,i,h)};c[x>>2]=c[z>>2];c[x+4>>2]=c[z+4>>2];c[x+8>>2]=c[z+8>>2];c[x+12>>2]=c[z+12>>2];c[G>>2]=c[g>>2];c[G+4>>2]=c[g+4>>2];c[G+8>>2]=c[g+8>>2];c[G+12>>2]=c[g+12>>2];c[H>>2]=c[z>>2];c[H+4>>2]=c[z+4>>2];c[H+8>>2]=c[z+8>>2];c[H+12>>2]=c[z+12>>2];Bi(e,G,H,h);l=I;return}while(0);h=h+2|0;a[h>>0]=a[h>>0]|1;c[e>>2]=c[3596];c[e+4>>2]=c[3597];c[e+8>>2]=c[3598];c[e+12>>2]=c[3599];l=I;return}function Si(f,g,h,i){f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;M=l;l=l+144|0;L=M+128|0;K=M+112|0;E=M+64|0;w=M+48|0;x=M+32|0;z=M+16|0;A=M;B=M+96|0;v=M+80|0;C=b[g+8>>1]|0;j=C&32767;k=j<<16>>16==0;if(!(!k?(c[g+4>>2]|0)>=0:0))H=3;do if((H|0)==3?(D=b[h+8>>1]|0,r=D&32767,s=r<<16>>16==0,J=h,I=c[J>>2]|0,J=c[J+4>>2]|0,s|(J|0)<0):0){F=g;q=c[F>>2]|0;F=c[F+4>>2]|0;n=j&65535;t=(C&65535)>>>15;G=t&255;m=r&65535;o=(D&65535)>>>15^t;u=o&255;if(j<<16>>16==32767){k=F&2147483647;if((q|0)==0&(k|0)==0){j=J&2147483647;if(r<<16>>16!=32767|(I|0)==0&(j|0)==0){if(G<<24>>24)break;if(s){if((I|0)==0&(J|0)==0)break;i=i+2|0;a[i>>0]=a[i>>0]|2}i=f;c[i>>2]=0;c[i+4>>2]=-2147483648;b[f+8>>1]=D|32767;l=M;return}else m=I}else{m=I;j=J&2147483647}o=h+10|0;b[L>>1]=b[o>>1]|0;b[L+2>>1]=b[o+2>>1]|0;b[L+4>>1]=b[o+4>>1]|0;o=g+10|0;b[K>>1]=b[o>>1]|0;b[K+2>>1]=b[o+2>>1]|0;b[K+4>>1]=b[o+4>>1]|0;o=(q|0)==0&(k|0)==0;p=(q|0)==(q|0)&(F|0)==(F&-1073741825|0)&((q|0)!=0|(F&1073741823|0)!=0);k=r<<16>>16==32767;n=k&((m|0)!=0|(j|0)!=0);m=(I|0)==(I|0)&(J|0)==(J&-1073741825|0)&(k&((I|0)!=0|(J&1073741823|0)!=0));k=F|-1073741824;j=J|-1073741824;if(p|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(p)if(!m)if(n){i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}else{i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0;break}else H=19;else{if(o){i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}if(n&(m^1))H=19;else{i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0}}while(0);do if((H|0)==19){if(k>>>0<j>>>0|(k|0)==(j|0)&q>>>0<I>>>0){i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&I>>>0<q>>>0){i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0;break}if((C&65535)<(D&65535)){i=f;c[i>>2]=q;c[i+4>>2]=k;b[f+8>>1]=C;i=f+10|0;b[i>>1]=b[K>>1]|0;b[i+2>>1]=b[K+2>>1]|0;b[i+4>>1]=b[K+4>>1]|0;break}else{i=f;c[i>>2]=I;c[i+4>>2]=j;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;break}}while(0);l=M;return}if(r<<16>>16==32767){if(!((I|0)==0&(J&2147483647|0)==0)){K=h+10|0;b[L>>1]=b[K>>1]|0;b[L+2>>1]=b[K+2>>1]|0;b[L+4>>1]=b[K+4>>1]|0;if((I|0)==(I|0)&(J|0)==(J&-1073741825|0)&((I|0)!=0|(J&1073741823|0)!=0)){i=i+2|0;a[i>>0]=a[i>>0]|1}i=f;c[i>>2]=I;c[i+4>>2]=J|-1073741824;b[f+8>>1]=D;i=f+10|0;b[i>>1]=b[L>>1]|0;b[i+2>>1]=b[L+2>>1]|0;b[i+4>>1]=b[L+4>>1]|0;l=M;return}if(k){if((q|0)==0&(F|0)==0)break;i=i+2|0;a[i>>0]=a[i>>0]|2}i=f;c[i>>2]=0;c[i+4>>2]=-2147483648;b[f+8>>1]=o<<15&65535|32767;l=M;return}do if(k){if(!((q|0)==0&(F|0)==0)){D=i+2|0;a[D>>0]=a[D>>0]|2;D=F>>>0<1|(F|0)==1&q>>>0<0;r=D?q:F;H=r>>>0<65536;r=H?r<<16:r;H=H?16:0;p=r>>>0<16777216;r=((D?32:0)|(p?H|8:H)&255)+(d[10416+((p?r<<8:r)>>>24)>>0]|0)<<24>>24;q=Jl(q|0,F|0,r|0)|0;r=1-r|0;p=y;break}if(s&((I|0)!=0|(J|0)!=0)){i=i+2|0;a[i>>0]=a[i>>0]|2}i=f;c[i>>2]=0;c[i+4>>2]=0;b[f+8>>1]=o<<15;l=M;return}else{r=n;p=F}while(0);do if(s){if(!((I|0)==0&(J|0)==0)){n=i+2|0;o=a[n>>0]|2;a[n>>0]=o;H=J>>>0<1|(J|0)==1&I>>>0<0;m=H?I:J;j=m>>>0<65536;m=j?m<<16:m;j=j?16:0;k=m>>>0<16777216;m=((H?32:0)|(k?j|8:j)&255)+(d[10416+((k?m<<8:m)>>>24)>>0]|0)<<24>>24;k=Jl(I|0,J|0,m|0)|0;m=1-m|0;j=y;break}i=f;c[i>>2]=0;c[i+4>>2]=0;b[f+8>>1]=o<<15;l=M;return}else{o=i+2|0;n=o;o=a[o>>0]|0;k=I;j=J}while(0);a[n>>0]=o|32;if(G<<24>>24!=0&(r|0)>16382){c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];l=M;return}if((r|0)>16379){c[E>>2]=c[g>>2];c[E+4>>2]=c[g+4>>2];c[E+8>>2]=c[g+8>>2];c[E+12>>2]=c[g+12>>2];j=(e[E+8>>1]|0)>>>15&255;if(!(j<<24>>24)){c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3636];c[L+4>>2]=c[3637];c[L+8>>2]=c[3638];c[L+12>>2]=c[3639];mi(B,K,L,0,i)}else{c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3636];c[L+4>>2]=c[3637];c[L+8>>2]=c[3638];c[L+12>>2]=c[3639];ni(B,K,L,j,i)};c[K>>2]=c[B>>2];c[K+4>>2]=c[B+4>>2];c[K+8>>2]=c[B+8>>2];c[K+12>>2]=c[B+12>>2];c[L>>2]=c[h>>2];c[L+4>>2]=c[h+4>>2];c[L+8>>2]=c[h+8>>2];c[L+12>>2]=c[h+12>>2];Ri(f,K,L,i);l=M;return}if((r|0)<16313){Dl(q|0,0,-1073741824,0)|0;F=y;D=Dl(p|0,0,-1073741824,0)|0;B=y;g=Dl(q|0,0,1545072827,0)|0;w=y;C=Dl(p|0,0,1545072827,0)|0;L=y;I=Dl(q|0,0,-1196803287,0)|0;E=y;H=Dl(p|0,0,-1196803287,0)|0;G=y;L=xl(C|0,L|0,I|0,E|0)|0;C=y;G=xl(C|0,(C>>>0<E>>>0|(C|0)==(E|0)&L>>>0<I>>>0)&1|0,H|0,G|0)|0;H=y;w=xl(0,L|0,g|0,w|0)|0;g=y;L=xl(G|0,H|0,(g>>>0<L>>>0|(g|0)==(L|0)&w>>>0<0)&1|0,0)|0;H=y;B=xl(F|0,0,D|0,B|0)|0;B=xl(B|0,y|0,w|0,g|0)|0;D=y;w=xl(L|0,H|0,(D>>>0<g>>>0|(D|0)==(g|0)&B>>>0<w>>>0)&1|0,0)|0;g=y;H=(g|0)>0|(g|0)==0&w>>>0>0;L=Jl(w|0,g|0,1)|0;F=y;G=Il(B|0,D|0,63)|0;w=H?L|G:w;g=H?F|y:g;D=Jl(B|0,D|0,H&1|0)|0;B=y;F=Dl(k|0,0,D|0,0)|0;G=y;D=Dl(j|0,0,D|0,0)|0;L=y;I=Dl(k|0,0,B|0,0)|0;E=y;B=Dl(j|0,0,B|0,0)|0;C=y;L=xl(D|0,L|0,I|0,E|0)|0;D=y;G=xl(0,L|0,F|0,G|0)|0;F=y;K=Dl(k|0,0,w|0,0)|0;J=y;w=Dl(j|0,0,w|0,0)|0;h=y;z=Dl(k|0,0,g|0,0)|0;x=y;g=Dl(j|0,0,g|0,0)|0;A=y;h=xl(w|0,h|0,z|0,x|0)|0;w=y;A=xl(w|0,(w>>>0<x>>>0|(w|0)==(x|0)&h>>>0<z>>>0)&1|0,g|0,A|0)|0;g=y;J=xl(0,h|0,K|0,J|0)|0;K=y;h=xl(A|0,g|0,(K>>>0<h>>>0|(K|0)==(h|0)&J>>>0<0)&1|0,0)|0;g=y;C=xl(J|0,K|0,B|0,C|0)|0;I=xl(C|0,y|0,D|0,(D>>>0<E>>>0|(D|0)==(E|0)&L>>>0<I>>>0)&1|0)|0;G=xl(I|0,y|0,(F>>>0<L>>>0|(F|0)==(L|0)&G>>>0<0)&1|0,0)|0;L=y;J=xl(h|0,g|0,(L>>>0<K>>>0|(L|0)==(K|0)&G>>>0<J>>>0)&1|0,0)|0;K=y;g=(K|0)>0|(K|0)==0&J>>>0>0;h=Jl(J|0,K|0,1)|0;F=y;I=Il(G|0,L|0,63)|0;K=g?F|y:K;L=Jl(G|0,L|0,g&1|0)|0;oi(f,80,u,r+((H^1)&1)+m+(g?-16383:-16382)|0,g?h|I:J,K,L,y,i);l=M;return}g=Jl(q|0,p|0,49)|0;I=y;F=Il(q|0,p|0,15)|0;H=y&65535;G=Jl(t&65535|0,0,63)|0;j=y;J=Jl(r|0,0,48)|0;J=xl(F|G|0,H|j|0,J|0,y|0)|0;j=v;c[j>>2]=g;c[j+4>>2]=I;j=v+8|0;c[j>>2]=J;c[j+4>>2]=y;c[A>>2]=c[v>>2];c[A+4>>2]=c[v+4>>2];c[A+8>>2]=c[v+8>>2];c[A+12>>2]=c[v+12>>2];c[E>>2]=c[v>>2];c[E+4>>2]=c[v+4>>2];c[E+8>>2]=c[v+8>>2];c[E+12>>2]=c[v+12>>2];j=E+8|0;j=Il(c[j>>2]|0,c[j+4>>2]|0,63)|0;j=j&255;if(!(j<<24>>24)){c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3644];c[L+4>>2]=c[3645];c[L+8>>2]=c[3646];c[L+12>>2]=c[3647];vi(w,K,L,0,i)}else{c[K>>2]=c[E>>2];c[K+4>>2]=c[E+4>>2];c[K+8>>2]=c[E+8>>2];c[K+12>>2]=c[E+12>>2];c[L>>2]=c[3644];c[L+4>>2]=c[3645];c[L+8>>2]=c[3646];c[L+12>>2]=c[3647];wi(w,K,L,j,i)};c[K>>2]=c[A>>2];c[K+4>>2]=c[A+4>>2];c[K+8>>2]=c[A+8>>2];c[K+12>>2]=c[A+12>>2];c[L>>2]=c[w>>2];c[L+4>>2]=c[w+4>>2];c[L+8>>2]=c[w+8>>2];c[L+12>>2]=c[w+12>>2];Ai(x,K,L,i);c[L>>2]=c[x>>2];c[L+4>>2]=c[x+4>>2];c[L+8>>2]=c[x+8>>2];c[L+12>>2]=c[x+12>>2];Hi(E,L,11504,9,i);c[K>>2]=c[x>>2];c[K+4>>2]=c[x+4>>2];c[K+8>>2]=c[x+8>>2];c[K+12>>2]=c[x+12>>2];c[L>>2]=c[E>>2];c[L+4>>2]=c[E+4>>2];c[L+8>>2]=c[E+8>>2];c[L+12>>2]=c[E+12>>2];zi(z,K,L,i);c[K>>2]=c[z>>2];c[K+4>>2]=c[z+4>>2];c[K+8>>2]=c[z+8>>2];c[K+12>>2]=c[z+12>>2];c[L>>2]=c[3640];c[L+4>>2]=c[3641];c[L+8>>2]=c[3642];c[L+12>>2]=c[3643];zi(v,K,L,i);c[K>>2]=c[h>>2];c[K+4>>2]=c[h+4>>2];c[K+8>>2]=c[h+8>>2];c[K+12>>2]=c[h+12>>2];c[L>>2]=c[v>>2];c[L+4>>2]=c[v+4>>2];c[L+8>>2]=c[v+8>>2];c[L+12>>2]=c[v+12>>2];Bi(f,K,L,i);l=M;return}while(0);i=i+2|0;a[i>>0]=a[i>>0]|1;c[f>>2]=c[3596];c[f+4>>2]=c[3597];c[f+8>>2]=c[3598];c[f+12>>2]=c[3599];l=M;return}function Ti(d,e,f,g,h){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=Tj(20)|0;j=i+4|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[j+12>>2]=0;c[i>>2]=g;a[i+16>>0]=0;He(d,e,0,1,0,i,28,26,2)|0;He(d,e+1|0,0,7,0,i,29,27,1)|0;if(f|0)He(d,f,0,1,0,i,30,28,1)|0;e=i+8|0;d=c[h>>2]|0;if(d|0){j=Tj(65608)|0;Nl(j+8|0,0,65600)|0;c[j>>2]=i;c[j+4>>2]=d;d=Wa[c[d>>2]&15](d)|0;f=y;g=Fl(d|0,f|0,1008,0)|0;g=g>>>0>2?g:2;c[j+8>>2]=g>>>0<16383?g:16383;c[j+12>>2]=16;c[j+16>>2]=63;g=j+24|0;c[g>>2]=d;c[g+4>>2]=f;c[j+20>>2]=128;g=j+32|0;c[g>>2]=0;b[g+4>>1]=0;a[g+6>>0]=0;a[j+39>>0]=-96;a[j+40>>0]=80;c[j+56>>2]=0;c[j+60>>2]=0;c[j+52>>2]=10;c[j+48>>2]=0;c[j+44>>2]=0;c[e>>2]=j}d=c[h+4>>2]|0;if(!d){h=c[e>>2]|0;j=i+4|0;c[j>>2]=h;return i|0}h=Tj(65608)|0;Nl(h+8|0,0,65600)|0;c[h>>2]=i;c[h+4>>2]=d;f=Wa[c[d>>2]&15](d)|0;g=y;j=Fl(f|0,g|0,1008,0)|0;j=j>>>0>2?j:2;c[h+8>>2]=j>>>0<16383?j:16383;c[h+12>>2]=16;c[h+16>>2]=63;j=h+24|0;c[j>>2]=f;c[j+4>>2]=g;c[h+20>>2]=128;j=h+32|0;c[j>>2]=0;b[j+4>>1]=0;a[j+6>>0]=0;a[h+39>>0]=-96;a[h+40>>0]=80;c[h+56>>2]=0;c[h+60>>2]=0;c[h+52>>2]=10;c[h+48>>2]=0;c[h+44>>2]=0;c[i+12>>2]=h;h=c[e>>2]|0;j=i+4|0;c[j>>2]=h;return i|0}function Ui(a,b,e){a=a|0;b=b|0;e=e|0;var f=0;b=c[a+4>>2]|0;if(!b){e=0;return e|0}f=b+56|0;e=c[f>>2]|0;a=(d[e+1+(b+64)>>0]|0)<<8|(d[b+64+e>>0]|0);e=e+2|0;c[f>>2]=e;if((e|0)<(c[b+60>>2]|0)){f=a;return f|0}db[c[b+52>>2]&15](b);f=a;return f|0}function Vi(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;b=c[b+4>>2]|0;if(!b)return;f=b+56|0;d=c[f>>2]|0;a[b+64+d>>0]=e;a[d+1+(b+64)>>0]=e>>>8;e=d+2|0;c[f>>2]=e;if((e|0)<(c[b+60>>2]|0))return;db[c[b+52>>2]&15](b);return}function Wi(a,b,f){a=a|0;b=b|0;f=f|0;f=c[a+4>>2]|0;if(!f){b=0;return b|0}switch(b|0){case 0:{b=d[f+33>>0]|0;return b|0}case 1:{b=e[f+34>>1]|0;return b|0}case 2:{b=d[f+36>>0]|0;return b|0}case 3:{b=d[f+37>>0]|0;return b|0}case 4:{b=d[f+38>>0]|0;return b|0}case 5:{b=d[f+39>>0]|0;return b|0}case -1:{b=255;return b|0}default:{b=d[f+40>>0]|0;a=c[a>>2]|0;fb[c[a>>2]&15](c[a+4>>2]|0,c[a+8>>2]|0,0);return b|0}}return 0}function Xi(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;h=d+4|0;k=c[h>>2]|0;switch(e|0){case 0:{if(!k)return;a[k+32>>0]=f;return}case 1:{if(!k)return;b[k+34>>1]=f;return}case 2:{if(!k)return;a[k+36>>0]=f;return}case 3:{if(!k)return;a[k+37>>0]=f;return}case 4:{if(!k)return;a[k+38>>0]=f;return}case 5:{g=c[d+8+((f>>>4&1)<<2)>>2]|0;c[h>>2]=g;if(!g)return;a[g+39>>0]=f;return}case -1:return;default:{if(!k)return;switch(f|0){case 236:{Nl(k+68|0,0,1020)|0;b[k+64>>1]=64;h=k+8|0;b[k+66>>1]=c[h>>2];f=k+12|0;b[k+70>>1]=c[f>>2];i=k+16|0;g=c[i>>2]|0;b[k+72>>1]=g<<9;b[k+74>>1]=512;b[k+76>>1]=g;b[k+104>>1]=3;b[k+106>>1]=512;b[k+108>>1]=4;g=0;d=k+118|0;e=19967;while(1){l=a[e>>0]|0;j=l<<24>>24==0;a[(d^1)>>0]=j?32:l;g=g+1|0;if((g|0)==40)break;else{d=d+1|0;e=j?e:e+1|0}}b[k+158>>1]=-32640;b[k+160>>1]=0;b[k+162>>1]=512;b[k+166>>1]=512;b[k+168>>1]=512;l=c[h>>2]|0;b[k+172>>1]=l;j=c[f>>2]|0;b[k+174>>1]=j;g=c[i>>2]|0;b[k+176>>1]=g;g=N(N(j,l)|0,g)|0;b[k+178>>1]=g;b[k+180>>1]=g>>>16;g=c[k+20>>2]|0;if(g|0)b[k+182>>1]=g|256;g=k+24|0;l=c[g>>2]|0;g=c[g+4>>2]|0;b[k+184>>1]=l;g=Il(l|0,g|0,16)|0;b[k+186>>1]=g;b[k+224>>1]=6;b[k+228>>1]=16384;b[k+230>>1]=16384;b[k+232>>1]=16384;b[k+234>>1]=16384;b[k+236>>1]=0;b[k+238>>1]=16384;a[k+40>>0]=88;c[k+52>>2]=11;c[k+56>>2]=0;c[k+60>>2]=512;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 16:case 145:{a[k+33>>0]=0;a[k+40>>0]=80;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 198:{l=b[k+34>>1]|0;g=l&65535;if((l&65535)<=128?(g+65535&g|0)==0:0){c[k+20>>2]=g;a[k+40>>0]=64}else{a[k+40>>0]=65;a[k+33>>0]=4}g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 33:case 32:{c[k+48>>2]=1;aj(k);return}case 49:case 48:{c[k+48>>2]=1;c[k+44>>2]=1;c[k+52>>2]=12;c[k+56>>2]=0;c[k+60>>2]=512;a[k+40>>0]=88;return}case 196:{g=c[k+20>>2]|0;if(g|0){c[k+48>>2]=g;aj(k);return}a[k+40>>0]=65;a[k+33>>0]=4;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 197:{g=c[k+20>>2]|0;if(g|0){c[k+48>>2]=g;l=b[k+34>>1]|0;l=l<<16>>16==0?256:l&65535;l=(l|0)>(g|0)?g:l;c[k+44>>2]=l;c[k+52>>2]=12;c[k+56>>2]=0;c[k+60>>2]=l<<9;a[k+40>>0]=88;return}a[k+40>>0]=65;a[k+33>>0]=4;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}case 248:{f=k+24|0;f=xl(c[f>>2]|0,c[f+4>>2]|0,-1,-1)|0;g=y;d=k+39|0;e=a[d>>0]|0;h=e&255;if(!(h&64)){j=c[k+16>>2]|0;h=N(j,c[k+12>>2]|0)|0;i=((h|0)<0)<<31>>31;l=Bl(f|0,g|0,h|0,i|0)|0;i=Dl(l|0,y|0,h|0,i|0)|0;i=yl(f|0,g|0,i|0,y|0)|0;g=(i>>>0)/(j>>>0)|0;a[d>>0]=g&15|e&-16&255;e=l&255;g=i-(N(g,j)|0)+1&255;d=l>>>8&255}else{e=Il(f|0,g|0,24)|0;a[d>>0]=e&15|h&240;d=Il(f|0,g|0,16)|0;e=Il(f|0,g|0,8)|0;e=e&255;g=f&255;d=d&255}a[k+38>>0]=d;a[k+37>>0]=e;a[k+36>>0]=g;a[k+40>>0]=64;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}default:{a[k+40>>0]=65;a[k+33>>0]=4;g=c[k>>2]|0;if(a[g+16>>0]&2)return;l=c[g>>2]|0;fb[c[l>>2]&15](c[l+4>>2]|0,c[l+8>>2]|0,1);return}}}}}function Yi(a,b,e){a=a|0;b=b|0;e=e|0;a=c[a+4>>2]|0;if(!a){e=0;return e|0}e=d[a+40>>0]|0;return e|0}function Zi(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=d+16|0;e=(a[h>>0]&4)!=0;g=(f&4|0)==0;if(!(g|e)){e=c[d+8>>2]|0;if(e|0){a[e+40>>0]=-112;a[e+33>>0]=1}e=c[d+12>>2]|0;if(!e){f=f&255;a[h>>0]=f;return}a[e+40>>0]=-112;a[e+33>>0]=1;f=f&255;a[h>>0]=f;return}if(!(g&e)){f=f&255;a[h>>0]=f;return}e=c[d+8>>2]|0;if(e|0){a[e+40>>0]=80;g=e+39|0;a[g>>0]=a[g>>0]&-16;b[e+34>>1]=1;a[e+36>>0]=1;a[e+37>>0]=0;a[e+38>>0]=0}e=c[d+12>>2]|0;if(!e){f=f&255;a[h>>0]=f;return}a[e+40>>0]=80;d=e+39|0;a[d>>0]=a[d>>0]&-16;b[e+34>>1]=1;a[e+36>>0]=1;a[e+37>>0]=0;a[e+38>>0]=0;f=f&255;a[h>>0]=f;return}function _i(a){a=a|0;c[a+52>>2]=10;c[a+56>>2]=0;c[a+60>>2]=0;return}function $i(b){b=b|0;c[b+52>>2]=10;c[b+56>>2]=0;c[b+60>>2]=0;a[b+40>>0]=64;return}function aj(e){e=e|0;var f=0,g=0,h=0;f=d[e+39>>0]|0;if(!(f&64)){g=N((d[e+38>>0]|0)<<8|(d[e+37>>0]|0),c[e+12>>2]|0)|0;f=N(g+(f&15)|0,c[e+16>>2]|0)|0;f=(d[e+36>>0]|0)+-1+f|0}else f=(d[e+38>>0]|0)<<16|f<<24&251658240|(d[e+37>>0]|0)<<8|(d[e+36>>0]|0);g=b[e+34>>1]|0;g=g<<16>>16==0?256:g&65535;h=c[e+48>>2]|0;g=(g|0)>(h|0)?h:g;c[e+44>>2]=g;h=c[e+4>>2]|0;f=ab[c[h+4>>2]&3](h,f,((f|0)<0)<<31>>31,e+64|0,g,9,e)|0;if((f|0)<0){a[e+40>>0]=65;a[e+33>>0]=4;f=c[e>>2]|0;if(a[f+16>>0]&2)return;h=c[f>>2]|0;fb[c[h>>2]&15](c[h+4>>2]|0,c[h+8>>2]|0,1);return}if(!f){dj(e,0);return}else{a[e+40>>0]=-48;a[e+33>>0]=0;return}}function bj(b){b=b|0;var e=0,f=0;c[b+52>>2]=10;c[b+56>>2]=0;c[b+60>>2]=0;e=d[b+39>>0]|0;if(!(e&64)){f=N((d[b+38>>0]|0)<<8|(d[b+37>>0]|0),c[b+12>>2]|0)|0;e=N(f+(e&15)|0,c[b+16>>2]|0)|0;e=(d[b+36>>0]|0)+-1+e|0}else e=(d[b+38>>0]|0)<<16|e<<24&251658240|(d[b+37>>0]|0)<<8|(d[b+36>>0]|0);f=c[b+4>>2]|0;e=ab[c[f+8>>2]&3](f,e,((e|0)<0)<<31>>31,b+64|0,c[b+44>>2]|0,10,b)|0;if((e|0)<0){a[b+40>>0]=65;a[b+33>>0]=4;e=c[b>>2]|0;if(a[e+16>>0]&2)return;f=c[e>>2]|0;fb[c[f>>2]&15](c[f+4>>2]|0,c[f+8>>2]|0,1);return}if(!e){cj(b,0);return}else{a[b+40>>0]=-48;return}}function cj(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;n=f+44|0;m=c[n>>2]|0;g=f+39|0;h=a[g>>0]|0;i=h&255;if(!(i&64)){j=f+38|0;q=f+37|0;s=c[f+12>>2]|0;r=N((d[j>>0]|0)<<8|(d[q>>0]|0),s)|0;k=c[f+16>>2]|0;r=N(r+(i&15)|0,k)|0;i=f+36|0;r=(d[i>>0]|0)+-1+r|0;r=xl(r|0,((r|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;o=y;s=N(k,s)|0;p=((s|0)<0)<<31>>31;l=Bl(r|0,o|0,s|0,p|0)|0;p=Dl(l|0,y|0,s|0,p|0)|0;p=yl(r|0,o|0,p|0,y|0)|0;o=(p>>>0)/(k>>>0)|0;a[g>>0]=o&15|h&-16&255;g=q;h=i;i=j;j=l&255;k=p-(N(o,k)|0)+1&255;l=l>>>8&255}else{s=f+38|0;r=f+37|0;h=f+36|0;k=xl((d[s>>0]|0)<<16|i<<24&251658240|(d[r>>0]|0)<<8|(d[h>>0]|0)|0,0,m|0,((m|0)<0)<<31>>31|0)|0;j=y;l=Il(k|0,j|0,24)|0;a[g>>0]=l&15|i&240;l=Il(k|0,j|0,16)|0;j=Il(k|0,j|0,8)|0;g=r;i=s;j=j&255;k=k&255;l=l&255}a[i>>0]=l;a[g>>0]=j;a[h>>0]=k;s=f+34|0;g=(e[s>>1]|0)-m&255;b[s>>1]=g;if(!g)g=80;else{s=c[f+48>>2]|0;g=(g|0)>(s|0)?s:g;c[n>>2]=g;c[f+52>>2]=12;c[f+56>>2]=0;c[f+60>>2]=g<<9;g=88}a[f+40>>0]=g;g=c[f>>2]|0;if(a[g+16>>0]&2)return;s=c[g>>2]|0;fb[c[s>>2]&15](c[s+4>>2]|0,c[s+8>>2]|0,1);return}function dj(f,g){f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;m=c[f+44>>2]|0;g=f+39|0;h=a[g>>0]|0;i=h&255;if(!(i&64)){j=f+38|0;p=f+37|0;r=c[f+12>>2]|0;q=N((d[j>>0]|0)<<8|(d[p>>0]|0),r)|0;k=c[f+16>>2]|0;q=N(q+(i&15)|0,k)|0;i=f+36|0;q=(d[i>>0]|0)+-1+q|0;q=xl(q|0,((q|0)<0)<<31>>31|0,m|0,((m|0)<0)<<31>>31|0)|0;n=y;r=N(k,r)|0;o=((r|0)<0)<<31>>31;l=Bl(q|0,n|0,r|0,o|0)|0;o=Dl(l|0,y|0,r|0,o|0)|0;o=yl(q|0,n|0,o|0,y|0)|0;n=(o>>>0)/(k>>>0)|0;a[g>>0]=n&15|h&-16&255;g=p;h=i;i=j;j=l&255;k=o-(N(n,k)|0)+1&255;l=l>>>8&255}else{r=f+38|0;q=f+37|0;h=f+36|0;k=xl((d[r>>0]|0)<<16|i<<24&251658240|(d[q>>0]|0)<<8|(d[h>>0]|0)|0,0,m|0,((m|0)<0)<<31>>31|0)|0;j=y;l=Il(k|0,j|0,24)|0;a[g>>0]=l&15|i&240;l=Il(k|0,j|0,16)|0;j=Il(k|0,j|0,8)|0;g=q;i=r;j=j&255;k=k&255;l=l&255}a[i>>0]=l;a[g>>0]=j;a[h>>0]=k;r=f+34|0;g=(e[r>>1]|0)-m&255;b[r>>1]=g;c[f+52>>2]=(g|0)==0?14:13;c[f+56>>2]=0;c[f+60>>2]=m<<9;g=c[f>>2]|0;if(a[g+16>>0]&2){r=f+40|0;a[r>>0]=88;r=f+33|0;a[r>>0]=0;return}r=c[g>>2]|0;fb[c[r>>2]&15](c[r+4>>2]|0,c[r+8>>2]|0,1);r=f+40|0;a[r>>0]=88;r=f+33|0;a[r>>0]=0;return}function ej(b){b=b|0;a[b+40>>0]=80;a[b+33>>0]=0;c[b+52>>2]=10;c[b+56>>2]=0;c[b+60>>2]=0;return}function fj(a,b){a=a|0;b=b|0;b=Qd(a,19985,b,-32634,28688,0,257)|0;Xd(b,9,0);return b|0}function gj(b,d){b=b|0;d=d|0;var e=0,f=0;e=b+264|0;if((c[e>>2]|0)>255)return;f=b+260|0;a[b+(c[f>>2]|0)>>0]=d;d=(c[f>>2]|0)+1|0;c[f>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}function hj(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0;do if((f|0)>95){if((f|0)>127)return;f=f+-96|0;if(536805416>>>f&1|0)return;g=b+264|0;if((c[g>>2]|0)>255)return;else{f=d[11648+f>>0]|0;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-32;i=(c[h>>2]|0)+1|0;c[h>>2]=(i|0)==256?0:i;c[g>>2]=(c[g>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);break}}else g=b+264|0;while(0);if((c[g>>2]|0)>255)return;i=b+260|0;a[b+(c[i>>2]|0)>>0]=f|((e|0)==0&1)<<7;h=(c[i>>2]|0)+1|0;c[i>>2]=(h|0)==256?0:h;c[g>>2]=(c[g>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}function ij(a){a=a|0;var b=0,e=0,f=0,g=0,h=0;b=a+264|0;e=c[b>>2]|0;f=a+256|0;g=c[f>>2]|0;if(!e){g=d[a+((g|0)<1?255:g+-1|0)>>0]|0;return g|0}else{h=d[a+g>>0]|0;g=g+1|0;c[f>>2]=(g|0)==256?0:g;c[b>>2]=e+-1;f=a+272|0;g=a+276|0;eb[c[f>>2]&15](c[g>>2]|0,0);eb[c[f>>2]&15](c[g>>2]|0,(c[b>>2]|0)!=0&1);g=h;return g|0}return 0}function jj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=b+268|0;switch(c[e>>2]|0){case 243:{d=b+264|0;if((c[d>>2]|0)<=255){g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[e>>2]=-1;return}case 237:{d=b+264|0;if((c[d>>2]|0)<=255){g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[e>>2]=-1;return}default:do switch(d|0){case 0:{d=b+264|0;if((c[d>>2]|0)>255)return;g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 5:{d=b+264|0;if((c[d>>2]|0)>255)return;g=b+260|0;a[b+(c[g>>2]|0)>>0]=-2;f=(c[g>>2]|0)+1|0;c[g>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 242:{d=b+264|0;if((c[d>>2]|0)>255)return;e=b+260|0;a[b+(c[e>>2]|0)>>0]=-6;f=(c[e>>2]|0)+1|0;c[e>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;f=b+272|0;g=b+276|0;eb[c[f>>2]&15](c[g>>2]|0,1);if((c[d>>2]|0)>255)return;a[b+(c[e>>2]|0)>>0]=-85;h=(c[e>>2]|0)+1|0;c[e>>2]=(h|0)==256?0:h;c[d>>2]=(c[d>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1);if((c[d>>2]|0)>255)return;a[b+(c[e>>2]|0)>>0]=-125;h=(c[e>>2]|0)+1|0;c[e>>2]=(h|0)==256?0:h;c[d>>2]=(c[d>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1);return}case 238:{d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-18;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 244:{c[b+280>>2]=1;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 243:case 237:{c[e>>2]=d;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 245:{c[b+280>>2]=0;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 246:{c[b+280>>2]=1;d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 255:{c[b+280>>2]=1;d=b+264|0;if((c[d>>2]|0)>255)return;e=b+260|0;a[b+(c[e>>2]|0)>>0]=-6;f=(c[e>>2]|0)+1|0;c[e>>2]=(f|0)==256?0:f;c[d>>2]=(c[d>>2]|0)+1;f=b+272|0;g=b+276|0;eb[c[f>>2]&15](c[g>>2]|0,1);if((c[d>>2]|0)>255)return;a[b+(c[e>>2]|0)>>0]=-86;h=(c[e>>2]|0)+1|0;c[e>>2]=(h|0)==256?0:h;c[d>>2]=(c[d>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1);return}default:{d=b+264|0;if((c[d>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;g=(c[h>>2]|0)+1|0;c[h>>2]=(g|0)==256?0:g;c[d>>2]=(c[d>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}}while(0)}}function kj(a,b){a=a|0;b=b|0;c[a+284>>2]=b;return}function lj(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;j=a[b+280>>0]|0;if(!(j&32))return;k=b+288|0;m=(c[k>>2]|0)+e|0;c[k>>2]=m;i=b+292|0;l=(c[i>>2]|0)-f|0;c[i>>2]=l;f=b+296|0;g=(c[f>>2]|0)+g|0;c[f>>2]=g;e=b+300|0;if((m|(g|l)|0)==0?(d[e>>0]|0|0)==(h|0):0)return;a[e>>0]=h;if(j&64)return;if((c[b+264>>2]|0)>=240)return;do mj(b);while(!(((c[k>>2]|0)==0?(c[i>>2]|0)==0:0)?(c[f>>2]|0)==0:0));return}function mj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;l=b+288|0;k=c[l>>2]|0;m=b+292|0;j=c[m>>2]|0;n=b+296|0;d=c[n>>2]|0;k=(k|0)>-127?k:-127;k=(k|0)<127?k:127;j=(j|0)>-127?j:-127;j=(j|0)<127?j:127;h=b+300|0;i=b+264|0;if(((c[i>>2]|0)<=255?(e=b+260|0,a[b+(c[e>>2]|0)>>0]=k>>>31<<4|j>>>31<<5|a[h>>0]&7|8,f=(c[e>>2]|0)+1|0,c[e>>2]=(f|0)==256?0:f,c[i>>2]=(c[i>>2]|0)+1,f=b+272|0,g=b+276|0,eb[c[f>>2]&15](c[g>>2]|0,1),(c[i>>2]|0)<=255):0)?(a[b+(c[e>>2]|0)>>0]=k,o=(c[e>>2]|0)+1|0,c[e>>2]=(o|0)==256?0:o,c[i>>2]=(c[i>>2]|0)+1,eb[c[f>>2]&15](c[g>>2]|0,1),(c[i>>2]|0)<=255):0){a[b+(c[e>>2]|0)>>0]=j;o=(c[e>>2]|0)+1|0;c[e>>2]=(o|0)==256?0:o;c[i>>2]=(c[i>>2]|0)+1;eb[c[f>>2]&15](c[g>>2]|0,1)}switch(a[b+284>>0]|0){case 3:{d=(d|0)>-127?d:-127;d=(d|0)<127?d:127;if((c[i>>2]|0)<=255){o=b+260|0;a[b+(c[o>>2]|0)>>0]=d;h=(c[o>>2]|0)+1|0;c[o>>2]=(h|0)==256?0:h;c[i>>2]=(c[i>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}break}case 4:{d=(d|0)>-7?d:-7;d=(d|0)<7?d:7;if((c[i>>2]|0)<=255){o=b+260|0;a[b+(c[o>>2]|0)>>0]=d&15|a[h>>0]<<1&48;h=(c[o>>2]|0)+1|0;c[o>>2]=(h|0)==256?0:h;c[i>>2]=(c[i>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}break}default:{}}c[l>>2]=(c[l>>2]|0)-k;c[m>>2]=(c[m>>2]|0)-j;c[n>>2]=(c[n>>2]|0)-d;return}function nj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=b+268|0;switch(c[h>>2]|0){case 232:{a[b+281>>0]=d;e=b+264|0;if((c[e>>2]|0)<=255){d=b+260|0;a[b+(c[d>>2]|0)>>0]=-6;g=(c[d>>2]|0)+1|0;c[d>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[h>>2]=-1;return}case 243:{a[b+282>>0]=d;f=b+285|0;switch(a[f>>0]|0){case 3:{if((d|0)==80){a[b+284>>0]=4;e=0;g=49}else{e=0;g=49}break}case 1:{e=(d|0)==100?2:(d|0)==200?3:0;g=49;break}case 2:{if((d|0)==80){a[b+284>>0]=3;e=0;g=49}else{e=0;g=49}break}default:if((d|0)==200){e=1;g=49}}if((g|0)==49)a[f>>0]=e;e=b+264|0;if((c[e>>2]|0)<=255){d=b+260|0;a[b+(c[d>>2]|0)>>0]=-6;g=(c[d>>2]|0)+1|0;c[d>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}c[h>>2]=-1;return}default:{e=b+283|0;a:do if(!(a[e>>0]|0))do switch(d|0){case 255:break a;case 230:{e=b+280|0;a[e>>0]=a[e>>0]&-17;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 231:{e=b+280|0;a[e>>0]=a[e>>0]|16;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 234:{e=b+280|0;a[e>>0]=a[e>>0]&-65;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 238:{a[e>>0]=1;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 240:{e=b+280|0;a[e>>0]=a[e>>0]|64;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 242:{e=b+264|0;if((c[e>>2]|0)>255)return;f=b+260|0;a[b+(c[f>>2]|0)>>0]=-6;g=(c[f>>2]|0)+1|0;c[f>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;g=b+272|0;d=b+276|0;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+284>>0]|0;b=(c[f>>2]|0)+1|0;c[f>>2]=(b|0)==256?0:b;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);return}case 243:case 232:{c[h>>2]=d;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 233:{e=b+264|0;if((c[e>>2]|0)>255)return;f=b+260|0;a[b+(c[f>>2]|0)>>0]=-6;g=(c[f>>2]|0)+1|0;c[f>>2]=(g|0)==256?0:g;c[e>>2]=(c[e>>2]|0)+1;g=b+272|0;d=b+276|0;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+280>>0]|0;h=(c[f>>2]|0)+1|0;c[f>>2]=(h|0)==256?0:h;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+281>>0]|0;h=(c[f>>2]|0)+1|0;c[f>>2]=(h|0)==256?0:h;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);if((c[e>>2]|0)>255)return;a[b+(c[f>>2]|0)>>0]=a[b+282>>0]|0;b=(c[f>>2]|0)+1|0;c[f>>2]=(b|0)==256?0:b;c[e>>2]=(c[e>>2]|0)+1;eb[c[g>>2]&15](c[d>>2]|0,1);return}case 235:{e=b+264|0;if((c[e>>2]|0)<=255){h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1)}mj(b);return}case 244:{e=b+280|0;a[e>>0]=a[e>>0]|32;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 245:{e=b+280|0;a[e>>0]=a[e>>0]&-33;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}case 246:{a[b+282>>0]=100;a[b+281>>0]=2;a[b+280>>0]=0;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}default:return}while(0);else switch(d|0){case 255:break a;case 236:{a[e>>0]=0;e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=-6;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}default:{e=b+264|0;if((c[e>>2]|0)>255)return;h=b+260|0;a[b+(c[h>>2]|0)>>0]=d;d=(c[h>>2]|0)+1|0;c[h>>2]=(d|0)==256?0:d;c[e>>2]=(c[e>>2]|0)+1;eb[c[b+272>>2]&15](c[b+276>>2]|0,1);return}}while(0);a[b+282>>0]=100;a[b+281>>0]=2;a[b+280>>0]=0;e=b+284|0;a[e>>0]=0;f=b+264|0;if((c[f>>2]|0)>255)return;g=b+260|0;a[b+(c[g>>2]|0)>>0]=-6;d=(c[g>>2]|0)+1|0;c[g>>2]=(d|0)==256?0:d;c[f>>2]=(c[f>>2]|0)+1;d=b+272|0;h=b+276|0;eb[c[d>>2]&15](c[h>>2]|0,1);if((c[f>>2]|0)>255)return;a[b+(c[g>>2]|0)>>0]=-86;i=(c[g>>2]|0)+1|0;c[g>>2]=(i|0)==256?0:i;c[f>>2]=(c[f>>2]|0)+1;eb[c[d>>2]&15](c[h>>2]|0,1);if((c[f>>2]|0)>255)return;a[b+(c[g>>2]|0)>>0]=a[e>>0]|0;i=(c[g>>2]|0)+1|0;c[g>>2]=(i|0)==256?0:i;c[f>>2]=(c[f>>2]|0)+1;eb[c[d>>2]&15](c[h>>2]|0,1);return}}}function oj(a,b){a=a|0;b=b|0;var d=0;d=Le(288)|0;c[d+272>>2]=a;c[d+276>>2]=b;c[d+268>>2]=-1;c[d+256>>2]=0;c[d+260>>2]=0;c[d+264>>2]=0;return d|0}function pj(a,b){a=a|0;b=b|0;var d=0;d=Le(304)|0;c[d+272>>2]=a;c[d+276>>2]=b;c[d+268>>2]=-1;c[d+256>>2]=0;c[d+260>>2]=0;c[d+264>>2]=0;return d|0}function qj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;if(!(c[a+16>>2]|0)){lj(c[a>>2]|0,b,d,e,f);return}j=a+4|0;if((c[j>>2]|0)>60)return;i=(c[a+20>>2]|0)!=0&1;g=d<<i;h=a+12|0;c[a+24+(c[h>>2]<<2)>>2]=f<<3&16|f<<5&32|f<<1&8;d=(c[h>>2]|0)+1|0;d=(d|0)==64?0:d;c[h>>2]=d;f=c[j>>2]|0;c[j>>2]=f+1;if(((f|0)<=62?(c[a+24+(d<<2)>>2]=b<<i,l=(c[h>>2]|0)+1|0,l=(l|0)==64?0:l,c[h>>2]=l,i=c[j>>2]|0,c[j>>2]=i+1,(i|0)<=62):0)?(c[a+24+(l<<2)>>2]=g,k=(c[h>>2]|0)+1|0,k=(k|0)==64?0:k,c[h>>2]=k,l=c[j>>2]|0,c[j>>2]=l+1,(l|0)<=62):0){c[a+24+(k<<2)>>2]=0-e;l=(c[h>>2]|0)+1|0;c[h>>2]=(l|0)==64?0:l;c[j>>2]=(c[j>>2]|0)+1}lj(c[a>>2]|0,1,0,0,0);return}function rj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;switch((c[b+8>>2]&255)<<24>>24){case 10:{c[b+4>>2]=1447909480;return}case 39:{g=c[b+4>>2]|0;if((g|0)<=6?(h=a+4|0,d=c[h>>2]|0,(d|0)>=(g|0)):0){if((g|0)>0){e=a+8|0;d=0;f=c[e>>2]|0;do{c[b+(d<<2)>>2]=c[a+24+(f<<2)>>2];i=(c[e>>2]|0)+1|0;f=(i|0)==64?0:i;c[e>>2]=f;d=d+1|0}while((d|0)!=(g|0));d=c[h>>2]|0}c[h>>2]=d-g;return}c[a+16>>2]=0;return}case 40:{c[b>>2]=((c[a+16>>2]|0)==0?-65536:0)|c[a+4>>2];return}case 41:{d=c[b+4>>2]|0;if((d|0)>=1279611474)if((d|0)<1396851026){switch(d|0){case 1279611474:break;default:return}c[a+20>>2]=0;return}else{switch(d|0){case 1396851026:break;default:return}c[a+20>>2]=1;return}if((d|0)<1161905490){switch(d|0){case 245:break;default:return}c[a+16>>2]=0;return}switch(d|0){case 1161905490:break;default:return}d=a+4|0;if((c[d>>2]|0)>=64)return;i=a+12|0;c[a+24+(c[i>>2]<<2)>>2]=876762442;h=(c[i>>2]|0)+1|0;c[i>>2]=(h|0)==64?0:h;c[d>>2]=(c[d>>2]|0)+1;c[a+16>>2]=1;return}default:return}}function sj(a){a=a|0;return c[a+20>>2]|0}function tj(a){a=a|0;var b=0;b=Le(280)|0;c[b>>2]=a;return b|0}function uj(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=Le(20)|0;c[i+12>>2]=f;c[i+16>>2]=g;a[i+2>>0]=3;a[i+1>>0]=24;He(e,h,0,1,0,i,31,29,1)|0;He(e,h+4|0,0,1,0,i,32,30,1)|0;g=i+4|0;c[g>>2]=oj(11,i)|0;h=i+8|0;c[h>>2]=pj(12,i)|0;c[b>>2]=c[g>>2];c[d>>2]=c[h>>2];return i|0}function vj(b,d,e){b=b|0;d=d|0;e=e|0;return ij(c[b+((a[b+3>>0]|0)==2?8:4)>>2]|0)|0}function wj(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;switch(a[b>>0]|0){case 0:{jj(c[b+4>>2]|0,f);a[b>>0]=0;return}case 96:{i=b+2|0;a[i>>0]=f;kj(c[b+4>>2]|0,f>>>6&1);e=b+1|0;g=a[e>>0]|0;f=g&-34;a[e>>0]=f;h=a[b+3>>0]|0;do if(h<<24>>24){a[e>>0]=f|1;if(h<<24>>24==2){a[e>>0]=g|33;g=(d[i>>0]|0)>>>1&1;e=0;break}else{g=0;e=(a[i>>0]&17)==1&1;break}}else{g=0;e=0}while(0);i=c[b+12>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,e);i=c[b+16>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,g);a[b>>0]=0;return}case -46:{gj(c[b+4>>2]|0,f);a[b>>0]=0;return}case -45:{gj(c[b+8>>2]|0,f);a[b>>0]=0;return}case -47:{if(!(f&1))Bj();else{a[b>>0]=0;return}break}case -44:{nj(c[b+8>>2]|0,f);a[b>>0]=0;return}default:{a[b>>0]=0;return}}}function xj(a,b,c){a=a|0;b=b|0;c=c|0;return d[a+1>>0]|0|0}function yj(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;j=l;l=l+16|0;e=j;do switch(f|0){case 32:{gj(c[b+8>>2]|0,d[b+2>>0]|0);l=j;return}case 209:case 212:case 211:case 210:case 96:{a[b>>0]=f;l=j;return}case 167:{b=b+2|0;a[b>>0]=a[b>>0]|32;l=j;return}case 168:{b=b+2|0;a[b>>0]=a[b>>0]&-33;l=j;return}case 169:{gj(c[b+4>>2]|0,0);l=j;return}case 170:{i=b+1|0;a[i>>0]=a[i>>0]|4;gj(c[b+4>>2]|0,85);l=j;return}case 171:{gj(c[b+4>>2]|0,0);l=j;return}case 173:{g=b+2|0;e=a[g>>0]|0;a[g>>0]=e|16;g=b+1|0;f=a[g>>0]|0;h=f&-34;a[g>>0]=h;i=a[b+3>>0]|0;if(i<<24>>24!=0?(a[g>>0]=h|1,i<<24>>24==2):0){a[g>>0]=f|33;e=(e&255)>>>1&1}else e=0;i=c[b+12>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,0);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,e);l=j;return}case 174:{e=b+2|0;i=a[e>>0]|0;a[e>>0]=i&-17;e=b+1|0;g=a[e>>0]|0;f=g&-34;a[e>>0]=f;h=a[b+3>>0]|0;do if(h<<24>>24){a[e>>0]=f|1;if(h<<24>>24==2){a[e>>0]=g|33;g=(i&255)>>>1&1;e=0;break}else{g=0;e=i&1;break}}else{g=0;e=0}while(0);i=c[b+12>>2]|0;fb[c[i>>2]&15](c[i+4>>2]|0,c[i+8>>2]|0,e);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,g);l=j;return}case 192:{gj(c[b+4>>2]|0,0);l=j;return}case 208:{i=a[b+1>>0]|0;gj(c[b+4>>2]|0,(i&32|i<<4&16|3)&255);l=j;return}case 254:{Bj();break}case 255:case 221:case 223:{l=j;return}default:{b=c[3662]|0;c[e>>2]=f;nl(b,19995,e)|0;l=j;return}}while(0)}function zj(b,e){b=b|0;e=e|0;var f=0,g=0,h=0;f=b+3|0;h=d[f>>0]|0;h=((e|0)==0?h&254:h|1)&255;a[f>>0]=h;f=b+1|0;g=a[f>>0]|0;e=g&-34;a[f>>0]=e;do if(h<<24>>24){a[f>>0]=e|1;if(h<<24>>24==2){a[f>>0]=g|33;e=(d[b+2>>0]|0)>>>1&1;f=0;break}else{e=0;f=(a[b+2>>0]&17)==1&1;break}}else{e=0;f=0}while(0);h=c[b+12>>2]|0;fb[c[h>>2]&15](c[h+4>>2]|0,c[h+8>>2]|0,f);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,e);return}function Aj(b,e){b=b|0;e=e|0;var f=0,g=0,h=0;f=b+3|0;h=d[f>>0]|0;h=((e|0)==0?h&253:h|2)&255;a[f>>0]=h;f=b+1|0;g=a[f>>0]|0;e=g&-34;a[f>>0]=e;do if(h<<24>>24){a[f>>0]=e|1;if(h<<24>>24==2){a[f>>0]=g|33;e=(d[b+2>>0]|0)>>>1&1;f=0;break}else{e=0;f=(a[b+2>>0]&17)==1&1;break}}else{e=0;f=0}while(0);h=c[b+12>>2]|0;fb[c[h>>2]&15](c[h+4>>2]|0,c[h+8>>2]|0,f);b=c[b+16>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,e);return}function Bj(){rl(20034)|0;Da(1)}function Cj(a,d,e,f,g,h){a=a|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;j=Qd(a,20055,-1,4660,4369,0,768)|0;k=Td(j)|0;l=Ud(j)|0;m=Le(17060)|0;c[m>>2]=d;c[d>>2]=e;c[d+4>>2]=f;e=e<<2;c[d+8>>2]=e;e=(N(e,f)|0)+1048575&-1048576;f=d+16|0;c[f>>2]=e;c[m+4>>2]=e>>12;e=c[f>>2]|0;i=k+2568|0;e=$a[c[i>>2]&15](k,0,0,e,((e|0)<0)<<31>>31,6)|0;c[m+8>>2]=e;c[d+12>>2]=c[e+40>>2];c[m+16>>2]=j;e=c[f>>2]|0;a=1;while(1)if(a>>>0<e>>>0)a=a<<1;else break;Vd(j,0,a,0,m,31);if((h|0)>0){e=h+4095&-4096;a=$a[c[i>>2]&15](k,0,0,e,((e|0)<0)<<31>>31,5)|0;c[m+20>>2]=a;Ll(c[a+40>>2]|0,g|0,h|0)|0;a=1;while(1)if(a>>>0<e>>>0)a=a<<1;else break;Vd(j,6,a,0,m,31)}k=$a[c[i>>2]&15](k,655360,0,131072,0,0)|0;c[m+12>>2]=k;c[m+24>>2]=c[k+40>>2];He(l,960,0,16,0,m,33,32,1)|0;He(l,948,0,2,0,m,34,33,1)|0;He(l,980,0,2,0,m,35,34,1)|0;He(l,954,0,1,0,m,36,35,1)|0;He(l,986,0,1,0,m,37,36,1)|0;He(l,462,0,2,0,m,38,37,2)|0;b[m+17038>>1]=-20283;b[m+17058>>1]=(c[f>>2]|0)>>>16;c[d+20>>2]=m;c[d+24>>2]=12;return m|0}function Dj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;if(!b){Ie(c[a+8>>2]|0,d,0,e);return}else{Ie(c[a+20>>2]|0,d,0,e);return}}function Ej(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+960|0)|0}function Fj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+960|0,c);return}function Gj(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+948|0)|0}function Hj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+948|0,c);return}function Ij(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+980|0)|0}function Jj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+980|0,c);return}function Kj(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+954|0)|0}function Lj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+954|0,c);return}function Mj(a,b,c){a=a|0;b=b|0;c=c|0;return Sj(a,b+986|0)|0}function Nj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Rj(a,b+986|0,c);return}function Oj(a,d,f){a=a|0;d=d|0;f=f|0;if(!d){a=e[a+17036>>1]|0;return a|0}f=a+17038|0;d=b[a+17036>>1]|0;a:do if(b[a+17046>>1]&2)switch(d<<16>>16){case 1:{a=c[c[a>>2]>>2]|0;return a|0}case 2:{a=c[(c[a>>2]|0)+4>>2]|0;return a|0}case 3:{a=32;return a|0}default:break a}while(0);if((d&65535)>=11){a=0;return a|0}a=e[f+((d&65535)<<1)>>1]|0;return a|0}function Pj(a,d,f,g){a=a|0;d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;k=c[a>>2]|0;if(!d){b[a+17036>>1]=f;return}i=a+17036|0;j=b[i>>1]|0;g=j&65535;switch(j<<16>>16){case 0:{if((f+-45248|0)>>>0>=6)return;b[a+17038+(g<<1)>>1]=f;return}case 4:{if((f&1|0)!=0?(b[a+17046>>1]&1)==0:0){h=a+17040|0;d=b[h>>1]|0;g=d&65535;j=a+17042|0;if(((d&65535)<4097?(l=b[j>>1]|0,(l&65535)<4097):0)?(m=g<<2,l=N(m,l&65535)|0,(l|0)<=(c[k+16>>2]|0)):0){c[k>>2]=g;c[k+4>>2]=e[j>>1];c[k+8>>2]=m;g=b[i>>1]|0;d=b[h>>1]|0}else g=4;b[a+17050>>1]=d;b[a+17052>>1]=b[j>>1]|0;b[a+17054>>1]=0;b[a+17056>>1]=0}else g=4;b[a+17038+((g&65535)<<1)>>1]=f;return}case 9:case 8:case 7:case 6:case 5:case 3:case 2:case 1:{b[a+17038+(g<<1)>>1]=f;return}default:return}}function Qj(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;U=c[f+20>>2]|0;if(!(a[U+54>>0]&32))return;if(a[U+44>>0]&1){Nd(f,g,h,c[U+8>>2]|0,c[U+4>>2]|0);return}S=c[U>>2]|0;T=U+71|0;l=(a[T>>0]|0)<0;n=d[U+75>>0]<<4;m=n&240;n=n&192;k=0;f=0;do{P=d[U+55+k>>0]|0;P=(l?P&15|m:P&63|n)*3|0;R=d[U+348+P>>0]|0;Q=R&1;i=d[P+1+(U+348)>>0]|0;j=i&1;P=d[P+2+(U+348)>>0]|0;O=P&1;i=O<<1|O|P<<2&252|(Q<<1|Q|R<<2&252)<<16|(j<<1|j|i<<2&252)<<8;j=U+1116+(k<<2)|0;if((i|0)!=(c[j>>2]|0)){c[j>>2]=i;f=1}k=k+1|0}while((k|0)!=16);M=c[U+24>>2]|0;O=d[U+100>>0]<<2;v=d[U+93>>0]<<8|d[U+94>>0];u=a[U+90>>0]&31;P=u+1|0;Q=9-(a[U+30>>0]&1)|0;i=a[U+82>>0]|0;R=(i&255)+1|0;r=d[U+88>>0]|0;r=r<<7&256|d[U+99>>0]|r<<3&512;L=((r+1|0)>>>0)/(P>>>0)|0;o=N(R,Q)|0;p=N(L,P)|0;if((c[S>>2]|0)<(o|0))return;q=S+4|0;if(L>>>0>60|((i&255)>131?1:(c[q>>2]|0)<(p|0)))return;i=U+17028|0;j=U+17030|0;if(!((((O|0)==(e[i>>1]|0)?(v|0)==(e[j>>1]|0):0)?(c[U+17020>>2]|0)==(R|0):0)?(c[U+17024>>2]|0)==(L|0):0)){b[i>>1]=O;b[j>>1]=v;c[U+17020>>2]=R;c[U+17024>>2]=L;f=1}i=d[U+95>>0]<<8|d[U+96>>0];j=i-v|0;k=a[U+91>>0]|0;s=k&255;t=a[U+92>>0]|0;l=U+17032|0;m=b[l>>1]|0;n=m&65535;if(!(((j|0)==(n|0)?k<<24>>24==(a[U+17034>>0]|0):0)?t<<24>>24==(a[U+17035>>0]|0):0)){if((m&65535)<7920)b[U+1180+(n<<1)>>1]=-1;if(j>>>0<7920)b[U+1180+(j<<1)>>1]=-1;b[l>>1]=j;a[U+17034>>0]=k;a[U+17035>>0]=t}K=(i<<1)+98304|0;J=((c[S>>2]|0)-o|0)/2|0;I=((c[q>>2]|0)-p|0)/2|0;if(r>>>0<u>>>0)return;F=S+12|0;G=S+8|0;H=J<<2;B=(f|0)==0;C=Q<<2;D=(Q|0)==8;E=(s&32|0)!=0;A=s&31;y=t&31;y=y>>>0<u>>>0?y:u;z=A>>>0>u>>>0|(y|0)<(A|0);y=y-A+1|0;x=0;u=(v<<1)+98304|0;while(1){v=(N(x,P)|0)+I|0;w=N(x,R)|0;r=0;i=R;f=-1;s=(c[F>>2]|0)+(N(c[G>>2]|0,v)|0)+H|0;t=u;while(1){j=b[M+(t&131070)>>1]|0;l=j&65535;k=U+1180+(r+w<<1)|0;if(!(B?j<<16>>16==(b[k>>1]|0):0)){b[k>>1]=j;i=(i|0)<(r|0)?i:r;f=(f|0)>(r|0)?f:r;j=l&255;k=M+(j<<5)|0;q=c[U+1116+(l>>>12<<2)>>2]|0;p=c[U+1116+((l>>>8&15)<<2)>>2]|0;if(D){m=c[G>>2]|0;n=p^q;l=s;j=k;k=P;while(1){o=d[j>>0]|0;c[l>>2]=n&0-(o>>>7)^q;c[l+4>>2]=n&0-(o>>>6&1)^q;c[l+8>>2]=n&0-(o>>>5&1)^q;c[l+12>>2]=n&0-(o>>>4&1)^q;c[l+16>>2]=n&0-(o>>>3&1)^q;c[l+20>>2]=n&0-(o>>>2&1)^q;c[l+24>>2]=n&0-(o>>>1&1)^q;c[l+28>>2]=n&0-(o&1)^q;k=k+-1|0;if(!k)break;else{l=l+m|0;j=j+1|0}}}else{if((j+-176|0)>>>0<48)j=(d[T>>0]|0)>>>2&1;else j=0;n=c[G>>2]|0;o=p^q;m=(j|0)==0;l=s;j=k;k=P;while(1){V=d[j>>0]|0;c[l>>2]=o&0-(V>>>7)^q;c[l+4>>2]=o&0-(V>>>6&1)^q;c[l+8>>2]=o&0-(V>>>5&1)^q;c[l+12>>2]=o&0-(V>>>4&1)^q;c[l+16>>2]=o&0-(V>>>3&1)^q;c[l+20>>2]=o&0-(V>>>2&1)^q;c[l+24>>2]=o&0-(V>>>1&1)^q;V=o&0-(V&1)^q;c[l+28>>2]=V;c[l+32>>2]=m?q:V;k=k+-1|0;if(!k)break;else{l=l+n|0;j=j+1|0}}}if(!(z|(E|(K|0)!=(t|0)))){n=c[G>>2]|0;j=s+(N(n,A)|0)|0;m=p^q;if(D){k=11680;l=y;while(1){V=d[k>>0]|0;c[j>>2]=m&0-(V>>>7)^q;c[j+4>>2]=m&0-(V>>>6&1)^q;c[j+8>>2]=m&0-(V>>>5&1)^q;c[j+12>>2]=m&0-(V>>>4&1)^q;c[j+16>>2]=m&0-(V>>>3&1)^q;c[j+20>>2]=m&0-(V>>>2&1)^q;c[j+24>>2]=m&0-(V>>>1&1)^q;c[j+28>>2]=m&0-(V&1)^q;l=l+-1|0;if(!l)break;else{j=j+n|0;k=k+1|0}}}else{k=11680;l=y;while(1){V=d[k>>0]|0;c[j>>2]=m&0-(V>>>7)^q;c[j+4>>2]=m&0-(V>>>6&1)^q;c[j+8>>2]=m&0-(V>>>5&1)^q;c[j+12>>2]=m&0-(V>>>4&1)^q;c[j+16>>2]=m&0-(V>>>3&1)^q;c[j+20>>2]=m&0-(V>>>2&1)^q;c[j+24>>2]=m&0-(V>>>1&1)^q;V=m&0-(V&1)^q;c[j+28>>2]=V;c[j+32>>2]=V;l=l+-1|0;if(!l)break;else{j=j+n|0;k=k+1|0}}}}}r=r+1|0;if((r|0)==(R|0))break;else{s=s+C|0;t=t+2|0}}if((f|0)>=(i|0)){w=(N(i,Q)|0)+J|0;V=N(f+1-i|0,Q)|0;ib[g&1](S,h,w,v,V,P)}x=x+1|0;if(x>>>0>=L>>>0)break;else u=u+O|0}return}function Rj(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;switch(e&-16|0){case 944:{if(a[b+337>>0]&1)return;break}case 976:{if(!(a[b+337>>0]&1))return;break}default:{}}do switch(e|0){case 960:{e=b+76|0;a:do if(!(c[e>>2]|0))a[b+54>>0]=f&63;else{h=a[b+54>>0]|0;g=h&31;switch(h&31){case 15:case 14:case 13:case 12:case 11:case 10:case 9:case 8:case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{a[b+55+g>>0]=f&63;break a}case 16:{a[b+55+g>>0]=f&239;break a}case 17:{a[b+55+g>>0]=f;break a}case 18:{a[b+55+g>>0]=f&63;break a}case 19:{a[b+55+g>>0]=f&15;break a}case 20:{a[b+55+g>>0]=f&15;break a}default:break a}}while(0);c[e>>2]=c[e>>2]^1;return}case 962:{a[b+337>>0]=f&239;return}case 964:{a[b+28>>0]=f&7;return}case 965:{h=d[b+28>>0]|0;a[b+29+h>>0]=d[20059+h>>0]&f;return}case 967:{a[b+343>>0]=f;a[b+342>>0]=0;a[b+341>>0]=3;return}case 968:{a[b+344>>0]=f;a[b+342>>0]=0;a[b+341>>0]=0;return}case 969:{e=b+342|0;h=a[e>>0]|0;a[(h&255)+(b+345)>>0]=f;h=h+1<<24>>24;a[e>>0]=h;if(h<<24>>24!=3)return;h=b+344|0;f=a[h>>0]|0;g=((f&255)*3|0)+(b+348)|0;b=b+345|0;a[g>>0]=a[b>>0]|0;a[g+1>>0]=a[b+1>>0]|0;a[g+2>>0]=a[b+2>>0]|0;a[e>>0]=0;a[h>>0]=f+1<<24>>24;return}case 974:{a[b+37>>0]=f&15;return}case 975:{h=d[b+37>>0]|0;a[b+38+h>>0]=d[11712+h>>0]&f;return}case 980:case 948:{a[b+80>>0]=f;return}case 981:case 949:{e=a[b+80>>0]|0;if((a[b+98>>0]|0)<0&(e&255)<8){if(e<<24>>24!=7)return;h=b+88|0;a[h>>0]=f&16|a[h>>0]&-17&255;return}switch(e<<24>>24){case 18:case 13:case 12:case 9:case 7:case 1:{a[(e&255)+(b+81)>>0]=f;return}default:{a[(e&255)+(b+81)>>0]=f;return}}}case 986:case 954:{a[b+338>>0]=f&16;return}default:return}while(0)}function Sj(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0;switch(e&-16|0){case 944:{if(a[b+337>>0]&1){b=255;return b|0}break}case 976:{if(!(a[b+337>>0]&1)){b=255;return b|0}break}default:{}}do switch(e|0){case 960:{if(c[b+76>>2]|0){b=0;return b|0}b=d[b+54>>0]|0;return b|0}case 961:{e=a[b+54>>0]&31;if((e&255)>=21){b=0;return b|0}b=d[(e&255)+(b+55)>>0]|0;return b|0}case 962:{b=d[b+339>>0]|0;return b|0}case 964:{b=d[b+28>>0]|0;return b|0}case 965:{b=d[(d[b+28>>0]|0)+(b+29)>>0]|0;return b|0}case 967:{b=d[b+341>>0]|0;return b|0}case 968:{b=d[b+344>>0]|0;return b|0}case 969:{f=b+343|0;g=a[f>>0]|0;h=b+342|0;i=a[h>>0]|0;e=d[((g&255)*3|0)+(i&255)+(b+348)>>0]|0;b=i+1<<24>>24;a[h>>0]=b;if(b<<24>>24!=3){i=e;return i|0}a[h>>0]=0;a[f>>0]=g+1<<24>>24;i=e;return i|0}case 970:{i=d[b+338>>0]|0;return i|0}case 972:{i=d[b+337>>0]|0;return i|0}case 974:{i=d[b+37>>0]|0;return i|0}case 975:{i=d[(d[b+37>>0]|0)+(b+38)>>0]|0;return i|0}case 980:case 948:{i=d[b+80>>0]|0;return i|0}case 981:case 949:{i=d[(d[b+80>>0]|0)+(b+81)>>0]|0;return i|0}case 986:case 954:{h=b+340|0;i=a[h>>0]^9;a[h>>0]=i;c[b+76>>2]=0;i=i&255;return i|0}default:{i=0;return i|0}}while(0);return 0} +function Pg(){var a=0,b=0,d=0,f=0,g=0,h=0,i=0,j=0;b=c[5634]|0;j=b&65535;d=c[5755]&15;d=(d|0)==0?3:d+-1|0;b=ig(b&65535,1,0)|0;if((b|0)<0){if((c[5746]|0)!=32){j=b;return j|0}a=c[5755]|0;if(a&48){a=(c[5766]|0)+120|0;i=a;j=c[i+4>>2]|0;c[a>>2]=c[i>>2]|8;c[a+4>>2]=j;a=c[5755]|0}h=(c[5766]|0)+120|0;g=h;j=c[g+4>>2]|0;c[h>>2]=c[g>>2]|(a&128^128)+128;c[h+4>>2]=j;h=d<<10|4;j=(c[5766]|0)+120|0;g=j;i=c[g+4>>2]|((h|0)<0)<<31>>31;c[j>>2]=c[g>>2]|h;c[j+4>>2]=i;j=b;return j|0}f=c[5755]|0;g=f<<9&65536;h=g+-1|0;i=c[5638]|0;if(f&48){f=c[5633]|0;if(!(f&h)){j=0;return j|0}a=(c[22740+(d<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if((b|a)&1)if(!(zf(a,1,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=e[b+a>>1]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,1);g=0-g|0;c[5638]=(c[5646]<<1)+i&h|i&g;j=f+-1&h;c[5633]=j|f&g;if(j|0){j=1;return j|0}}else{a=(c[22740+(d<<4)+4>>2]|0)+(h&i)|0;b=c[23084+((a>>>12)+(c[5770]|0)<<2)>>2]|0;do if((b|a)&1)if(!(zf(a,1,0,2)|0)){a=c[5762]|0;break}else{j=-1;return j|0}else a=e[b+a>>1]|0;while(0);gb[c[16808516>>2]&63](c[4202130]|0,j,a,1);c[5638]=(c[5646]<<1)+i&h|i&0-g}j=0;return j|0}function Qg(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m+8|0;k=m+4|0;g=m;h=(a[22968]|0)==3&1;i=(e|0)!=0;f=h<<20|d>>>12;f=c[(i?8411692+(f<<2)|0:23084+(f<<2)|0)>>2]|0;if(f&1){if(wf(g,j,k,d,e,h)|0){b=-1;l=m;return b|0}f=c[g>>2]|0;h=Ge(c[4202123]|0,f,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0){e=f-(c[h+8>>2]|0)|0;f=c[h+48>>2]|0;g=(f|0)==0;if(i){f=f+(e>>>17<<2)|0;if(!g)c[f>>2]=c[f>>2]|1<<(e>>>12&31)}else if(!g?(c[f+(e>>>17<<2)>>2]&1<<(e>>>12&31)|0)==0:0)c[j>>2]=0;f=(c[h+40>>2]|0)+e|0;xf(d,f,c[j>>2]|0,c[k>>2]|0)}else f=0}else f=f+d|0;c[b>>2]=f;b=0;l=m;return b|0}function Rg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=c[5766]|0;if(!e){d=0;return d|0}if(!(c[e+12>>2]&268435456)){d=0;return d|0}a:do if(b>>>0>=8192){f=b&-8192;if((f|0)<-1073676288){switch(f|0){case -1073741824:break;default:break a}f=b+1073750016|0;g=7;break}else{switch(f|0){case -1073676288:break;default:break a}f=b+1073758208|0;g=7;break}}else{f=b;g=7}while(0);do if((g|0)==7){e=(c[e+72>>2]&-4096)+(f>>>2)|0;b=Ge(c[4202123]|0,e,0)|0;if((b|0)!=0?(c[b+32>>2]|0)!=0:0)e=a[(c[b+40>>2]|0)+(e-(c[b+8>>2]|0))>>0]|0;else e=0;if(!(1<<(f<<1&6)+d&(e&255))){d=0;return d|0}else{e=c[5766]|0;break}}while(0);c[5746]=32;g=e+112|0;c[g>>2]=124;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=d;c[g+4>>2]=((d|0)<0)<<31>>31;d=-1;return d|0}function Sg(d,f){d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;j=2<<f;g=c[5770]|0;f=c[23084+(g+(d>>>12)<<2)>>2]|0;do if((f|d)&1)if(!(zf(d,1,0,2)|0)){k=c[5762]|0;g=c[5770]|0;break}else{l=-1;return l|0}else k=e[f+d>>1]|0;while(0);f=j+d|0;h=c[23084+(g+(f>>>12)<<2)>>2]|0;do if((h|f)&1)if(!(zf(f,1,0,2)|0)){i=c[5762]|0;g=c[5770]|0;break}else{l=-1;return l|0}else i=e[h+f>>1]|0;while(0);h=(j<<1)+d|0;f=c[23084+(g+(h>>>12)<<2)>>2]|0;do if((f|h)&1)if(!(zf(h,1,0,2)|0)){f=c[5762]|0;break}else{l=-1;return l|0}else f=e[f+h>>1]|0;while(0);k=k&65535;b[11299]=k;c[5648]=i>>>11&7;b[11298]=i&51199;a[22600]=(f&3|0)==3&1;a[22601]=(f&12|0)==12&1;a[22602]=(f&48|0)==48&1;a[22603]=(f&192|0)==192&1;a[22604]=(f&768|0)==768&1;a[22605]=(f&3072|0)==3072&1;a[22606]=(f&12288|0)==12288&1;a[22607]=(f&49152|0)==49152&1;switch((k&65535)>>>10&3){case 0:{l=0;break}case 1:{l=1;break}case 2:{l=2;break}case 3:{l=3;break}default:{}}Yh(l,22736);l=(e[11299]|0)>>>8&255;Zh((l&3)==0?32:(l&3)==2?64:80,22736);l=0;return l|0}function Tg(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=b[11298]&-14337;l=c[5648]<<11;f=0;j=7;while(1){i=f<<2;do if(!(a[22600+j>>0]|0)){h=22608+(j<<4)|0;g=c[h>>2]|0;h=c[h+4>>2]|0;f=b[22608+(j<<4)+8>>1]|0;if((g|0)==0&(h|0)==0&(f&32767)==0){n=i|1;break}a:do if(f<<16>>16<0)if(f<<16>>16<-1)switch(f<<16>>16){case -32768:break a;default:{m=7;break a}}else switch(f<<16>>16){case -1:break a;default:{m=7;break a}}else if(f<<16>>16<32767)switch(f<<16>>16){case 0:break a;default:{m=7;break a}}else switch(f<<16>>16){case 32767:break a;default:{m=7;break a}}while(0);if((m|0)==7?(m=0,!((h|0)>-1|(h|0)==-1&g>>>0>4294967295)):0){n=i;break}n=i|2}else n=i|3;while(0);if(!j)break;else{f=n;j=j+-1|0}}j=l|k&65535;f=b[11299]|0;g=f&65535;h=c[8411692+((c[5770]|0)+(d>>>12)<<2)>>2]|0;i=h|d;do if(!e){if(i&1){if(Bf(d,g,1,2)|0){d=-1;return d|0}}else b[h+d>>1]=f;f=d+2|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,j,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=j;f=d+4|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,n,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=n;f=d+6|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,0,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=0;f=d+8|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,0,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=0;f=d+10|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&1){if(Bf(f,0,1,2)|0){d=-1;return d|0}}else b[g+f>>1]=0;f=d+12|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&1)){b[g+f>>1]=0;break}if(Bf(f,0,1,2)|0){d=-1;return d|0}}else{if(i&3){if(Bf(d,g,2,2)|0){d=-1;return d|0}}else c[h+d>>2]=g;f=d+4|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,j,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=j;f=d+8|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,n,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=n;f=d+12|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,0,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=0;f=d+16|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,0,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=0;f=d+20|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if((g|f)&3){if(Bf(f,0,2,2)|0){d=-1;return d|0}}else c[g+f>>2]=0;f=d+24|0;g=c[8411692+((c[5770]|0)+(f>>>12)<<2)>>2]|0;if(!((g|f)&3)){c[g+f>>2]=0;break}if(Bf(f,0,2,2)|0){d=-1;return d|0}}while(0);d=0;return d|0}function Ug(a,b){a=a|0;b=b|0;var f=0,g=0,h=0;g=l;l=l+32|0;f=g+16|0;h=g;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[h+12>>2]=c[a+12>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];b=Gi(h,f,1,22736)|0;a=nf(22528)|0;if((c[5643]|0)==24){h=c[5641]|0;f=h>>>7&1;a=h&4|a|((c[5642]|0)==0&1)<<6}else{h=c[5642]|0;f=h>>>31;a=(d[21168+(h&255)>>0]|0)<<2|a|((h|0)==0&1)<<6}f=f<<7|a|(uf()|0)<<11;f=(f|(vf()|0))&-70;h=e[15280+(b+1<<1)>>1]|0;c[5641]=f|h;c[5642]=h>>>6&1^1;c[5643]=24;l=g;return}function Vg(a,b){a=a|0;b=b|0;var f=0,g=0,h=0;g=l;l=l+32|0;f=g+16|0;h=g;c[h>>2]=c[a>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[h+12>>2]=c[a+12>>2];c[f>>2]=c[b>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[f+12>>2]=c[b+12>>2];b=Gi(h,f,0,22736)|0;a=nf(22528)|0;if((c[5643]|0)==24){h=c[5641]|0;f=h>>>7&1;a=h&4|a|((c[5642]|0)==0&1)<<6}else{h=c[5642]|0;f=h>>>31;a=(d[21168+(h&255)>>0]|0)<<2|a|((h|0)==0&1)<<6}f=f<<7|a|(uf()|0)<<11;f=(f|(vf()|0))&-70;h=e[15280+(b+1<<1)>>1]|0;c[5641]=f|h;c[5642]=h>>>6&1^1;c[5643]=24;l=g;return}function Wg(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=c[5636]|0;i=c[5694]|0;h=i+(k&65535)|0;f=c[23084+(h>>>12<<2)>>2]|0;g=f|h;if((a|0)==1){if(g&3)if(!(zf(h,2,0,0)|0))f=23048;else{b=-1;return b|0}else f=f+h|0;j=c[f>>2]|0;f=(k+4&65535)+i|0;g=c[23084+(f>>>12<<2)>>2]|0;if((g|f)&3)if(!(zf(f,2,0,0)|0))f=23048;else{b=-1;return b|0}else f=g+f|0;g=k+8|0;f=c[f>>2]&65535;if(!b){i=g;g=0;h=j}else{g=(g&65535)+i|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{b=-1;return b|0}else g=h+g|0;i=k+12|0;g=c[g>>2]|0;h=j}}else{do if(g&1)if(!(zf(h,1,0,0)|0)){j=c[5762]|0;break}else{b=-1;return b|0}else j=e[f+h>>1]|0;while(0);f=(k+2&65535)+i|0;g=c[23084+(f>>>12<<2)>>2]|0;do if((g|f)&1)if(!(zf(f,1,0,0)|0)){f=c[5762]|0;break}else{b=-1;return b|0}else f=e[g+f>>1]|0;while(0);g=k+4|0;if(!b){i=g;g=0;h=j}else{g=(g&65535)+i|0;h=c[23084+(g>>>12<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,0)|0)){g=c[5762]|0;break}else{b=-1;return b|0}else g=e[h+g>>1]|0;while(0);i=k+6|0;h=j}}k=c[5729]|0;c[5636]=c[5636]&~k|k&i+d;c[5689]=f;f=f<<4;c[5690]=f;c[5640]=h;if(b|0){d=c[5647]|0;b=(d&131072|0)==0?2454272:2441984;b=(a|0)==0?b&29440:b;c[5641]=g&2261;c[5642]=g>>>6&1^1;c[5643]=24;c[5646]=1-(g>>>9&2);c[5647]=d&~b|b&g}b=(c[5696]|0)>>>6&65536;c[5729]=(b^65536)+-1;c[5731]=(c[5694]|f|c[5698]|c[5686]|0)==0?b>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;b=0;return b|0}function Xg(f,g,h,i,j,k,m){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=l;l=l+64|0;H=J+32|0;I=J;p=c[5766]|0;if(p|0?c[p+12>>2]&536870912|0:0){c[5746]=32;I=p+112|0;c[I>>2]=125;c[I+4>>2]=0;I=(c[5766]|0)+120|0;c[I>>2]=f&65535;c[I+4>>2]=0;I=(c[5766]|0)+128|0;c[I>>2]=m;c[I+4>>2]=0;switch(i|0){case 0:{n=0;o=64;E=5;break}case 1:{n=0;o=16;E=5;break}default:{}}if((E|0)==5){m=(c[5766]|0)+128|0;H=m;I=c[H+4>>2]|o;c[m>>2]=c[H>>2]|n;c[m+4>>2]=I}if(k|0){m=(c[5766]|0)+128|0;k=m;I=c[k+4>>2]|4096;c[m>>2]=c[k>>2];c[m+4>>2]=I}if(!(c[5647]&65536)){m=-1;l=J;return m|0}m=(c[5766]|0)+128|0;k=m;I=c[k+4>>2]|65536;c[m>>2]=c[k>>2];c[m+4>>2]=I;m=-1;l=J;return m|0}n=h>>>8&15;if((n|0)==5){if(!(h&32768)){c[5746]=11;c[5747]=f&-4&65535;m=-1;l=J;return m|0}p=g>>>16;f=p&65535;if(g&262144|0){c[5746]=10;c[5747]=p&65532;m=-1;l=J;return m|0}n=(g>>>17&2^2)+6|0;if((p|7)>>>0>(c[22740+(n<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=p&65532;m=-1;l=J;return m|0}g=(c[22740+(n<<4)+4>>2]|0)+(p&65528)|0;n=c[23084+(g>>>12<<2)>>2]|0;if((n|g)&3)if(!(zf(g,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=n+g|0;o=c[n>>2]|0;n=g+4|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;g=c[n>>2]|0;if(g&4096|0){c[5746]=13;c[5747]=p&65532;m=-1;l=J;return m|0}if((g&1792|0)==256){n=g>>>8&15;h=g;g=o}else{c[5746]=13;c[5747]=p&65532;m=-1;l=J;return m|0}}if(!(h&32768)){c[5746]=11;c[5747]=f&-4&65535;m=-1;l=J;return m|0}D=(n&8|0)!=0;C=h&983040|g&65535;C=(h&8388608|0)==0?C:C<<12|4095;z=g>>>16;B=h&-16777216|z|h<<16&16711680;A=f&65535;if((A&4|0)!=0|(C|0)<((D?103:43)|0)){c[5746]=10;c[5747]=A&65532;m=-1;l=J;return m|0}x=(c[5716]&2048|0)!=0;v=x?103:43;if(D){n=B+28|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;s=c[n>>2]|0;n=B+32|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;r=c[n>>2]|0;n=B+36|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=g+n|0;q=c[n>>2]|0;p=B+40|0;o=0;do{f=H+(o<<2)|0;n=p+(o<<2)|0;g=c[23084+(n>>>12<<2)>>2]|0;if((g|n)&3)if(!(zf(n,2,0,0)|0))n=23048;else{y=-1;E=173;break}else n=g+n|0;c[f>>2]=c[n>>2];o=o+1|0}while(o>>>0<8);if((E|0)==173){l=J;return y|0}n=B+72|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[I>>2]=n;o=I+4|0;n=B+76|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+8|0;n=B+80|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+12|0;n=B+84|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+16|0;n=B+88|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+20|0;n=B+92|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;n=B+96|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){g=c[5762]|0;break}else{m=-1;l=J;return m|0}else g=e[g+n>>1]|0;while(0);n=B+100|0;if(((c[23084+(n>>>12<<2)>>2]|n)&3|0)!=0?(zf(n,2,0,0)|0)!=0:0){m=-1;l=J;return m|0}else{w=g;u=q}}else{n=B+14|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){r=c[5762]|0;break}else{m=-1;l=J;return m|0}else r=e[g+n>>1]|0;while(0);n=B+16|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){q=c[5762]|0;break}else{m=-1;l=J;return m|0}else q=e[g+n>>1]|0;while(0);p=B+18|0;o=0;do{f=H+(o<<2)|0;n=p+(o<<1)|0;g=c[23084+(n>>>12<<2)>>2]|0;if(!((g|n)&1))n=e[g+n>>1]|0;else{if(zf(n,1,0,0)|0){y=-1;E=173;break}n=c[5762]|0}c[f>>2]=n|-65536;o=o+1|0}while(o>>>0<8);if((E|0)==173){l=J;return y|0}n=B+34|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[I>>2]=n;o=I+4|0;n=B+38|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+8|0;n=B+42|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;o=I+12|0;n=B+46|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[o>>2]=n;n=B+42|0;g=c[23084+(n>>>12<<2)>>2]|0;do if((g|n)&1)if(!(zf(n,1,0,0)|0)){n=c[5762]|0;break}else{m=-1;l=J;return m|0}else n=e[g+n>>1]|0;while(0);c[I+16>>2]=0;c[I+20>>2]=0;s=0;w=n;u=q}t=c[5714]|0;f=t>>>12;n=c[23084+(f<<2)>>2]|0;do if(n&1)if(!(zf(t,0,0,0)|0)){p=c[5762]|0;break}else{m=-1;l=J;return m|0}else p=d[n+t>>0]|0;while(0);q=t+v|0;o=q>>>12;n=c[23084+(o<<2)>>2]|0;do if(n&1)if(!(zf(q,0,0,0)|0)){g=c[5762]|0;break}else{m=-1;l=J;return m|0}else g=d[n+q>>0]|0;while(0);n=c[8411692+(f<<2)>>2]|0;if(n&1){if(Bf(t,p,0,0)|0){m=-1;l=J;return m|0}}else a[n+t>>0]=p;n=c[8411692+(o<<2)>>2]|0;if(n&1){if(Bf(q,g,0,0)|0){m=-1;l=J;return m|0}}else a[n+q>>0]=g;p=(i|0)==1;do if(i>>>0<2){f=(c[5718]|0)+4+(c[5713]&-8)|0;o=f>>>12;n=c[23084+(o<<2)>>2]|0;if((f|n)&3)if(!(zf(f,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=f+n|0;g=c[n>>2]&-513;n=c[8411692+(o<<2)>>2]|0;if(!((n|f)&3)){c[n+f>>2]=g;break}if(Bf(f,g,2,0)|0){m=-1;l=J;return m|0}}while(0);o=sf()|0;o=p?o&-16385:o;do if(!x){n=t+14|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&1){if(Bf(n,j,1,0)|0){m=-1;l=J;return m|0}}else b[g+n>>1]=j;n=t+16|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&1){if(Bf(n,o,1,0)|0){m=-1;l=J;return m|0}}else b[g+n>>1]=o;g=t+18|0;n=0;do{o=g+(n<<1)|0;p=c[22528+(n<<2)>>2]|0;f=c[8411692+(o>>>12<<2)>>2]|0;if((f|o)&1){if(Bf(o,p,1,0)|0){y=-1;E=173;break}}else b[f+o>>1]=p;n=n+1|0}while(n>>>0<8);if((E|0)==173){l=J;return y|0}n=t+34|0;g=c[5685]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+38|0;g=c[5689]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+42|0;g=c[5693]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+46|0;g=c[5697]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if(!((o|n)&1)){b[o+n>>1]=g;break}if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else{n=t+32|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&3){if(Bf(n,j,2,0)|0){m=-1;l=J;return m|0}}else c[g+n>>2]=j;n=t+36|0;g=c[8411692+(n>>>12<<2)>>2]|0;if((g|n)&3){if(Bf(n,o,2,0)|0){m=-1;l=J;return m|0}}else c[g+n>>2]=o;g=t+40|0;n=0;do{o=g+(n<<2)|0;p=c[22528+(n<<2)>>2]|0;f=c[8411692+(o>>>12<<2)>>2]|0;if((f|o)&3){if(Bf(o,p,2,0)|0){y=-1;E=173;break}}else c[f+o>>2]=p;n=n+1|0}while(n>>>0<8);if((E|0)==173){l=J;return y|0}n=t+72|0;g=c[5685]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+76|0;g=c[5689]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+80|0;g=c[5693]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+84|0;g=c[5697]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if((o|n)&1){if(Bf(n,g,1,0)|0){m=-1;l=J;return m|0}}else b[o+n>>1]=g;n=t+88|0;g=c[5701]|0;o=c[8411692+(n>>>12<<2)>>2]|0;do if(!((o|n)&1))b[o+n>>1]=g;else{if(!(Bf(n,g,1,0)|0))break;else y=-1;l=J;return y|0}while(0);n=t+92|0;g=c[5705]|0;o=c[8411692+(n>>>12<<2)>>2]|0;if(!((o|n)&1)){b[o+n>>1]=g;break}if(!(Bf(n,g,1,0)|0))break;else y=-1;l=J;return y|0}while(0);if((i|0)!=2)if((i|2|0)==2){G=u;E=137}else F=u;else{n=c[5713]|0;g=c[8411692+(B>>>12<<2)>>2]|0;if((g|z)&1){if(Bf(B,n,1,0)|0){m=-1;l=J;return m|0}}else b[g+B>>1]=n;G=u|16384;E=137}do if((E|0)==137){p=(A&65528|4)+(c[5718]|0)|0;o=p>>>12;n=c[23084+(o<<2)>>2]|0;if((n|p)&3)if(!(zf(p,2,0,0)|0))n=23048;else{m=-1;l=J;return m|0}else n=n+p|0;g=c[n>>2]|512;n=c[8411692+(o<<2)>>2]|0;if(!((n|p)&3)){c[n+p>>2]=g;F=G;break}if(!(Bf(p,g,2,0)|0))F=G;else{m=-1;l=J;return m|0}}while(0);G=c[5732]|8;c[5732]=G;c[5713]=A;c[5714]=B;c[5715]=C;c[5716]=h&-513;if(D&(G|0)<0){c[5734]=s;g=c[5769]|0;if((g|0)>0){n=0;do{G=c[16800300+(n<<2)>>2]|0;c[23084+(G<<2)>>2]=-1;c[8411692+(G<<2)>>2]=-1;G=G+1048576|0;c[23084+(G<<2)>>2]=-1;c[8411692+(G<<2)>>2]=-1;n=n+1|0}while((n|0)!=(g|0))}c[5769]=0}c[5640]=r;g=D?2585344:29440;c[5641]=F&2261;c[5642]=F>>>6&1^1;c[5643]=24;c[5646]=1-(F>>>9&2);c[5647]=c[5647]&~g|F&g;c[5632]=c[H>>2];c[5633]=c[H+4>>2];c[5634]=c[H+8>>2];c[5635]=c[H+12>>2];c[5636]=c[H+16>>2];c[5637]=c[H+20>>2];c[5638]=c[H+24>>2];c[5639]=c[H+28>>2];g=(F&131072|0)==0;if(g){n=c[I+4>>2]&3;a[22968]=n;c[5770]=(n|0)==3?1048576:0;n=0;do{c[22740+(n<<4)>>2]=c[I+(n<<2)>>2];c[22740+(n<<4)+4>>2]=0;c[22740+(n<<4)+8>>2]=0;c[22740+(n<<4)+12>>2]=0;H=(c[5696]|0)>>>6&65536;c[5729]=(H^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?H>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;n=n+1|0}while((n|0)!=6)}else{n=0;do{H=c[I+(n<<2)>>2]|0;c[22740+(n<<4)>>2]=H;c[22740+(n<<4)+4>>2]=H<<4;c[22740+(n<<4)+8>>2]=65535;c[22740+(n<<4)+12>>2]=62208;H=(c[5696]|0)>>>6&65536;c[5729]=(H^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?H>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;n=n+1|0}while((n|0)!=6);a[22968]=3;c[5770]=1048576}c[5709]=w&-5;c[5710]=0;c[5711]=0;c[5712]=0;if(rg(w,1)|0){m=-1;l=J;return m|0}do if(g){if(Zg(1,c[I+4>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(2,c[I+8>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(0,c[I>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(3,c[I+12>>2]|0,1)|0){m=-1;l=J;return m|0}if(Zg(4,c[I+16>>2]|0,1)|0){m=-1;l=J;return m|0}if(!(Zg(5,c[I+20>>2]|0,1)|0))break;else y=-1;l=J;return y|0}while(0);if(k|0){g=((c[5696]|0)>>>6&65536^65536)+-1|0;o=c[5694]|0;n=c[5636]|0;do if(D){n=n+-4|0;g=(g&n)+o|0;o=c[8411692+(g>>>12<<2)>>2]|0;if(!((o|g)&3)){c[o+g>>2]=m;break}if(!(Bf(g,m,2,0)|0))break;else y=-1;l=J;return y|0}else{n=n+-2|0;g=(g&n)+o|0;o=c[8411692+(g>>>12<<2)>>2]|0;if(!((o|g)&1)){b[o+g>>1]=m;break}if(!(Bf(g,m,1,0)|0))break;else y=-1;l=J;return y|0}while(0);m=c[5729]|0;c[5636]=c[5636]&~m|m&n}if(r>>>0<=(c[5691]|0)>>>0){m=0;l=J;return m|0}c[5746]=13;c[5747]=0;m=-1;l=J;return m|0}function Yg(b,d,f){b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;v=((c[5696]|0)>>>6&65536^65536)+-1|0;q=c[5636]|0;w=c[5694]|0;l=(b|0)==1;g=(v&q)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;i=g|h;if(l){if(i&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=g+h|0;p=c[g>>2]|0;g=(v&q+4)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))h=23048;else{d=-1;return d|0}else h=h+g|0;g=q+8|0;j=c[h>>2]&65535;if(d){g=(v&g)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;o=c[g>>2]|0;g=q+12|0;if(o&131072){g=(v&g)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;n=c[g>>2]|0;g=(v&q+16)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;m=c[g>>2]|0;g=(v&q+20)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;l=c[g>>2]|0;g=(v&q+24)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;k=c[g>>2]|0;g=(v&q+28)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;i=c[g>>2]|0;g=(v&q+32)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;d=c[g>>2]|0;c[5641]=o&2261;c[5642]=o>>>6&1^1;c[5643]=24;c[5646]=1-(o>>>9&2);c[5647]=c[5647]&-4092673|o&4092672;c[5689]=j;c[5690]=j<<4;c[5691]=65535;c[5692]=62208;a[22968]=3;c[5770]=1048576;b=m&65535;c[5693]=b;c[5694]=b<<4;c[5695]=65535;c[5696]=62208;b=l&65535;c[5685]=b;c[5686]=b<<4;c[5687]=65535;c[5688]=62208;b=k&65535;c[5697]=b;c[5698]=b<<4;c[5699]=65535;c[5700]=62208;b=i&65535;c[5701]=b;c[5702]=b<<4;c[5703]=65535;c[5704]=62208;d=d&65535;c[5705]=d;c[5706]=d<<4;c[5707]=65535;c[5708]=62208;c[5729]=65535;c[5731]=0;c[5730]=384;c[5640]=p&65535;c[5636]=n;d=0;return d|0}}else o=0}else{do if(i&1)if(!(zf(g,1,0,0)|0)){i=c[5762]|0;break}else{d=-1;return d|0}else i=e[g+h>>1]|0;while(0);g=(v&q+2)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,0)|0)){j=c[5762]|0;break}else{d=-1;return d|0}else j=e[h+g>>1]|0;while(0);g=q+4|0;if(!d){p=i;o=0}else{g=(v&g)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;do if((h|g)&1)if(!(zf(g,1,0,0)|0)){h=c[5762]|0;break}else{d=-1;return d|0}else h=e[h+g>>1]|0;while(0);g=q+6|0;p=i;o=h}}k=j&65532;if(!k){c[5746]=13;c[5747]=0;d=-1;return d|0}h=(j>>>1&2^2)+6|0;if((j|7)>>>0>(c[22740+(h<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=k;d=-1;return d|0}i=(c[22740+(h<<4)+4>>2]|0)+(j&-8)|0;h=c[23084+(i>>>12<<2)>>2]|0;if((h|i)&3)if(!(zf(i,2,0,0)|0))h=23048;else{d=-1;return d|0}else h=h+i|0;r=c[h>>2]|0;h=i+4|0;i=c[23084+(h>>>12<<2)>>2]|0;if((i|h)&3)if(!(zf(h,2,0,0)|0))h=23048;else{d=-1;return d|0}else h=i+h|0;q=c[h>>2]|0;if((q&6144|0)!=6144){c[5746]=13;c[5747]=k;d=-1;return d|0}t=a[22968]|0;u=t&255;s=j&3;if(s>>>0<u>>>0){c[5746]=13;c[5747]=k;d=-1;return d|0}h=q>>>13&3;if(!(q&1024)){if((h|0)!=(s|0)){c[5746]=13;c[5747]=k;d=-1;return d|0}}else if(h>>>0>s>>>0){c[5746]=13;c[5747]=k;d=-1;return d|0}if(!(q&32768)){c[5746]=11;c[5747]=k;d=-1;return d|0}h=g+f|0;if((s|0)==(u|0)){w=q&-16777216|r>>>16|q<<16&16711680;f=q&983040|r&65535;c[5689]=j;c[5690]=w;c[5691]=(q&8388608|0)==0?f:f<<12|4095;c[5692]=q;f=(c[5696]|0)>>>6&65536;g=(f^65536)+-1|0;c[5729]=g;c[5731]=(c[5694]|w|c[5698]|c[5686]|0)==0?f>>>16:0;c[5730]=(q&4194304|0)==0?384:0}else{g=(h&v)+w|0;i=c[23084+(g>>>12<<2)>>2]|0;k=i|g;do if(!l){do if(k&1)if(!(zf(g,1,0,0)|0)){i=c[5762]|0;break}else{d=-1;return d|0}else i=e[i+g>>1]|0;while(0);g=(h+2&v)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if(!((h|g)&1)){n=i;k=e[h+g>>1]|0;break}if(!(zf(g,1,0,0)|0)){n=i;k=c[5762]|0;break}else{d=-1;return d|0}}else{if(k&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=i+g|0;i=c[g>>2]|0;g=(h+4&v)+w|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;n=i;k=c[g>>2]&65535}while(0);l=k&65532;if(!l){c[5746]=13;c[5747]=0;d=-1;return d|0}if((k&3|0)!=(s|0)){c[5746]=13;c[5747]=l;d=-1;return d|0}g=(k>>>1&2^2)+6|0;if((k|7)>>>0>(c[22740+(g<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=l;d=-1;return d|0}h=(c[22740+(g<<4)+4>>2]|0)+(k&-8)|0;g=c[23084+(h>>>12<<2)>>2]|0;if((g|h)&3)if(!(zf(h,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=g+h|0;i=c[g>>2]|0;g=h+4|0;h=c[23084+(g>>>12<<2)>>2]|0;if((h|g)&3)if(!(zf(g,2,0,0)|0))g=23048;else{d=-1;return d|0}else g=h+g|0;g=c[g>>2]|0;if((g&6656|0)!=4608){c[5746]=13;c[5747]=l;d=-1;return d|0}if((g>>>13&3|0)!=(s|0)){c[5746]=13;c[5747]=l;d=-1;return d|0}if(!(g&32768)){c[5746]=11;c[5747]=l;d=-1;return d|0}w=g&-16777216|i>>>16|g<<16&16711680;m=g&983040|i&65535;c[5693]=k;c[5694]=w;c[5695]=(g&8388608|0)==0?m:m<<12|4095;c[5696]=g;m=g>>>6&65536;g=(m^65536)+-1|0;h=c[5698]|0;i=c[5686]|0;m=m>>>16;l=q&-16777216|r>>>16|q<<16&16711680;k=q&983040|r&65535;c[5689]=j;c[5690]=l;c[5691]=(q&8388608|0)==0?k:k<<12|4095;c[5692]=q;c[5729]=g;l=w|l;j=h|l;c[5731]=(j|i|0)==0?m:0;k=(q&4194304|0)==0?384:0;c[5730]=k;a[22968]=s;c[5770]=(s|0)==3?1048576:0;w=c[5688]|0;if((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0){c[5685]=0;c[5686]=0;c[5687]=0;c[5688]=0;c[5729]=g;c[5731]=(j|0)==0?m:0;c[5730]=k;i=0}w=c[5700]|0;if((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0){c[5697]=0;c[5698]=0;c[5699]=0;c[5700]=0;c[5729]=g;c[5731]=(l|i|0)==0?m:0;c[5730]=k;h=0}do if(c[5701]&65532|0){w=c[5704]|0;if(!((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0))break;c[5701]=0;c[5702]=0;c[5703]=0;c[5704]=0;c[5729]=g;c[5731]=(h|l|i|0)==0?m:0;c[5730]=k}while(0);do if(c[5705]&65532|0){w=c[5708]|0;if(!((w&3072|0)!=3072&(w>>>13&3)>>>0<s>>>0))break;c[5705]=0;c[5706]=0;c[5707]=0;c[5708]=0;c[5729]=g;c[5731]=(h|l|i|0)==0?m:0;c[5730]=k}while(0);h=n+f|0}c[5636]=c[5636]&~g|g&h;c[5640]=p;if(!d){d=0;return d|0}d=t<<24>>24==0?2453760:2441472;f=c[5647]|0;d=(f>>>12&3)>>>0<u>>>0?d:d|512;d=(b|0)==0?d&29440:d;c[5641]=o&2261;c[5642]=o>>>6&1^1;c[5643]=24;c[5646]=1-(o>>>9&2);c[5647]=f&~d|d&o;d=0;return d|0}function Zg(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=(e|0)==0?13:10;k=d[22968]|0;m=b&65532;if(!m)if((a+-1|0)>>>0<2){c[5746]=l;c[5747]=0;b=-1;return b|0}else{c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=0;c[22740+(a<<4)+8>>2]=0;c[22740+(a<<4)+12>>2]=0;b=(c[5696]|0)>>>6&65536;c[5729]=(b^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?b>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;b=0;return b|0}e=(b>>>1&2^2)+6|0;if((b|7)>>>0>(c[22740+(e<<4)+8>>2]|0)>>>0){c[5746]=l;c[5747]=m;b=-1;return b|0}f=(c[22740+(e<<4)+4>>2]|0)+(b&-8)|0;e=c[23084+(f>>>12<<2)>>2]|0;if((e|f)&3)if(!(zf(f,2,0,0)|0))e=23048;else{b=-1;return b|0}else e=e+f|0;n=c[e>>2]|0;j=f+4|0;i=j>>>12;e=c[23084+(i<<2)>>2]|0;if((e|j)&3)if(!(zf(j,2,0,0)|0))e=23048;else{b=-1;return b|0}else e=e+j|0;e=c[e>>2]|0;if(!(e&4096)){c[5746]=l;c[5747]=m;b=-1;return b|0}g=b&3;h=e>>>13&3;switch(a|0){case 1:{if(!(e&2048)){c[5746]=l;c[5747]=m;b=-1;return b|0}f=(e&1024|0)!=0;if(!(f|(h|0)==(g|0))){c[5746]=l;c[5747]=m;b=-1;return b|0}if(f&h>>>0>g>>>0){c[5746]=l;c[5747]=m;b=-1;return b|0}break}case 2:{if((e&2560|0)!=512){c[5746]=l;c[5747]=m;b=-1;return b|0}if(!((g|0)==(k|0)&(h|0)==(k|0))){c[5746]=l;c[5747]=m;b=-1;return b|0}break}default:{if((e&2560|0)==2048){c[5746]=l;c[5747]=m;b=-1;return b|0}if((e&3072|0)!=3072?h>>>0<k>>>0|h>>>0<g>>>0:0){c[5746]=l;c[5747]=m;b=-1;return b|0}}}if(!(e&32768))if((a|0)==2){c[5746]=12;c[5747]=m;b=-1;return b|0}else{c[5746]=11;c[5747]=m;b=-1;return b|0}do if(!(e&256)){e=e|256;f=c[8411692+(i<<2)>>2]|0;if(!((f|j)&3)){c[f+j>>2]=e;break}if(Bf(j,e,2,0)|0){b=-1;return b|0}}while(0);m=e&983040|n&65535;c[22740+(a<<4)>>2]=b;c[22740+(a<<4)+4>>2]=e&-16777216|n>>>16|e<<16&16711680;c[22740+(a<<4)+8>>2]=(e&8388608|0)==0?m:m<<12|4095;c[22740+(a<<4)+12>>2]=e;b=(c[5696]|0)>>>6&65536;c[5729]=(b^65536)+-1;c[5731]=(c[5694]|c[5690]|c[5698]|c[5686]|0)==0?b>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;b=0;return b|0}function _g(a,b,d){a=a|0;b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0;i=l;l=l+32|0;h=i+16|0;g=i;f=c[5716]|0;if(!(f&32768)){j=c[3662]|0;c[g>>2]=19603;c[g+4>>2]=379;c[g+8>>2]=19641;nl(j,19558,g)|0;ra()}if((f&1792|0)!=256){j=c[3662]|0;c[h>>2]=19603;c[h+4>>2]=382;c[h+8>>2]=19653;nl(j,19558,h)|0;ra()}h=f>>>11&1;f=(d<<2|2)<<h;if(((4<<h)+-1+f|0)>>>0>(c[5715]|0)>>>0){j=c[5713]&65532;c[5746]=10;c[5747]=j;j=-1;l=i;return j|0}d=(c[5714]|0)+f|0;f=c[23084+(d>>>12<<2)>>2]|0;g=f|d;do if(!h){if(!(g&1)){h=e[f+d>>1]|0;f=2;break}if(!(zf(d,1,0,0)|0)){h=c[5762]|0;f=2;break}else{j=-1;l=i;return j|0}}else{if(g&3)if(!(zf(d,2,0,0)|0))f=23048;else{j=-1;l=i;return j|0}else f=f+d|0;h=c[f>>2]|0;f=4}while(0);f=d+f|0;g=c[23084+(f>>>12<<2)>>2]|0;do if((g|f)&1)if(!(zf(f,1,0,0)|0)){f=c[5762]|0;break}else{j=-1;l=i;return j|0}else f=e[g+f>>1]|0;while(0);c[a>>2]=f;c[b>>2]=h;j=0;l=i;return j|0}function $g(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=c[(c[5766]|0)+176>>2]&-32|d>>>27&24;h=Ge(c[4202123]|0,g,0)|0;do if((((((h|0)!=0?(c[h+32>>2]|0)!=0:0)?(i=c[(c[h+40>>2]|0)+(g-(c[h+8>>2]|0))>>2]|0,!((i&1|0)==0&0==0)):0)?(k=i&-4096|d>>>18&4088,j=Ge(c[4202123]|0,k,0)|0,(j|0)!=0):0)?(c[j+32>>2]|0)!=0:0)?(n=(c[j+40>>2]|0)+(k-(c[j+8>>2]|0))|0,l=c[n>>2]|0,n=c[n+4>>2]|0,!((l&1|0)==0&0==0)):0)if(!(n>>>0>0|(n|0)==0&l>>>0>4294967295)){if((l&128|0)==0&0==0){if((l&32|0)==0&0==0){g=l|32;h=Ge(c[4202123]|0,k,0)|0;if((h|0)!=0?(c[h+32>>2]|0)!=0:0)c[(c[h+40>>2]|0)+(k-(c[h+8>>2]|0))>>2]=g}else g=l;i=g&-4096|d>>>9&4088;g=Ge(c[4202123]|0,i,0)|0;if(!g){g=0;break}if(!(c[g+32>>2]|0)){g=0;break}j=(c[g+40>>2]|0)+(i-(c[g+8>>2]|0))|0;h=c[j>>2]|0;j=c[j+4>>2]|0;if((h&1|0)==0&0==0){g=0;break}if(j>>>0>0|(j|0)==0&h>>>0>4294967295){g=8;break}m=4095;k=i;g=h&l}else{m=2097151;g=l;h=l;j=n}if((g&4|0)!=0?(o=g>>>1&1,((o^1)&e|0)==0):0){g=Il(h|0,j|0,6)|0;i=((g&1^1)&e|0)!=0;if((h&32|0)==0&0==0|i){f=h|96;e=Il(f|0,j|0,6)|0;h=i?f:h|32;g=i?e:g;i=Ge(c[4202123]|0,k,0)|0;if((i|0)!=0?(c[i+32>>2]|0)!=0:0)c[(c[i+40>>2]|0)+(k-(c[i+8>>2]|0))>>2]=h}c[a>>2]=h&~m|m&d;c[b>>2]=g&o;d=0;return d|0}else g=1}else g=8;else g=0;while(0);c[5746]=32;o=(c[5766]|0)+112|0;c[o>>2]=1024;c[o+4>>2]=0;o=(c[5766]|0)+120|0;c[o>>2]=e<<1|g|4;c[o+4>>2]=0;o=Jl(1,0,f+32|0)|0;b=(c[5766]|0)+120|0;e=b;a=c[e+4>>2]|y;c[b>>2]=c[e>>2]|o;c[b+4>>2]=a;b=(c[5766]|0)+128|0;c[b>>2]=d;c[b+4>>2]=0;d=-1;return d|0}function ah(b,d){b=b|0;d=d|0;var e=0;a[b+443>>0]=d;e=b+441|0;if(!((d|0)!=0&(a[e>>0]|0)!=0))return;d=c[b+536>>2]|0;if(!d)d=(c[b+60>>2]|0)>>>9&(a[b+544>>0]&1)&((a[b+442>>0]^1)&255);else{if(!(c[d+96>>2]&16777216))d=c[b+60>>2]|0;else d=c[(c[b+540>>2]|0)+1392>>2]|0;d=d>>>9&1}if(!d)return;a[e>>0]=0;return}function bh(a,b,d){a=a|0;b=b|0;d=d|0;switch(b|0){case 8:{c[a+32>>2]=d;return}case 9:{c[a+400>>2]=d;return}case 10:{c[a+404>>2]=d;return}case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{c[a+(b<<2)>>2]=d;return}default:return}}function ch(a,b){a=a|0;b=b|0;switch(b|0){case 8:{a=c[a+32>>2]|0;break}case 9:{a=c[a+400>>2]|0;break}case 10:{a=c[a+404>>2]|0;break}case 7:case 6:case 5:case 4:case 3:case 2:case 1:case 0:{a=c[a+(b<<2)>>2]|0;break}default:a=0}return a|0}function dh(a,d,f){a=a|0;d=d|0;f=f|0;if(d>>>0>9)return;c[a+212+(d<<4)+4>>2]=c[f+4>>2];c[a+212+(d<<4)+8>>2]=c[f+8>>2];if((d|1|0)!=9){c[a+212+(d<<4)>>2]=e[f>>1];c[a+212+(d<<4)+12>>2]=(b[f+2>>1]&-3841&65535)<<8}f=(c[a+256>>2]|0)>>>6&65536;c[a+388>>2]=(f^65536)+-1;c[a+396>>2]=(c[a+248>>2]|c[a+232>>2]|c[a+264>>2]|c[a+216>>2]|0)==0?f>>>16:0;c[a+392>>2]=(c[a+240>>2]&4194304|0)==0?384:0;return}function eh(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16785968>>2]=b;c[a+16785972>>2]=d;return}function fh(a,b,d){a=a|0;b=b|0;d=d|0;c[a+16785976>>2]=b;c[a+16785980>>2]=d;return}function gh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a+16785984>>2]=b;c[a+16785988>>2]=d;c[a+16785992>>2]=e;return}function hh(a){a=a|0;a=a+448|0;y=c[a+4>>2]|0;return c[a>>2]|0}function ih(a){a=a|0;return d[a+441>>0]|0|0}function jh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=a+548|0;e=c[d>>2]|0;if((e|0)<=0){c[d>>2]=0;return}b=0;do{f=c[a+16777772+(b<<2)>>2]|0;c[a+556+(f<<2)>>2]=-1;c[a+8389164+(f<<2)>>2]=-1;f=f+1048576|0;c[a+556+(f<<2)>>2]=-1;c[a+8389164+(f<<2)>>2]=-1;b=b+1|0}while((b|0)!=(e|0));c[d>>2]=0;return}function kh(d){d=d|0;var f=0,g=0;f=0;do{g=f>>>4^f;g=g>>>2^g;a[21168+f>>0]=(g>>>1^g)&1^1;f=f+1|0}while((f|0)!=256);f=0;do{a[21424+f>>0]=(f>>>0)%17|0;f=f+1|0}while((f|0)!=32);f=0;do{a[21456+f>>0]=(f>>>0)%9|0;f=f+1|0}while((f|0)!=32);c[4202123]=d;c[4202126]=6;c[4202127]=22528;c[4202128]=18;c[4202129]=16;c[4202130]=22528;c[5641]=0;c[5642]=0;c[5643]=0;c[5644]=0;c[5645]=0;c[5646]=1;c[5647]=2;c[5732]=1610612752;c[5733]=0;c[5734]=0;c[5735]=0;a[23072]=1;c[5740]=-61456;c[5741]=1024;c[5743]=-1;c[5746]=-1;c[5748]=-1;Nl(23084,-1,16777216)|0;c[5769]=0;a[22968]=0;c[5770]=0;c[5687]=65535;c[5695]=65535;c[5699]=65535;c[5703]=65535;c[5707]=65535;c[5711]=65535;c[5712]=32768;c[5715]=65535;c[5716]=32768;c[5719]=65535;c[5723]=65535;c[5689]=61440;c[5690]=-65536;c[5691]=65535;c[5692]=0;g=((c[5696]|0)>>>6&65536^65536)+-1|0;c[5640]=65520;c[5729]=g;c[5731]=0;c[5730]=384;b[11298]=0;c[5648]=0;b[11299]=895;g=22600;c[g>>2]=16843009;c[g+4>>2]=16843009;Yh(0,22736);g=(e[11299]|0)>>>8&255;Zh((g&3)==0?32:(g&3)==2?64:80,22736);return 22528}function lh(a){a=a|0;a=a+448|0;y=c[a+4>>2]|0;return c[a>>2]|0}function mh(a,b,c){a=a|0;b=b|0;c=c|0;return -1}function nh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function oh(a){a=a|0;return}function ph(a){a=a|0;c[a+188>>2]=1;return}function qh(e){e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0;A=l;l=l+64|0;r=A+40|0;q=A+32|0;g=A+24|0;z=A+52|0;m=A+48|0;p=A+44|0;t=A;f=c[e+8>>2]|0;if(fk(f,19670)|0){c[g>>2]=f;_e(19673,g);z=0;l=A;return z|0}f=e+16|0;x=f;w=c[x+4>>2]|0;if(!(w>>>0>0|(w|0)==0&(c[x>>2]|0)>>>0>1048575))ja(19698,19723,1972,19737);x=Le(280)|0;c[x>>2]=c[e+4>>2];u=f;s=c[u+4>>2]|0;v=x+24|0;n=v;c[n>>2]=c[u>>2];c[n+4>>2]=s;n=x+36|0;c[n>>2]=Ae()|0;s=Ae()|0;u=x+32|0;c[u>>2]=s;s=kh(s)|0;w=x+40|0;c[w>>2]=s;fh(s,7,x);gh(c[w>>2]|0,19,17,x);c[(c[u>>2]|0)+2584>>2]=x;c[(c[u>>2]|0)+2588>>2]=10;s=c[u>>2]|0;i=f;i=xl(c[i>>2]|0,c[i+4>>2]|0,-786432,-1)|0;$a[c[s+2568>>2]&15](s,786432,0,i,y,0)|0;i=c[u>>2]|0;$a[c[i+2568>>2]&15](i,0,0,655360,0,0)|0;He(c[n>>2]|0,128,0,2,0,x,20,18,1)|0;He(c[n>>2]|0,146,0,2,0,x,21,19,1)|0;i=c[e+204>>2]|0;if((i|0)>0){j=c[e+200>>2]|0;if(i&65535|0)ja(19753,19723,2018,19737);f=0-i|0;g=c[u>>2]|0;$a[c[g+2568>>2]&15](g,f,0,i,((i|0)<0)<<31>>31,1)|0;g=Ge(c[u>>2]|0,f,0)|0;if((g|0)!=0?(c[g+32>>2]|0)!=0:0)f=(c[g+40>>2]|0)+(f-(c[g+8>>2]|0))|0;else f=0;Ll(f|0,j|0,i|0)|0;h=(i|0)<131072?i:131072;f=1048576-h|0;g=Ge(c[u>>2]|0,f,((f|0)<0)<<31>>31)|0;if((g|0)!=0?(c[g+32>>2]|0)!=0:0)f=(c[g+40>>2]|0)+(f-(c[g+8>>2]|0))|0;else f=0;Ll(f|0,j+i+(0-h)|0,h|0)|0}i=x+48|0;s=x+44|0;c[s>>2]=Gh(c[n>>2]|0,32,160,1232,1233,8,x,i)|0;eh(c[w>>2]|0,8,x);g=c[n>>2]|0;f=Le(112)|0;c[f+104>>2]=i;h=f+100|0;c[h>>2]=9;o=f+108|0;c[o>>2]=x;c[f>>2]=f;a[f+13>>0]=3;a[f+15>>0]=1;sa(1,z|0)|0;j=c[z>>2]|0;j=Dl(j|0,((j|0)<0)<<31>>31|0,1193182,0)|0;k=y;B=c[z+4>>2]|0;B=Dl(B|0,((B|0)<0)<<31>>31|0,1193182,0)|0;B=Fl(B|0,y|0,1e9,0)|0;k=xl(B|0,y|0,j|0,k|0)|0;j=f+16|0;c[j>>2]=k;c[j+4>>2]=y;j=f+24|0;c[j>>2]=0;c[j+4>>2]=0;c[f+4>>2]=65536;c[f+32>>2]=f;a[f+45>>0]=3;a[f+47>>0]=1;j=Wa[c[h>>2]&15](c[o>>2]|0)|0;k=f+48|0;c[k>>2]=j;c[k+4>>2]=y;k=f+56|0;c[k>>2]=0;c[k+4>>2]=0;c[f+36>>2]=65536;c[f+64>>2]=f;a[f+77>>0]=3;a[f+79>>0]=0;o=Wa[c[h>>2]&15](c[o>>2]|0)|0;h=f+80|0;c[h>>2]=o;c[h+4>>2]=y;h=f+88|0;c[h>>2]=0;c[h+4>>2]=0;c[f+68>>2]=65536;a[f+96>>0]=0;He(g,64,0,4,0,f,22,20,1)|0;He(g,97,0,1,0,f,23,21,1)|0;c[x+240>>2]=f;f=c[n>>2]|0;g=c[e+28>>2]|0;h=Le(148)|0;c[h+136>>2]=g;a[h>>0]=0;a[h+11>>0]=38;a[h+12>>0]=2;a[h+13>>0]=0;a[h+14>>0]=-128;Nh(h,1);c[h+132>>2]=x+144;He(f,112,0,2,0,h,24,22,1)|0;f=x+248|0;c[f>>2]=h;g=v;g=xl(c[g>>2]|0,c[g+4>>2]|0,-1048576,1023)|0;g=Il(g|0,y|0,10)|0;g=(g|0)<65535?g:65535;a[h+49>>0]=g;a[h+50>>0]=(g&65535)>>>8;h=v;g=c[h>>2]|0;h=c[h+4>>2]|0;if(h>>>0>0|(h|0)==0&g>>>0>16777215){o=xl(g|0,h|0,-16777216,65535)|0;o=Il(o|0,y|0,16)|0;o=(o|0)<65535?o:65535;B=c[f>>2]|0;a[B+53>>0]=o;a[B+54>>0]=(o&65535)>>>8}a[(c[f>>2]|0)+21>>0]=6;o=x+244|0;c[o>>2]=_d(p,m,c[u>>2]|0,c[n>>2]|0,i)|0;f=e+44|0;c[x+12>>2]=c[f>>2];c[t>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t>>2]=c[p>>2];f=c[f>>2]|0;if(f|0)c[x+8>>2]=cc(t,f)|0;i=e+96|0;g=c[i>>2]|0;if((g|0)>0){j=z+4|0;k=x+216|0;f=0;do{h=c[e+48+(f*12|0)>>2]|0;if((h|0)!=0?(fk(h,19796)|0)!=0:0){if(!(fk(h,19803)|0)){h=f+1|0;c[z>>2]=c[e+48+(f*12|0)+8>>2];c[j>>2]=0;if((h|0)<(g|0)){c[j>>2]=c[e+48+(h*12|0)+8>>2];f=f+2|0}else f=h;Ti(c[n>>2]|0,496,1014,k,z)|0;fj(c[p>>2]|0,(c[m>>2]|0)+1|0)|0}}else{Db(t,c[e+48+(f*12|0)+8>>2]|0)|0;f=f+1|0}g=c[i>>2]|0}while((f|0)<(g|0))}g=e+164|0;if((c[g>>2]|0)>0){f=0;do{kc(t,c[e+100+(f<<4)+12>>2]|0,c[e+100+(f<<4)+4>>2]|0)|0;f=f+1|0}while((f|0)<(c[g>>2]|0))}f=e+32|0;do if(c[f>>2]|0){g=Le(28)|0;c[x+16>>2]=g;f=c[f>>2]|0;if(!(fk(f,19807)|0)){Cj(c[p>>2]|0,g,c[e+36>>2]|0,c[e+40>>2]|0,c[e+212>>2]|0,c[e+216>>2]|0)|0;break}if(!(fk(f,19811)|0)){Od(c[u>>2]|0,-264241152,0,g,c[e+36>>2]|0,c[e+40>>2]|0)|0;break}else{c[q>>2]=f;_e(19820,q);Da(1)}}while(0);f=c[e+192>>2]|0;do if(f|0){if(!(fk(f,19796)|0)){c[x+256>>2]=hc(t,0)|0;c[x+260>>2]=hc(t,2)|0;break}if(!(fk(f,19852)|0)){B=x+268|0;c[x+264>>2]=uj(x+276|0,B,c[n>>2]|0,x+60|0,x+192|0,96)|0;He(c[n>>2]|0,22104,0,1,0,x,25,23,4)|0;c[x+272>>2]=tj(c[B>>2]|0)|0;break}else{c[r>>2]=f;_e(19856,r);Da(1)}}while(0);g=e+180|0;if((c[g>>2]|0)>0){h=x+4|0;f=0;do{B=e+168+(f*12|0)+8|0;Vb(t,c[B>>2]|0)|0;c[h>>2]=c[B>>2];f=f+1|0}while((f|0)<(c[g>>2]|0))}m=c[e+224>>2]|0;if(m|0){h=c[e+228>>2]|0;k=c[e+184>>2]|0;k=(k|0)==0?16809164:k;if((h|0)<1024){B=c[3662]|0;ll(19886,17,1,B)|0;Da(1)}if((a[m+510>>0]|0)!=85){B=c[3662]|0;ll(19904,21,1,B)|0;Da(1)}if((a[m+511>>0]|0)!=-86){B=c[3662]|0;ll(19904,21,1,B)|0;Da(1)}j=m+497|0;i=a[j>>0]|0;i=i<<24>>24==0?2560:((i&255)<<9)+512|0;if((h|0)<(i|0)){B=c[3662]|0;ll(19886,17,1,B)|0;Da(1)}if(Zk(m+514|0,19926,4)|0){ll(19931,15,1,c[3662]|0)|0;Da(1)}f=Ge(c[u>>2]|0,1048576,0)|0;if((f|0)!=0?(c[f+32>>2]|0)!=0:0)g=(c[f+40>>2]|0)+(1048576-(c[f+8>>2]|0))|0;else g=0;f=h-i|0;e=((f|0)<0)<<31>>31;B=v;B=xl(c[B>>2]|0,c[B+4>>2]|0,-1048576,-1)|0;t=y;if(t>>>0<e>>>0|(t|0)==(e|0)&B>>>0<f>>>0){ll(19947,15,1,c[3662]|0)|0;Da(1)}Ll(g|0,m+i|0,f|0)|0;f=Ge(c[u>>2]|0,589824,0)|0;do if(!f)g=0;else{if(!(c[f+32>>2]|0)){g=0;break}g=(c[f+40>>2]|0)+(589824-(c[f+8>>2]|0))|0}while(0);Nl(g|0,0,4256)|0;Ll(g+497|0,j|0,(d[m+513>>0]|0)+17|0)|0;hk(g+2176|0,k)|0;B=g+498|0;a[B>>0]=0;a[B+1>>0]=0;B=g+552|0;a[B>>0]=128;a[B+1>>0]=8;a[B+2>>0]=9;a[B+3>>0]=0;B=v;B=Il(c[B>>2]|0,c[B+4>>2]|0,10)|0;B=B+-1024|0;f=g+480|0;a[f>>0]=B;a[f+1>>0]=B>>8;a[f+2>>0]=B>>16;a[f+3>>0]=B>>24;a[g+528>>0]=1;a[g+14>>0]=0;a[g+7>>0]=0;f=c[x+16>>2]|0;if(f|0){a[g+15>>0]=35;B=g+22|0;a[B>>0]=32;a[B+1>>0]=0;a[g+38>>0]=8;a[g+39>>0]=16;a[g+40>>0]=8;a[g+41>>0]=8;a[g+42>>0]=8;a[g+43>>0]=0;a[g+44>>0]=8;a[g+45>>0]=24;B=c[f>>2]&65535;v=g+18|0;a[v>>0]=B;a[v+1>>0]=B>>8;v=c[f+4>>2]&65535;B=g+20|0;a[B>>0]=v;a[B+1>>0]=v>>8;B=c[f+8>>2]&65535;v=g+36|0;a[v>>0]=B;a[v+1>>0]=B>>8;v=c[f+16>>2]|0;B=g+28|0;a[B>>0]=v;a[B+1>>0]=v>>8;a[B+2>>0]=v>>16;a[B+3>>0]=v>>24;B=g+24|0;a[B>>0]=-264241152;a[B+1>>0]=-264241152>>8;a[B+2>>0]=-264241152>>16;a[B+3>>0]=-264241152>>24}B=g+4240|0;f=B;a[f>>0]=255;a[f+1>>0]=255;a[f+2>>0]=0;a[f+3>>0]=0;B=B+4|0;a[B>>0]=0;a[B+1>>0]=155;a[B+2>>0]=207;a[B+3>>0]=0;B=g+4248|0;f=B;a[f>>0]=255;a[f+1>>0]=255;a[f+2>>0]=0;a[f+3>>0]=0;B=B+4|0;a[B>>0]=0;a[B+1>>0]=147;a[B+2>>0]=207;a[B+3>>0]=0;B=ch(c[w>>2]|0,9)|0;bh(c[w>>2]|0,9,B|1);B=z+4|0;c[B>>2]=594048;f=z+8|0;c[f>>2]=31;dh(c[w>>2]|0,8,z);b[z>>1]=16;c[B>>2]=0;c[f>>2]=-1;f=z+2|0;b[f>>1]=-16229;dh(c[w>>2]|0,1,z);b[z>>1]=24;b[f>>1]=-16237;dh(c[w>>2]|0,0,z);dh(c[w>>2]|0,2,z);dh(c[w>>2]|0,3,z);dh(c[w>>2]|0,4,z);dh(c[w>>2]|0,5,z);bh(c[w>>2]|0,8,1048576);bh(c[w>>2]|0,6,589824);ge(c[o>>2]|0,z,19963);f=c[s>>2]|0;if(f|0){B=c[f>>2]|0;a[B+12>>0]=a[B+13>>0]&a[z>>0];B=c[f+4>>2]|0;a[B+12>>0]=a[B+13>>0]&a[z+1>>0]}}B=x;l=A;return B|0}function rh(a){a=a|0;Fe(c[a+32>>2]|0);Fe(c[a+36>>2]|0);Uj(a);return}function sh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;g=c[b+248>>2]|0;if(a[g+12>>0]&64?(sa(1,f|0)|0,j=c[f>>2]<<15,k=c[f+4>>2]|0,k=Jl(k|0,((k|0)<0)<<31>>31|0,15)|0,k=Fl(k|0,y|0,1e9,0)|0,e=g+140|0,(j-(c[e>>2]|0)+k|0)>-1):0){k=g+13|0;a[k>>0]=a[k>>0]|-64;k=c[g+132>>2]|0;fb[c[k>>2]&15](c[k+4>>2]|0,c[k+8>>2]|0,1);c[e>>2]=(c[e>>2]|0)+(c[g+144>>2]|0)}j=c[b+240>>2]|0;h=c[j>>2]|0;h=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;g=j+16|0;g=yl(h|0,y|0,c[g>>2]|0,c[g+4>>2]|0)|0;h=y;k=j+24|0;f=k;e=c[f>>2]|0;f=c[f+4>>2]|0;if((a[j+13>>0]&-2)<<24>>24==2){i=j+4|0;n=c[i>>2]|0;f=yl(e|0,f|0,g|0,h|0)|0;f=xl(f|0,y|0,n|0,0)|0;e=y;if((e|0)<0|(e|0)==0&f>>>0<1){j=j+104|0;n=c[j>>2]|0;fb[c[n>>2]&15](c[n+4>>2]|0,c[n+8>>2]|0,1);j=c[j>>2]|0;fb[c[j>>2]&15](c[j+4>>2]|0,c[j+8>>2]|0,0);j=k;j=xl(c[j>>2]|0,c[j+4>>2]|0,c[i>>2]|0,0)|0;n=k;c[n>>2]=j;c[n+4>>2]=y;n=0;k=(n|0)>(d|0);n=k?d:n;d=b+40|0;d=c[d>>2]|0;d=ih(d)|0;d=(d|0)==0;n=d?0:n;l=m;return n|0}}else if((e|0)==0&(f|0)==0){f=yl(c[j+4>>2]|0,0,g|0,h|0)|0;e=y;if((e|0)<0|(e|0)==0&f>>>0<1){n=j+104|0;j=c[n>>2]|0;fb[c[j>>2]&15](c[j+4>>2]|0,c[j+8>>2]|0,1);n=c[n>>2]|0;fb[c[n>>2]&15](c[n+4>>2]|0,c[n+8>>2]|0,0);n=k;c[n>>2]=g;c[n+4>>2]=h;n=0;k=(n|0)>(d|0);n=k?d:n;d=b+40|0;d=c[d>>2]|0;d=ih(d)|0;d=(d|0)==0;n=d?0:n;l=m;return n|0}}else{f=1193182;e=0}n=Fl(f|0,e|0,1193,0)|0;k=(n|0)>(d|0);n=k?d:n;d=b+40|0;d=c[d>>2]|0;d=ih(d)|0;d=(d|0)==0;n=d?0:n;l=m;return n|0}function th(a,b){a=a|0;b=b|0;of(c[a+40>>2]|0,b);return}function uh(a){a=a|0;if(c[a+260>>2]|0){a=1;return a|0}a=c[a+272>>2]|0;if(!a){a=0;return a|0}a=sj(a)|0;return a|0}function vh(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+260>>2]|0;if(g|0){gc(g,b,d,e,f)|0;return}a=c[a+272>>2]|0;if(!a)return;qj(a,b,d,e,f);return}function wh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+256>>2]|0;if(e|0){ec(e,b,d)|0;return}a=c[a+276>>2]|0;if(!a)return;hj(a,b,d&65535);return}function xh(a){a=a|0;a=hh(c[a+40>>2]|0)|0;return a|0}function yh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=Ge(c[a+36>>2]|0,b,0)|0;if(!e){d=-1;return d|0}a=b-(c[e+8>>2]|0)|0;b=c[e+76>>2]|0;if(b&1<<d|0){d=Ya[c[e+68>>2]&63](c[e+64>>2]|0,a,d)|0;return d|0}if((d|0)!=1|(b&1|0)==0){d=-1;return d|0}b=e+68|0;e=e+64|0;d=(Ya[c[b>>2]&63](c[e>>2]|0,a,0)|0)&255;d=(Ya[c[b>>2]&63](c[e>>2]|0,a+1|0,0)|0)<<8&65280|d;return d|0}function zh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Ge(c[a+36>>2]|0,b,0)|0;if(!f)return;a=b-(c[f+8>>2]|0)|0;b=c[f+76>>2]|0;if(b&1<<e|0){gb[c[f+72>>2]&63](c[f+64>>2]|0,a,d,e);return}if((e|0)!=1|(b&1|0)==0)return;b=f+72|0;e=f+64|0;gb[c[b>>2]&63](c[e>>2]|0,a,d&255,0);gb[c[b>>2]&63](c[e>>2]|0,a+1|0,d>>>8&255,0);return}function Ah(a,b,d){a=a|0;b=b|0;d=d|0;jh(c[a+40>>2]|0,b,d);return}function Bh(a,b,c){a=a|0;b=b|0;c=c|0;return 255}function Ch(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Dh(a,b,c){a=a|0;b=b|0;c=c|0;return 2}function Eh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Fh(a,b){a=a|0;b=b|0;ah(c[a+40>>2]|0,b);return}function Gh(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0;k=Le(24)|0;Ke(j,11,k,0);Ke(j+12|0,11,k,1);Ke(j+24|0,11,k,2);Ke(j+36|0,11,k,3);Ke(j+48|0,11,k,4);Ke(j+60|0,11,k,5);Ke(j+72|0,11,k,6);Ke(j+84|0,11,k,7);Ke(j+96|0,11,k,8);Ke(j+108|0,11,k,9);Ke(j+120|0,11,k,10);Ke(j+132|0,11,k,11);Ke(j+144|0,11,k,12);Ke(j+156|0,11,k,13);Ke(j+168|0,11,k,14);Ke(j+180|0,11,k,15);c[k+12>>2]=h;c[k+16>>2]=i;j=Le(24)|0;a[j+13>>0]=-8;c[j+16>>2]=9;c[j+20>>2]=k;He(b,d,((d|0)<0)<<31>>31,2,0,j,26,24,1)|0;He(b,f,((f|0)<0)<<31>>31,1,0,j,27,25,1)|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[k>>2]=j;j=Le(24)|0;a[j+13>>0]=-34;c[j+16>>2]=9;c[j+20>>2]=k;He(b,e,((e|0)<0)<<31>>31,2,0,j,26,24,1)|0;He(b,g,((g|0)<0)<<31>>31,1,0,j,27,25,1)|0;c[j>>2]=0;c[j+4>>2]=0;c[j+8>>2]=0;c[k+4>>2]=j;c[k+8>>2]=0;return k|0}function Hh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;n=c[b+44>>2]|0;j=c[n>>2]|0;k=j+1|0;l=a[k>>0]|0;m=l&~a[j+2>>0];b=m&255;if(m<<24>>24){h=j+4|0;e=d[h>>0]|0;i=7;while(1)if(!(1<<(i+e&7)&b))i=i+-1|0;else break;if((i|0)>=0){f=j+3|0;m=a[f>>0]|0;g=m&255;if(!(m<<24>>24))b=-1;else{b=7;while(1)if(!(1<<(b+e&7)&g))b=b+-1|0;else break}if((i|0)>-1&(i|0)>(b|0)){if(a[j+9>>0]|0){if(a[j+10>>0]|0)a[h>>0]=i+1&7}else a[f>>0]=1<<i|g;b=1<<i;if(!(b&d[j+12>>0]))a[k>>0]=(b^255)&(l&255);if((i|0)!=2){l=i;m=a[(c[n>>2]|0)+5>>0]|0;m=m&255;m=l+m|0;Sh(n);return m|0}m=n+4|0;j=c[m>>2]|0;k=j+1|0;l=a[k>>0]|0;i=l&~a[j+2>>0];e=i&255;if(i<<24>>24){i=j+4|0;f=d[i>>0]|0;b=7;while(1)if(!(1<<(b+f&7)&e))b=b+-1|0;else break;if((b|0)>=0){g=j+3|0;e=a[g>>0]|0;h=e&255;if(!(e<<24>>24))e=-1;else{e=7;while(1)if(!(1<<(e+f&7)&h))e=e+-1|0;else break}if((b|0)>-1&(b|0)>(e|0)){if(a[j+9>>0]|0){if(a[j+10>>0]|0)a[i>>0]=b+1&7}else a[g>>0]=1<<b|h;e=1<<b;if(!(e&d[j+12>>0]))a[k>>0]=(e^255)&(l&255)}else b=7}else b=7}else b=7;l=b;m=a[(c[m>>2]|0)+5>>0]|0;m=m&255;m=l+m|0;Sh(n);return m|0}}}l=d[j+5>>0]|0;m=7;m=m&255;m=l+m|0;Sh(n);return m|0}function Ih(a){a=a|0;var b=0,d=0,e=0;b=l;l=l+16|0;e=b;sa(1,e|0)|0;d=c[e>>2]|0;d=Dl(d|0,((d|0)<0)<<31>>31|0,1193182,0)|0;a=y;e=c[e+4>>2]|0;e=Dl(e|0,((e|0)<0)<<31>>31|0,1193182,0)|0;e=Fl(e|0,y|0,1e9,0)|0;a=xl(e|0,y|0,d|0,a|0)|0;l=b;return a|0}function Jh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;e=d&3;if((e|0)==3){f=255;return f|0}f=b+(e<<5)+12|0;d=a[f>>0]|0;if((d&255)>=4){b=c[b+(e<<5)+8>>2]|0;a[f>>0]=d^1;f=(d&1)==0?b&255:b>>>8;return f|0}g=c[b+(e<<5)>>2]|0;g=Wa[c[g+100>>2]&15](c[g+108>>2]|0)|0;d=b+(e<<5)+16|0;d=yl(g|0,y|0,c[d>>2]|0,c[d+4>>2]|0)|0;switch(a[b+(e<<5)+13>>0]|0){case 5:case 4:case 1:case 0:{d=(c[b+(e<<5)+4>>2]|0)-d&65535;break}default:{g=c[b+(e<<5)+4>>2]|0;d=g-(Gl(d|0,y|0,g|0,0)|0)|0}}e=a[f>>0]|0;d=((e&1)==0?d:d>>>8)&255;e=e&255;if(!(e&2)){g=d;return g|0}a[f>>0]=e^1;g=d;return g|0}function Kh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;f=d&3;if((f|0)==3){f=e>>>6;if((f|0)==3)return;d=e>>>4&3;if(d|0){a[b+(f<<5)+13>>0]=e>>>1&7;a[b+(f<<5)+14>>0]=e&1;a[b+(f<<5)+12>>0]=d+255;return}e=c[b+(f<<5)>>2]|0;e=Wa[c[e+100>>2]&15](c[e+108>>2]|0)|0;d=b+(f<<5)+16|0;d=yl(e|0,y|0,c[d>>2]|0,c[d+4>>2]|0)|0;switch(a[b+(f<<5)+13>>0]|0){case 5:case 4:case 1:case 0:{d=(c[b+(f<<5)+4>>2]|0)-d&65535;break}default:{e=c[b+(f<<5)+4>>2]|0;d=e-(Gl(d|0,y|0,e|0,0)|0)|0}}c[b+(f<<5)+8>>2]=d;a[b+(f<<5)+12>>0]=4;return}g=b+(f<<5)|0;i=b+(f<<5)+12|0;d=a[i>>0]|0;switch(d<<24>>24){case 0:{h=c[g>>2]|0;i=b+(f<<5)+16|0;c[i>>2]=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;c[i+4>>2]=y;i=b+(f<<5)+24|0;c[i>>2]=0;c[i+4>>2]=0;c[b+(f<<5)+4>>2]=(e|0)==0?65536:e;return}case 1:{e=e<<8;h=c[g>>2]|0;i=b+(f<<5)+16|0;c[i>>2]=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;c[i+4>>2]=y;i=b+(f<<5)+24|0;c[i>>2]=0;c[i+4>>2]=0;c[b+(f<<5)+4>>2]=(e|0)==0?65536:e;return}case 3:case 2:{h=b+(f<<5)+8|0;if(!(d&1))c[h>>2]=e;else{d=c[h>>2]&255|e<<8;h=c[g>>2]|0;h=Wa[c[h+100>>2]&15](c[h+108>>2]|0)|0;e=b+(f<<5)+16|0;c[e>>2]=h;c[e+4>>2]=y;e=b+(f<<5)+24|0;c[e>>2]=0;c[e+4>>2]=0;c[b+(f<<5)+4>>2]=(d|0)==0?65536:d;d=a[i>>0]|0}a[i>>0]=d^1;return}default:return}}function Lh(b,e,f){b=b|0;e=e|0;f=f|0;var g=0;f=c[b+64>>2]|0;f=Wa[c[f+100>>2]&15](c[f+108>>2]|0)|0;e=b+80|0;e=yl(f|0,y|0,c[e>>2]|0,c[e+4>>2]|0)|0;f=y;switch(a[b+77>>0]|0){case 4:case 5:{e=(f|0)==0?(e|0)==(c[b+68>>2]|0):0;break}case 1:{e=(f|0)<0|((f|0)==0?e>>>0<(c[b+68>>2]|0)>>>0:0);break}case 2:{e=((e|0)!=0|(f|0)!=0)&((El(e|0,f|0,c[b+68>>2]|0,0)|0)==0&(y|0)==0);break}case 3:{g=c[b+68>>2]|0;e=El(e|0,f|0,g|0,0)|0;f=y;e=(f|0)<0|(f|0)==0&e>>>0<g>>>1>>>0;break}default:e=(f|0)>0|((f|0)==0?e>>>0>=(c[b+68>>2]|0)>>>0:0)}return (e&1)<<5|d[b+79>>0]|d[b+96>>0]<<1|0}function Mh(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;a[b+96>>0]=d>>>1&1;a[b+79>>0]=d&1;return}function Nh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;n=l;l=l+64|0;m=n+48|0;j=n+4|0;e=n;Oa(m|0,0)|0;c[e>>2]=c[m>>2];if(!(c[b+136>>2]|0))Pa(e|0,j|0)|0;else Qa(e|0,j|0)|0;e=c[j>>2]|0;g=a[b+12>>0]|0;k=(g&4)==0;if(k){i=(e>>>0)/10|0;h=c[j+4>>2]|0;f=(h>>>0)/10|0;f=f<<4|h-(f*10|0);e=i<<4|e-(i*10|0)}else f=c[j+4>>2]|0;a[b+1>>0]=e;a[b+3>>0]=f;e=c[j+8>>2]|0;if(!(g&2)){f=(e|0)%12|0;if(k){i=(f>>>0)/10|0;f=i<<4|f-(i*10|0)}g=b+5|0;a[g>>0]=f;if((e|0)>11)a[g>>0]=f|128}else{if(k){i=(e>>>0)/10|0;e=i<<4|e-(i*10|0)}a[b+5>>0]=e}e=c[j+24>>2]|0;if(k){o=(e>>>0)/10|0;p=c[j+12>>2]|0;g=(p>>>0)/10|0;q=(c[j+16>>2]|0)+1|0;i=(q>>>0)/10|0;f=c[j+20>>2]|0;j=(f|0)%100|0;h=(j>>>0)/10|0;h=h<<4|j-(h*10|0);i=i<<4|q-(i*10|0);g=g<<4|p-(g*10|0);e=o<<4|e-(o*10|0)}else{f=c[j+20>>2]|0;h=(f|0)%100|0;i=(c[j+16>>2]|0)+1|0;g=c[j+12>>2]|0}a[b+7>>0]=e;a[b+8>>0]=g;a[b+9>>0]=i;a[b+10>>0]=h;if(!d){m=m+4|0;m=c[m>>2]|0;m=(m|0)<244;q=b+11|0;o=a[q>>0]|0;o=o&255;p=o&127;o=o|128;p=m?o:p;p=p&255;a[q>>0]=p;l=n;return}e=((f|0)/100|0)+19|0;if(k){q=(e>>>0)/10|0;e=q<<4|e-(q*10|0)}q=e&255;a[b+51>>0]=q;a[b+56>>0]=q;m=m+4|0;m=c[m>>2]|0;m=(m|0)<244;q=b+11|0;o=a[q>>0]|0;o=o&255;p=o&127;o=o|128;p=m?o:p;p=p&255;a[q>>0]=p;l=n;return}function Oh(b,e,f){b=b|0;e=e|0;f=f|0;a:do if(!e)e=-1;else{f=a[b>>0]|0;e=f&255;switch(f<<24>>24){case 10:case 9:case 8:case 7:case 6:case 4:case 2:case 0:{Nh(b,0);e=a[b+1+(d[b>>0]|0)>>0]|0;break a}case 12:{e=a[b+1+e>>0]|0;a[b+13>>0]=0;b=c[b+132>>2]|0;fb[c[b>>2]&15](c[b+4>>2]|0,c[b+8>>2]|0,0);break a}default:{e=a[b+1+e>>0]|0;break a}}}while(0);return e&255|0}function Ph(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;h=l;l=l+16|0;g=h;if(!d){a[b>>0]=e&127;l=h;return}d=a[b>>0]|0;f=d&255;switch(d<<24>>24){case 10:{d=b+11|0;f=(e&127|a[d>>0]&-128&255)&255;a[d>>0]=f;f=f&15;d=f&255;if(!((a[b+12>>0]&64)!=0&f<<24>>24!=0)){l=h;return}i=b+144|0;c[i>>2]=1<<((f&255)<3?d+7|0:d)+-1;sa(1,g|0)|0;d=c[g>>2]<<15;e=c[g+4>>2]|0;e=Fl(Jl(e|0,((e|0)<0)<<31>>31|0,15)|0,y|0,1e9,0)|0;g=c[i>>2]|0;c[b+140>>2]=g+d+e&0-g;l=h;return}case 11:{a[b+1+f>>0]=e;f=a[b+11>>0]&15;d=f&255;if(!(f<<24>>24!=0&(a[b+12>>0]&64)!=0)){l=h;return}i=b+144|0;c[i>>2]=1<<((f&255)<3?d+7|0:d)+-1;sa(1,g|0)|0;e=c[g>>2]<<15;g=c[g+4>>2]|0;g=Fl(Jl(g|0,((g|0)<0)<<31>>31|0,15)|0,y|0,1e9,0)|0;i=c[i>>2]|0;c[b+140>>2]=i+e+g&0-i;l=h;return}default:{a[b+1+f>>0]=e;l=h;return}}}function Qh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;k=l;l=l+32|0;g=k;h=a+40|0;i=ch(c[h>>2]|0,0)|0;c[g>>2]=i;j=g+4|0;c[j>>2]=ch(c[h>>2]|0,3)|0;b=g+8|0;c[b>>2]=ch(c[h>>2]|0,1)|0;d=g+12|0;c[d>>2]=ch(c[h>>2]|0,2)|0;e=g+16|0;c[e>>2]=ch(c[h>>2]|0,6)|0;f=g+20|0;c[f>>2]=ch(c[h>>2]|0,7)|0;if((i|0)!=1447909480){a=i;l=k;return a|0}rj(c[a+272>>2]|0,g);bh(c[h>>2]|0,0,c[g>>2]|0);bh(c[h>>2]|0,3,c[j>>2]|0);bh(c[h>>2]|0,1,c[b>>2]|0);bh(c[h>>2]|0,2,c[d>>2]|0);bh(c[h>>2]|0,6,c[e>>2]|0);bh(c[h>>2]|0,7,c[f>>2]|0);a=c[g>>2]|0;l=k;return a|0}function Rh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return}function Sh(b){b=b|0;var e=0,f=0,g=0,h=0,i=0;e=c[b+4>>2]|0;h=a[e+1>>0]&~a[e+2>>0];f=h&255;do if(h<<24>>24){g=d[e+4>>0]|0;h=7;while(1)if(!(1<<(h+g&7)&f))h=h+-1|0;else break;if((h|0)>=0){e=a[e+3>>0]|0;f=e&255;if(!(e<<24>>24))e=-1;else{e=7;while(1)if(!(1<<(e+g&7)&f))e=e+-1|0;else break}if((h|0)>-1&(h|0)>(e|0)){e=c[b>>2]|0;if(!(a[e+12>>0]&4)){f=d[e>>0]|0;if(!(f&4)){h=e+1|0;a[h>>0]=a[h>>0]|4}a[e>>0]=f|4}else{h=e+1|0;a[h>>0]=a[h>>0]|4;a[e>>0]=a[e>>0]|4}e=c[b>>2]|0;if(!(a[e+12>>0]&4)){a[e>>0]=a[e>>0]&-5;break}else{h=e+1|0;a[h>>0]=a[h>>0]&-5;a[e>>0]=a[e>>0]&-5;break}}}}while(0);e=c[b>>2]|0;h=a[e+1>>0]&~a[e+2>>0];f=h&255;if(h<<24>>24){g=d[e+4>>0]|0;h=7;while(1)if(!(1<<(h+g&7)&f))h=h+-1|0;else break;if((h|0)>=0){e=a[e+3>>0]|0;f=e&255;if(!(e<<24>>24))e=-1;else{e=7;while(1)if(!(1<<(e+g&7)&f))e=e+-1|0;else break}if((h|0)>(e|0)){f=c[b+12>>2]|0;e=c[b+16>>2]|0;if((h|0)>-1){eb[f&15](e,1);return}}else i=25}else i=25}else i=25;if((i|0)==25){f=c[b+12>>2]|0;e=c[b+16>>2]|0}eb[f&15](e,0);return}function Th(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;h=c[b+(e>>3<<2)>>2]|0;g=1<<(e&7);e=(f|0)!=0;do if(g&(d[h+12>>0]|0))if(e){f=h+1|0;a[f>>0]=g|(d[f>>0]|0);f=h;e=g|(d[h>>0]|0);break}else{e=~g;f=h+1|0;a[f>>0]=(d[f>>0]|0)&e;f=h;e=(d[h>>0]|0)&e;break}else{if(!e){f=h;e=(g^255)&(d[h>>0]|0);break}e=d[h>>0]|0;if(!(g&e)){f=h+1|0;a[f>>0]=g|(d[f>>0]|0)}f=h;e=g|e}while(0);a[f>>0]=e;Sh(b);return}function Uh(b,c,e){b=b|0;c=c|0;e=e|0;do if(!(c&1))if(!(a[b+6>>0]|0)){b=b+1|0;break}else{b=b+3|0;break}else b=b+2|0;while(0);return d[b>>0]|0}function Vh(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;if(e&1|0){e=b+8|0;switch(a[e>>0]|0){case 0:{a[b+2>>0]=f;db[c[b+16>>2]&15](c[b+20>>2]|0);return}case 1:{a[b+5>>0]=f&248;a[e>>0]=2;return}case 2:if(!(a[b+11>>0]|0)){a[e>>0]=0;return}else{a[e>>0]=3;return}case 3:{a[b+9>>0]=f>>>1&1;a[e>>0]=0;return}default:return}}if(f&16|0){c[b>>2]=0;c[b+4>>2]=0;c[b+8>>2]=0;a[b+8>>0]=1;a[b+11>>0]=f&1;if(f&2|0)ra();if(!(f&8))return;else ra()}if(f&8|0){if(f&2|0)a[b+6>>0]=f&1;if(!(f&64))return;a[b+7>>0]=f>>>5&1;return}switch(f|0){case 128:case 0:{a[b+10>>0]=f>>>7;return}case 160:case 32:{g=b+3|0;j=a[g>>0]|0;h=j&255;if(j<<24>>24){i=d[b+4>>0]|0;e=7;while(1){j=1<<(e+i&7);if(!(j&h))e=e+-1|0;else break}if((e|0)>-1)a[g>>0]=(j^255)&h}if((f|0)!=160)return;f=b+4|0;a[f>>0]=(a[f>>0]|0)+1&7;return}case 103:case 102:case 101:case 100:case 99:case 98:case 97:case 96:{b=b+3|0;a[b>>0]=(1<<(f&7)^255)&d[b>>0];return}case 199:case 198:case 197:case 196:case 195:case 194:case 193:case 192:{a[b+4>>0]=f+1&7;return}case 231:case 230:case 229:case 228:case 227:case 226:case 225:case 224:{j=b+3|0;a[j>>0]=(1<<(f&7)^255)&d[j>>0];a[b+4>>0]=f+1&7;return}default:return}}function Wh(a,b,c){a=a|0;b=b|0;c=c|0;return d[a+12>>0]|0|0}function Xh(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;a[b+12>>0]=(d[b+13>>0]|0)&e;return}function Yh(b,c){b=b|0;c=c|0;a[c+1>>0]=b;return}function Zh(b,c){b=b|0;c=c|0;a[c+3>>0]=b;return}function _h(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=a[e+1>>0]|0;i=f<<24>>24==0;do if(!i)if(f<<24>>24!=3)if(!(b<<24>>24)){h=f<<24>>24==1?0:127;break}else{h=f<<24>>24==2?0:127;break}else h=0;else h=64;while(0);f=d&127;a:do if((c&65535)>>>0>252){do if((c|0)<=253){if((c|0)==253)if(((h&255)+d|0)<0)break;else{g=f;c=253;f=d;break a}if((c|0)>=0){g=f;f=d;break a}if((c|0)>-32)f=d>>>(0-c|0)|(d<<(c&31)|0)!=0;else f=(d|0)!=0&1;j=f&127;g=j&255;if((j|0)==0|(((h&255)+d|0)>-1|((c|0)!=-1|(a[e>>0]|0)==1))^1){c=0;break a}c=e+2|0;a[c>>0]=a[c>>0]|16;c=0;break a}while(0);i=e+2|0;a[i>>0]=a[i>>0]|40;i=(b&255)<<31|2139095040;j=(h<<24>>24==0)<<31>>31;j=i+j|0;return j|0}else{g=f;f=d}while(0);if(g<<24>>24){j=e+2|0;a[j>>0]=a[j>>0]|32}j=(f+(h&255)|0)>>>7&~(i&g<<24>>24==64&1);i=j|(b&255)<<31;j=(j|0)==0?0:c<<23;j=i+j|0;return j|0}function $h(a,e,f){a=a|0;e=e|0;f=f|0;var g=0,h=0,i=0;if(!e){e=0;i=0;g=0;f=a;h=f;c[h>>2]=i;f=f+4|0;c[f>>2]=g;f=a+8|0;b[f>>1]=e;return}g=e>>>31;e=(g|0)==0?e:0-e|0;h=e>>>0<65536;f=h?e<<16:e;h=h?16:0;i=f>>>0<16777216;h=((d[10416+((i?f<<8:f)>>>24)>>0]|0)+((i?h|8:h)&255)<<24)+536870912>>24;e=Jl(e|0,0,h|0)|0;h=(g<<15|16446)-h&65535;g=y;i=a;f=i;c[f>>2]=e;i=i+4|0;c[i>>2]=g;i=a+8|0;b[i>>1]=h;return}function ai(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=a[f+1>>0]|0;m=g<<24>>24==0;do if(!m)if(g<<24>>24!=3)if(!(b<<24>>24)){l=g<<24>>24==1?0:1023;break}else{l=g<<24>>24==2?0:1023;break}else l=0;else l=512;while(0);g=d&1023;a:do if((c&65535)>>>0>2044){do if((c|0)<=2045){if((c|0)==2045){xl(l|0,0,d|0,e|0)|0;if((y|0)<0)break;else{c=2045;h=e;k=17;break a}}if((c|0)>=0){h=e;k=17;break a}k=(c|0)!=-1|(a[f>>0]|0)==1;i=xl(l|0,0,d|0,e|0)|0;j=y;if((c|0)>-64){g=Il(d|0,e|0,0-c|0)|0;h=y;d=Jl(d|0,e|0,c&63|0)|0;d=g|((d|0)!=0|(y|0)!=0)&1}else{h=0;d=((d|0)!=0|(e|0)!=0)&1}g=d&1023;if(!(((j|0)>-1|(j|0)==-1&i>>>0>4294967295|k)&(g|0)!=0)){c=0;k=17;break a}i=f+2|0;k=a[i>>0]|16;a[i>>0]=k;c=0;j=d;d=k;k=19;break a}while(0);m=f+2|0;a[m>>0]=a[m>>0]|40;m=((l|0)==0)<<31>>31;f=Jl(b&255|0,0,63)|0;l=y|2146435072;b=m;m=((m|0)<0)<<31>>31;m=xl(f|0,l|0,b|0,m|0)|0;b=y;y=b;return m|0}else{h=e;k=17}while(0);if((k|0)==17)if(!g)g=0;else{k=f+2|0;i=k;j=d;d=a[k>>0]|0;k=19}if((k|0)==19){a[i>>0]=d|32;d=j}k=xl(d|0,h|0,l|0,0)|0;k=Il(k|0,y|0,10)|0;e=~(m&(g|0)==512&1);k=k&e;e=y&((e|0)<0)<<31>>31;l=(k|0)==0&(e|0)==0;b=Jl(b&255|0,0,63)|0;m=y;f=Jl(c|0,0,52)|0;f=l?0:f;l=l?0:y;b=k|b;m=e|m;m=xl(f|0,l|0,b|0,m|0)|0;b=y;y=b;return m|0}function bi(a,e,f,g){a=a|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if((e|0)==0&(f|0)==0){f=0;i=0;e=0;g=a;h=g;c[h>>2]=i;g=g+4|0;c[g>>2]=e;g=a+8|0;b[g>>1]=f;return}j=Il(e|0,f|0,63)|0;i=y;l=(j|0)==0&(i|0)==0;g=yl(0,0,e|0,f|0)|0;g=l?e:g;e=l?f:y;l=e>>>0<1|(e|0)==1&g>>>0<0;h=l?g:e;k=h>>>0<65536;h=k?h<<16:h;k=k?16:0;f=h>>>0<16777216;h=((l?32:0)|(f?k|8:k)&255)+(d[10416+((f?h<<8:h)>>>24)>>0]|0)<<24>>24;e=Jl(g|0,e|0,h|0)|0;g=y;i=Jl(j|0,i|0,15)|0;h=(i|16446)-h&65535;i=a;f=i;c[f>>2]=e;i=i+4|0;c[i>>2]=g;i=a+8|0;b[i>>1]=h;return}function ci(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=f&8388607;i=f>>>23;j=f>>>31;a:do switch((i&255)<<24>>24){case -1:{if(!h){h=j<<15|32767;f=0;g=-2147483648;break a}if(!((f&4194303|0)==0|(f&2143289344|0)!=2139095040)){i=g+2|0;a[i>>0]=a[i>>0]|1}i=Jl(f|0,0,40)|0;g=(f&8388607|0)==0&0==0;h=j<<15|32767;f=g?0:i;g=g?-1073741824:y|-2147483648;break}case 0:if(!h){h=j<<15;f=0;g=0;break a}else{k=h>>>0<65536;i=k?f<<16:h;k=k?16:0;f=i>>>0<16777216;k=((d[10416+((f?i<<8:i)>>>24)>>0]|0)+((f?k|8:k)&255)<<24)+-134217728>>24;f=1-k|0;h=h<<k;k=10;break a}default:{f=i&255;k=10}}while(0);if((k|0)==10){g=Jl(h|8388608|0,0,40)|0;h=(j<<15|16256)+f|0;f=g;g=y}k=e;c[k>>2]=f;c[k+4>>2]=g;b[e+8>>1]=h;return}function di(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0;i=g&1048575;j=Il(f|0,g|0,52)|0;k=Il(f|0,g|0,63)|0;l=y;a:do switch(j&2047){case 2047:{if((f|0)==0&(i|0)==0){i=Jl(k|0,l|0,15)|0;i=i|32767;f=0;g=-2147483648;break a}if(!((f|0)==0&(g&524287|0)==0|(0!=0|(g&2146959360|0)!=2146435072))){j=h+2|0;a[j>>0]=a[j>>0]|1}f=Jl(f|0,g|0,11)|0;g=y|-2147483648;i=Jl(k|0,l|0,15)|0|32767;break}case 0:if((f|0)==0&(i|0)==0){i=Jl(k|0,l|0,15)|0;i=i&32768;f=0;g=0;break a}else{h=i>>>0<1|(i|0)==1&f>>>0<0;m=h?f:i;j=m>>>0<65536;g=j?m<<16:m;j=j?16:0;m=g>>>0<16777216;g=(((h?32:0)|(m?j|8:j)&255)+(d[10416+((m?g<<8:g)>>>24)>>0]|0)<<24)+-184549376>>24;f=Jl(f|0,i|0,g|0)|0;g=1-g|0;i=y;m=10;break a}default:{g=j&2047;m=10}}while(0);if((m|0)==10){f=Jl(f|0,i|0,11)|0;m=y|-2147483648;i=Jl(k|0,l|0,15)|0;i=(i&32768|15360)+g|0;g=m}m=e;c[m>>2]=f;c[m+4>>2]=g;b[e+8>>1]=i;return}function ei(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=d;f=c[g>>2]|0;g=c[g+4>>2]|0;k=b[d+8>>1]|0;d=k&32767;k=(k&65535)>>>15&255;k=d<<16>>16==32767?((f|0)==0&(g&2147483647|0)==0?k:0):k;d=16439-(d&65535)|0;d=(d|0)>1?d:1;do if(d)if((d|0)<64){i=Il(f|0,g|0,d|0)|0;j=y;f=Jl(f|0,g|0,0-d&63|0)|0;f=i|((f|0)!=0|(y|0)!=0)&1;g=j;break}else{f=((f|0)!=0|(g|0)!=0)&1;g=0;break}while(0);d=a[e+1>>0]|0;i=d<<24>>24==0;do if(!i)if(d<<24>>24!=3)if(!(k<<24>>24)){h=d<<24>>24==1;d=h?0:127;h=h?0:0;break}else{h=d<<24>>24==2;d=h?0:127;h=h?0:0;break}else{d=0;h=0}else{d=64;h=0}while(0);j=f&127;h=xl(d|0,h|0,f|0,g|0)|0;g=y;d=Il(h|0,g|0,7)|0;d=d&~(i&j<<24>>24==64&1);d=k<<24>>24==0?d:0-d|0;do if(!(g>>>0>127|(g|0)==127&h>>>0>4294967295)){if(d|0?(d>>>31|0)!=(k&255|0):0){d=-2147483648;f=1;break}if(!(j<<24>>24)){e=d;return e|0}else f=32}else{d=-2147483648;f=1}while(0);e=e+2|0;a[e>>0]=a[e>>0]|f;e=d;return e|0}function fi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;k=d;j=c[k>>2]|0;k=c[k+4>>2]|0;i=b[d+8>>1]|0;f=i&32767;g=f&65535;i=(i&65535)>>>15;d=i&255;if((f&65535)<=16414){if((f&65535)<16383){if(!((j|0)!=0|(k|0)!=0|f<<16>>16!=0)){e=0;return e|0}e=e+2|0;a[e>>0]=a[e>>0]|32;e=0;return e|0}f=16446-g|0;g=Il(j|0,k|0,f|0)|0;h=d<<24>>24==0?g:0-g|0;if((h>>>31|0)==(i&65535|0)){i=Jl(g|0,y|0,f|0)|0;if((i|0)==(j|0)&(y|0)==(k|0)){e=h;return e|0}e=e+2|0;a[e>>0]=a[e>>0]|32;e=h;return e|0}}else d=(j|0)==0&(k&2147483647|0)==0|f<<16>>16!=32767?d:0;e=e+2|0;a[e>>0]=a[e>>0]|1;e=d<<24>>24==0?2147483647:-2147483648;return e|0}function gi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=d;f=c[h>>2]|0;h=c[h+4>>2]|0;d=b[d+8>>1]|0;m=(d&65535)>>>15;j=m&255;d=16446-(d&32767)|0;do if((d|0)<1)if(!d){k=0;l=0;g=f;d=h;n=6}else{g=1;f=0;d=-2147483648}else if((d|0)<64){k=Jl(f|0,h|0,0-d&63|0)|0;l=y;g=Il(f|0,h|0,d|0)|0;d=y;n=6;break}else{l=(d|0)==64;k=l?f:((f|0)!=0|(h|0)!=0)&1;l=l?h:0;g=0;d=0;n=6;break}while(0);do if((n|0)==6){f=a[e+1>>0]|0;i=f<<24>>24==0;h=Il(k|0,l|0,63)|0;do if(!i){if(f<<24>>24!=3)if(!(j<<24>>24)){f=((k|0)!=0|(l|0)!=0)&f<<24>>24==2&1;n=11;break}else{f=((k|0)!=0|(l|0)!=0)&f<<24>>24==1&1;n=11;break}}else{f=h&255;n=11}while(0);if((n|0)==11)if(f<<24>>24){d=xl(g|0,d|0,1,0)|0;f=y;if((d|0)==0&(f|0)==0){g=1;f=0;d=-2147483648;break}n=~((k|0)==0&(l&2147483647|0)==0&i&1);g=d&n;d=f&((n|0)<0)<<31>>31}n=j<<24>>24==0;f=yl(0,0,g|0,d|0)|0;f=n?g:f;d=n?d:y;if(!((f|0)==0&(d|0)==0)?(n=Il(f|0,d|0,63)|0,(n|0)!=(m&65535|0)):0){g=1;f=0;d=-2147483648;break}if((k|0)==0&(l|0)==0){n=d;e=f;y=n;return e|0}else g=32}while(0);n=e+2|0;a[n>>0]=a[n>>0]|g;n=d;e=f;y=n;return e|0}function hi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0;i=d;h=c[i>>2]|0;i=c[i+4>>2]|0;g=b[d+8>>1]|0;d=g&32767;f=d&65535;if((d&65535)>16445){h=-2147483648;i=0;y=h;return i|0}if((d&65535)<16383){if((h|d&65535|0)==0&(i|0)==0){h=0;i=0;y=h;return i|0}h=e+2|0;a[h>>0]=a[h>>0]|32;h=0;i=0;y=h;return i|0}else{d=Il(h|0,i|0,16446-f|0)|0;f=y;i=Jl(h|0,i|0,g+2&63|0)|0;if(!((i|0)==0&(y|0)==0)){i=e+2|0;a[i>>0]=a[i>>0]|32}e=g<<16>>16>-1;i=yl(0,0,d|0,f|0)|0;h=e?f:y;i=e?d:i;y=h;return i|0}return 0}function ii(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=d;h=c[i>>2]|0;i=c[i+4>>2]|0;g=b[d+8>>1]|0;d=g&32767;f=d&65535;g=(g&65535)>>>15;if(d<<16>>16!=32767){j=Il(h|0,i|0,33)|0;i=j|((h|0)!=0|(i&1|0)!=0)&1;i=_h(g&255,d<<16>>16!=0|((i|0)!=0|(y|0)!=0)?f+-16257|0:f,i,e)|0;return i|0}if((h|0)==0&(i&2147483647|0)==0){j=(g&65535)<<31|2139095040;return j|0}if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&((h|0)!=0|(i&1073741823|0)!=0)){j=e+2|0;a[j>>0]=a[j>>0]|1}if(0==0&(i&2147483392|0)==0){j=-4194304;return j|0}j=Il(h|0,i|0,40)|0;j=(g&65535)<<31|j|2139095040;return j|0}function ji(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=d;h=c[i>>2]|0;i=c[i+4>>2]|0;g=b[d+8>>1]|0;d=g&32767;f=d&65535;g=(g&65535)>>>15;if(d<<16>>16!=32767){j=Il(h|0,i|0,1)|0;i=ai(g&255,(h|0)!=0|(i|0)!=0|d<<16>>16!=0?f+-15361|0:f,j|h&1,y,e)|0;h=y;y=h;return i|0}if((h|0)==0&(i&2147483647|0)==0){j=Jl(g&65535|0,0,63)|0;i=y|2146435072;y=i;return j|0}if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&((h|0)!=0|(i&1073741823|0)!=0)){j=e+2|0;a[j>>0]=a[j>>0]|1}e=Il(h|0,i|0,11)|0;f=y;i=(h&-2048|0)==0&(i&2147483647|0)==0;j=Jl(g&65535|0,0,63)|0;y=i?-524288:f|y|2146435072;return (i?0:e|j)|0}function ki(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;g=q+6|0;o=q;p=b[e+8>>1]|0;k=p&32767;j=k&65535;if((k&65535)>16445){if(k<<16>>16==32767?(i=e,h=c[i>>2]|0,i=c[i+4>>2]|0,!((h|0)==0&(i&2147483647|0)==0)):0){o=e+10|0;b[g>>1]=b[o>>1]|0;b[g+2>>1]=b[o+2>>1]|0;b[g+4>>1]=b[o+4>>1]|0;if((h|0)==(h|0)&(i|0)==(i&-1073741825|0)&((h|0)!=0|(i&1073741823|0)!=0)){f=f+2|0;a[f>>0]=a[f>>0]|1}f=d;c[f>>2]=h;c[f+4>>2]=i|-1073741824;b[d+8>>1]=p;p=d+10|0;b[p>>1]=b[g>>1]|0;b[p+2>>1]=b[g+2>>1]|0;b[p+4>>1]=b[g+4>>1]|0;l=q;return};c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];l=q;return}if((k&65535)>=16383){j=Jl(1,0,16446-j|0)|0;k=y;h=xl(j|0,k|0,-1,-1)|0;i=y;n=e;m=c[n>>2]|0;n=c[n+4>>2]|0;g=e+10|0;b[o>>1]=b[g>>1]|0;b[o+2>>1]=b[g+2>>1]|0;b[o+4>>1]=b[g+4>>1]|0;g=a[f+1>>0]|0;switch(g<<24>>24){case 0:{g=xl(m|0,n|0,Il(j|0,k|0,1)|0,y|0)|0;e=y;h=(g&h|0)==0&(e&i|0)==0;g=(h?~j:-1)&g;h=(h?~k:-1)&e;break}case 3:{g=m;h=n;break}default:{g=((p&65535)>>>15&65535|0)==(g<<24>>24==2|0);g=xl((g?0:h)|0,(g?0:i)|0,m|0,n|0)|0;h=y}}e=yl(0,0,j|0,k|0)|0;e=g&e;i=h&y;g=(e|0)==0&(i|0)==0;h=g?0:e;i=g?-2147483648:i;if(!((h|0)==(m|0)&(i|0)==(n|0))){f=f+2|0;a[f>>0]=a[f>>0]|32}f=d;c[f>>2]=h;c[f+4>>2]=i;b[d+8>>1]=p+(g&1)<<16>>16;p=d+10|0;b[p>>1]=b[o>>1]|0;b[p+2>>1]=b[o+2>>1]|0;b[p+4>>1]=b[o+4>>1]|0;l=q;return}if(k<<16>>16==0?(o=e,(c[o>>2]|0)==0?(c[o+4>>2]&2147483647|0)==0:0):0){c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];l=q;return}g=f+2|0;a[g>>0]=a[g>>0]|32;g=(p&65535)>>>15&255;switch(a[f+1>>0]|0){case 0:{if(k<<16>>16==16382?(f=e,!((c[f>>2]|0)==0?(c[f+4>>2]&2147483647|0)==0:0)):0){f=d;c[f>>2]=0;c[f+4>>2]=-2147483648;b[d+8>>1]=p&-32768|16383;l=q;return}break}case 1:if(!(g<<24>>24)){p=d;c[p>>2]=0;c[p+4>>2]=0;b[d+8>>1]=0;l=q;return}else{p=d;c[p>>2]=0;c[p+4>>2]=-2147483648;b[d+8>>1]=-16385;l=q;return}case 2:if(!(g<<24>>24)){p=d;c[p>>2]=0;c[p+4>>2]=-2147483648;b[d+8>>1]=16383;l=q;return}else{p=d;c[p>>2]=0;c[p+4>>2]=0;b[d+8>>1]=-32768;l=q;return}default:{}}f=d;c[f>>2]=0;c[f+4>>2]=0;b[d+8>>1]=p&-32768;l=q;return}function li(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+32|0;h=j+16|0;g=j;i=(e[b+8>>1]|0)>>>15&255;if(i<<24>>24==((e[d+8>>1]|0)>>>15&255)<<24>>24){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];mi(a,g,h,i,f);l=j;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ni(a,g,h,i,f);l=j;return}}function mi(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;A=l;l=l+16|0;r=A+6|0;q=A;u=f;x=c[u>>2]|0;u=c[u+4>>2]|0;s=b[f+8>>1]|0;k=s&32767;m=k&65535;v=g;w=c[v>>2]|0;v=c[v+4>>2]|0;t=b[g+8>>1]|0;o=t&32767;p=o&65535;j=m-p|0;do if((j|0)<=0)if((j|0)<0){if(o<<16>>16!=32767){g=j+(k<<16>>16==0&1)|0;f=0-g|0;if(!g){f=w;k=v;n=x;o=u;j=0;g=0;m=p;z=75;break}if((g|0)>-64){j=Jl(x|0,u|0,g&63|0)|0;g=y;n=Il(x|0,u|0,f|0)|0;f=w;k=v;o=y;m=p;z=75;break}else{g=(f|0)==64;f=w;k=v;n=0;o=0;j=g?x:((x|0)!=0|(u|0)!=0)&1;g=g?u:0;m=p;z=75;break}}if((w|0)==0&(v&2147483647|0)==0){i=e;c[i>>2]=0;c[i+4>>2]=-2147483648;b[e+8>>1]=(h&255)<<15|32767;l=A;return}n=g+10|0;b[r>>1]=b[n>>1]|0;b[r+2>>1]=b[n+2>>1]|0;b[r+4>>1]=b[n+4>>1]|0;n=f+10|0;b[q>>1]=b[n>>1]|0;b[q+2>>1]=b[n+2>>1]|0;b[q+4>>1]=b[n+4>>1]|0;n=k<<16>>16==32767;o=((x|0)!=0|(u&2147483647|0)!=0)&n;n=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&(((x|0)!=0|(u&1073741823|0)!=0)&n);j=(w|0)!=0|(v&1073741823|0)!=0;k=(w|0)==(w|0)&(v|0)==(v&-1073741825|0);m=k&j;g=u|-1073741824;f=v|-1073741824;if(n|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(n)if(m)z=37;else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0}else{if(!o){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(k&j){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0}else z=37}while(0);do if((z|0)==37){if(g>>>0<f>>>0|(g|0)==(f|0)&x>>>0<w>>>0){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(f>>>0<g>>>0|(f|0)==(g|0)&w>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}if((s&65535)<(t&65535)){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}}while(0);l=A;return}else{if(k<<16>>16!=32767){f=xl(w|0,v|0,x|0,u|0)|0;g=y;if(k<<16>>16){k=g;j=0;g=0;z=76;break}x=g>>>0<1|(g|0)==1&f>>>0<0;m=x?f:g;j=m>>>0<65536;m=j?m<<16:m;j=j?16:0;k=m>>>0<16777216;m=((x?32:0)|(k?j|8:j)&255)+(d[10416+((k?m<<8:m)>>>24)>>0]|0)<<24>>24;f=Jl(f|0,g|0,m|0)|0;m=1-m|0;k=y;j=0;g=0;break}if((w|x|0)==0&((v|u)&2147483647|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=A;return}m=g+10|0;b[r>>1]=b[m>>1]|0;b[r+2>>1]=b[m+2>>1]|0;b[r+4>>1]=b[m+4>>1]|0;m=f+10|0;b[q>>1]=b[m>>1]|0;b[q+2>>1]=b[m+2>>1]|0;b[q+4>>1]=b[m+4>>1]|0;m=(x|0)==0&(u&2147483647|0)==0;n=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&((x|0)!=0|(u&1073741823|0)!=0);j=o<<16>>16==32767;k=((w|0)!=0|(v&2147483647|0)!=0)&j;j=(w|0)==(w|0)&(v|0)==(v&-1073741825|0)&(((w|0)!=0|(v&1073741823|0)!=0)&j);g=u|-1073741824;f=v|-1073741824;if(n|j){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(n)if(!j)if(k){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else z=63;else{if(m){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(k&(j^1))z=63;else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0}}while(0);do if((z|0)==63){if(g>>>0<f>>>0|(g|0)==(f|0)&x>>>0<w>>>0){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(f>>>0<g>>>0|(f|0)==(g|0)&w>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}if((s&65535)<(t&65535)){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}}while(0);l=A;return}else{if(k<<16>>16!=32767){f=j+((o<<16>>16==0)<<31>>31)|0;if(!f){f=w;k=v;n=x;o=u;j=0;g=0;z=75;break}if((f|0)<64){j=Jl(w|0,v|0,0-f&63|0)|0;g=y;f=Il(w|0,v|0,f|0)|0;k=y;n=x;o=u;z=75;break}else{g=(f|0)==64;f=0;k=0;n=x;o=u;j=g?w:((w|0)!=0|(v|0)!=0)&1;g=g?v:0;z=75;break}}if((x|0)==0&(u&2147483647|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=A;return}m=g+10|0;b[r>>1]=b[m>>1]|0;b[r+2>>1]=b[m+2>>1]|0;b[r+4>>1]=b[m+4>>1]|0;m=f+10|0;b[q>>1]=b[m>>1]|0;b[q+2>>1]=b[m+2>>1]|0;b[q+4>>1]=b[m+4>>1]|0;m=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&((x|0)!=0|(u&1073741823|0)!=0);j=o<<16>>16==32767;k=((w|0)!=0|(v&2147483647|0)!=0)&j;j=(w|0)==(w|0)&(v|0)==(v&-1073741825|0)&(((w|0)!=0|(v&1073741823|0)!=0)&j);g=u|-1073741824;f=v|-1073741824;if(m|j){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(m)if(!j)if(k){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else z=13;else if(k&(j^1))z=13;else{i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0}while(0);do if((z|0)==13){if(g>>>0<f>>>0|(g|0)==(f|0)&x>>>0<w>>>0){i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}if(f>>>0<g>>>0|(f|0)==(g|0)&w>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}if((s&65535)<(t&65535)){i=e;c[i>>2]=x;c[i+4>>2]=g;b[e+8>>1]=s;i=e+10|0;b[i>>1]=b[q>>1]|0;b[i+2>>1]=b[q+2>>1]|0;b[i+4>>1]=b[q+4>>1]|0;break}else{i=e;c[i>>2]=w;c[i+4>>2]=f;b[e+8>>1]=t;i=e+10|0;b[i>>1]=b[r>>1]|0;b[i+2>>1]=b[r+2>>1]|0;b[i+4>>1]=b[r+4>>1]|0;break}}while(0);l=A;return}while(0);if((z|0)==75){f=xl(f|0,k|0,n|0,o|0)|0;k=y;if((k|0)>=0)z=76}if((z|0)==76){x=Jl(f|0,k|0,63)|0;z=y;f=Il(f|0,k|0,1)|0;m=m+1|0;k=y|-2147483648;j=x|((j|0)!=0|(g|0)!=0)&1;g=z}oi(e,a[i+3>>0]|0,h,m,f,k,j,g,i);l=A;return}function ni(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;A=l;l=l+32|0;u=A+12|0;t=A+6|0;o=A;j=f;n=c[j>>2]|0;j=c[j+4>>2]|0;w=b[f+8>>1]|0;q=w&32767;r=q&65535;p=g;x=c[p>>2]|0;p=c[p+4>>2]|0;v=b[g+8>>1]|0;s=v&32767;k=s&65535;m=r-k|0;a:do if((m|0)>0){if(q<<16>>16!=32767){m=m+((s<<16>>16==0)<<31>>31)|0;k=0-m&63;if(!m){m=r;k=x;o=p;f=0;p=0;z=84;break}if((m|0)<64){f=Jl(x|0,p|0,k|0)|0;z=y;k=Il(x|0,p|0,m|0)|0;m=r;o=y;p=z;z=84;break}if((m|0)==64){m=r;k=0;o=0;f=x;z=84;break}if((m|0)<128){w=Il(x|0,p|0,m&63|0)|0;z=y;f=Jl(x|0,p|0,k|0)|0;m=r;k=0;o=0;f=w|((f|0)!=0|(y|0)!=0)&1;p=z;z=84;break}else{m=r;k=0;o=0;f=((x|0)!=0|(p|0)!=0)&1;p=0;z=84;break}}if((n|0)==0&(j&2147483647|0)==0){c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];l=A;return}m=g+10|0;b[u>>1]=b[m>>1]|0;b[u+2>>1]=b[m+2>>1]|0;b[u+4>>1]=b[m+4>>1]|0;f=f+10|0;b[t>>1]=b[f>>1]|0;b[t+2>>1]=b[f+2>>1]|0;b[t+4>>1]=b[f+4>>1]|0;f=(n|0)==(n|0)&(j|0)==(j&-1073741825|0)&((n|0)!=0|(j&1073741823|0)!=0);m=s<<16>>16==32767;o=((x|0)!=0|(p&2147483647|0)!=0)&m;m=(x|0)==(x|0)&(p|0)==(p&-1073741825|0)&(((x|0)!=0|(p&1073741823|0)!=0)&m);k=j|-1073741824;j=p|-1073741824;if(f|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(f)if(!m)if(o){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else z=68;else if(o&(m^1))z=68;else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0}while(0);do if((z|0)==68){if(k>>>0<j>>>0|(k|0)==(j|0)&n>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<n>>>0){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}if((w&65535)<(v&65535)){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}}while(0);l=A;return}else{do if((m|0)>=0){m=w&32767;b:do if(m<<16>>16<32767){switch(m<<16>>16){case 0:break;default:{m=r;break b}}m=1;k=1}else{switch(m<<16>>16){case 32767:break;default:{m=r;break b}}if((x|n|0)==0&((p|j)&2147483647|0)==0){i=i+2|0;a[i>>0]=a[i>>0]|1;i=e;c[i>>2]=0;c[i+4>>2]=-1073741824;b[e+8>>1]=-1;i=e+10|0;b[i>>1]=b[o>>1]|0;b[i+2>>1]=b[o+2>>1]|0;b[i+4>>1]=b[o+4>>1]|0;l=A;return}h=g+10|0;b[u>>1]=b[h>>1]|0;b[u+2>>1]=b[h+2>>1]|0;b[u+4>>1]=b[h+4>>1]|0;f=f+10|0;b[t>>1]=b[f>>1]|0;b[t+2>>1]=b[f+2>>1]|0;b[t+4>>1]=b[f+4>>1]|0;f=q<<16>>16==32767;h=((n|0)!=0|(j&2147483647|0)!=0)&f;f=(n|0)==(n|0)&(j|0)==(j&-1073741825|0)&(((n|0)!=0|(j&1073741823|0)!=0)&f);m=s<<16>>16==32767;o=((x|0)!=0|(p&2147483647|0)!=0)&m;m=(x|0)==(x|0)&(p|0)==(p&-1073741825|0)&(((x|0)!=0|(p&1073741823|0)!=0)&m);k=j|-1073741824;j=p|-1073741824;if(f|m){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(f)if(!m)if(o){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else z=15;else{if(!h){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(o&(m^1))z=15;else{i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0}}while(0);do if((z|0)==15){if(k>>>0<j>>>0|(k|0)==(j|0)&n>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<n>>>0){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}if((w&65535)<(v&65535)){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}}while(0);l=A;return}while(0);if(p>>>0<j>>>0|(p|0)==(j|0)&x>>>0<n>>>0){k=x;o=p;f=0;p=0;z=84;break a}if(j>>>0<p>>>0|(j|0)==(p|0)&n>>>0<x>>>0){m=n;o=j;n=0;j=0}else{i=((a[i+1>>0]|0)==1&1)<<15&65535;z=e;c[z>>2]=0;c[z+4>>2]=0;b[e+8>>1]=i;l=A;return}}else{if(s<<16>>16!=32767){f=m+(q<<16>>16==0&1)|0;m=0-f|0;o=f&63;if(!f){m=n;o=j;n=0;j=0;break}if((f|0)>-64){v=Jl(n|0,j|0,o|0)|0;w=y;m=Il(n|0,j|0,m|0)|0;o=y;n=v;j=w;break}if((m|0)==64){m=0;o=0;break}if((f|0)>-128){v=Il(n|0,j|0,m&63|0)|0;w=y;n=Jl(n|0,j|0,o|0)|0;m=0;o=0;n=v|((n|0)!=0|(y|0)!=0)&1;j=w;break}else{m=0;o=0;n=((n|0)!=0|(j|0)!=0)&1;j=0;break}}if((x|0)==0&(p&2147483647|0)==0){i=e;c[i>>2]=0;c[i+4>>2]=-2147483648;b[e+8>>1]=((h^1)&255)<<15|32767;l=A;return}h=g+10|0;b[u>>1]=b[h>>1]|0;b[u+2>>1]=b[h+2>>1]|0;b[u+4>>1]=b[h+4>>1]|0;h=f+10|0;b[t>>1]=b[h>>1]|0;b[t+2>>1]=b[h+2>>1]|0;b[t+4>>1]=b[h+4>>1]|0;h=q<<16>>16==32767;q=((n|0)!=0|(j&2147483647|0)!=0)&h;h=(n|0)==(n|0)&(j|0)==(j&-1073741825|0)&(((n|0)!=0|(j&1073741823|0)!=0)&h);m=(x|0)!=0|(p&1073741823|0)!=0;o=(x|0)==(x|0)&(p|0)==(p&-1073741825|0);f=o&m;k=j|-1073741824;j=p|-1073741824;if(h|f){i=i+2|0;a[i>>0]=a[i>>0]|1}do if(h)if(f)z=39;else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0}else{if(!q){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(o&m){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0}else z=39}while(0);do if((z|0)==39){if(k>>>0<j>>>0|(k|0)==(j|0)&n>>>0<x>>>0){i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<n>>>0){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}if((w&65535)<(v&65535)){i=e;c[i>>2]=n;c[i+4>>2]=k;b[e+8>>1]=w;i=e+10|0;b[i>>1]=b[t>>1]|0;b[i+2>>1]=b[t+2>>1]|0;b[i+4>>1]=b[t+4>>1]|0;break}else{i=e;c[i>>2]=x;c[i+4>>2]=j;b[e+8>>1]=v;i=e+10|0;b[i>>1]=b[u>>1]|0;b[i+2>>1]=b[u+2>>1]|0;b[i+4>>1]=b[u+4>>1]|0;break}}while(0);l=A;return}while(0);o=yl(x|0,p|0,m|0,o|0)|0;m=((n|0)!=0|(j|0)!=0)<<31>>31;m=xl(o|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;h=h^1;o=k;k=m;m=y}while(0);if((z|0)==84){o=yl(n|0,j|0,k|0,o|0)|0;k=((f|0)!=0|(p|0)!=0)<<31>>31;k=xl(o|0,y|0,k|0,((k|0)<0)<<31>>31|0)|0;o=m;n=f;j=p;m=y}f=yl(0,0,n|0,j|0)|0;s=y;p=a[i+3>>0]|0;q=(k|0)==0&(m|0)==0;r=q?f:k;v=q?s:m;f=q?0:f;s=q?0:s;q=q?o+-64|0:o;z=v>>>0<1|(v|0)==1&r>>>0<0;u=z?r:v;x=u>>>0<65536;u=x?u<<16:u;x=x?16:0;g=u>>>0<16777216;u=((z?32:0)|(g?x|8:x)&255)+(d[10416+((g?u<<8:u)>>>24)>>0]|0)|0;g=u<<24>>24;x=Jl(f|0,s|0,g|0)|0;z=y;u=(u&255)<<24>>24==0;t=Jl(r|0,v|0,g|0)|0;w=y;s=Il(f|0,s|0,0-g&63|0)|0;oi(e,p,h,q-g|0,u?r:s|t,u?v:y|w,x,z,i);l=A;return}function oi(d,e,f,g,h,i,j,k,l){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=a[l+1>>0]|0;t=s<<24>>24==0;a:do switch(e<<24>>24){case 32:{p=-1;q=255;e=0;n=128;r=3;break}case 64:{p=2047;q=0;e=1024;n=0;r=3;break}default:{e=Il(j|0,k|0,63)|0;do if(!t)if(s<<24>>24!=3)if(!(f<<24>>24)){e=((j|0)!=0|(k|0)!=0)&s<<24>>24==2&1;break}else{e=((j|0)!=0|(k|0)!=0)&s<<24>>24==1&1;break}else e=0;else e=e&255;while(0);if((g+-1|0)>>>0>32764){if((g|0)>32766){h=0;i=0;break a}m=(h|0)!=-1|(i|0)!=-1;if(!((g|0)!=32766|m|e<<24>>24==0)){h=0;i=0;break a}if((g|0)<1){o=m|e<<24>>24!=0&((g|0)==0&(a[l>>0]|0)!=1)^1;g=1-g|0;e=0-g&63;do if(g)if((g|0)<64){n=Jl(h|0,i|0,e|0)|0;q=y;h=Il(h|0,i|0,g|0)|0;n=n|((j|0)!=0|(k|0)!=0)&1;k=q;i=y;break}else{q=(g|0)==64;n=q?((j|0)!=0|(k|0)!=0)&1|h:((j|h|0)!=0|(k|i|0)!=0)&1;k=q?i:0;h=0;i=0;break}else n=j;while(0);m=(n|0)!=0|(k|0)!=0;if(!(o&m)){if(!((n|0)==0&(k|0)==0)){e=l+2|0;g=e;e=a[e>>0]|0;r=46}}else{g=l+2|0;e=a[g>>0]|16;a[g>>0]=e;r=46}if((r|0)==46)a[g>>0]=e|32;do if(!t)if(!(f<<24>>24)){g=s<<24>>24==2&m&1;break}else{g=s<<24>>24==1&m&1;break}else{g=Il(n|0,k|0,63)|0;g=g&255}while(0);if(!(g<<24>>24))g=0;else{h=xl(h|0,i|0,1,0)|0;l=y;i=~(t&((n|0)==0&(k&2147483647|0)==0)&1);g=Il(h|0,l|0,63)|0;h=h&i;i=l&((i|0)<0)<<31>>31}t=g+((f&255)<<15)|0;r=h;l=i;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}}if(!((j|0)==0&(k|0)==0)){l=l+2|0;a[l>>0]=a[l>>0]|32}do if(e<<24>>24){i=xl(h|0,i|0,1,0)|0;e=y;if((i|0)==0&(e|0)==0){g=g+1|0;h=0;i=-2147483648;break}else{t=~((j|0)==0&(k&2147483647|0)==0&t&1);h=i&t;i=e&((t|0)<0)<<31>>31;break}}else g=(h|0)==0&(i|0)==0?0:g;while(0);t=g+((f&255)<<15)|0;r=h;l=i;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}}while(0);do if((r|0)==3){m=((j|0)!=0|(k|0)!=0)&1|h;do if(!t)if(s<<24>>24!=3)if(!(f<<24>>24)){o=s<<24>>24==1;j=o?0:p;o=o?0:q;break}else{o=s<<24>>24==2;j=o?0:p;o=o?0:q;break}else{j=0;o=0}else{j=e;o=n}while(0);h=p&m;e=q&i;if((g+-1|0)>>>0>32764){if((g|0)>32766){h=p;i=q;break}k=xl(j|0,o|0,m|0,i|0)|0;n=y;if((g|0)==32766&(n>>>0<i>>>0|(n|0)==(i|0)&k>>>0<m>>>0)){h=p;i=q;break}if((g|0)<1){k=i>>>0<n>>>0|(i|0)==(n|0)&m>>>0<=k>>>0|((g|0)!=0|(a[l>>0]|0)==1);h=1-g|0;do if(h)if((h|0)<64){r=Il(m|0,i|0,h|0)|0;s=y;m=Jl(m|0,i|0,0-h&63|0)|0;m=r|((m|0)!=0|(y|0)!=0)&1;i=s;break}else{m=((m|0)!=0|(i|0)!=0)&1;i=0;break}while(0);h=m&p;g=i&q;e=(h|0)!=0|(g|0)!=0;if(k&e){s=l+2|0;a[s>>0]=a[s>>0]|16}if(e){l=l+2|0;a[l>>0]=a[l>>0]|32}o=xl(m|0,i|0,j|0,o|0)|0;j=y;n=Il(o|0,j|0,63)|0;r=xl(p|0,q|0,1,0)|0;l=y;s=Jl(h|0,g|0,1)|0;s=t&((s|0)==(r|0)&(y|0)==(l|0));t=(f&255)<<15|n;r=o&~((s?r:0)|p);l=j&~((s?l:0)|q);t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}}if(!((h|0)==0&(e|0)==0)){l=l+2|0;a[l>>0]=a[l>>0]|32}k=xl(j|0,o|0,m|0,i|0)|0;n=y;s=n>>>0<o>>>0|(n|0)==(o|0)&k>>>0<j>>>0;r=xl(p|0,q|0,1,0)|0;l=y;j=Jl(h|0,e|0,1)|0;t=t&((j|0)==(r|0)&(y|0)==(l|0));r=(s?0:k)&~((t?r:0)|p);l=(s?-2147483648:n)&~((t?l:0)|q);t=((r|0)==0&(l|0)==0?0:(s&1)+g|0)+((f&255)<<15)|0;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}while(0);t=l+2|0;a[t>>0]=a[t>>0]|40;if((s<<24>>24!=3?!(f<<24>>24!=0&s<<24>>24==2):0)?!(f<<24>>24==0&s<<24>>24==1):0){t=(f&255)<<15|32767;r=0;l=-2147483648;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}t=(f&255)<<15|32766;r=~h;l=~i;t=t&65535;f=d;s=f;c[s>>2]=r;f=f+4|0;c[f>>2]=l;f=d+8|0;b[f>>1]=t;return}function pi(a,b,d,f){a=a|0;b=b|0;d=d|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+32|0;h=j+16|0;g=j;i=(e[b+8>>1]|0)>>>15&255;if(i<<24>>24==((e[d+8>>1]|0)>>>15&255)<<24>>24){c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ni(a,g,h,i,f);l=j;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];mi(a,g,h,i,f);l=j;return}}function qi(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;A=l;l=l+32|0;v=A+12|0;u=A+6|0;q=A;m=f;n=c[m>>2]|0;m=c[m+4>>2]|0;w=b[f+8>>1]|0;p=w&32767;o=p&65535;i=g;j=c[i>>2]|0;i=c[i+4>>2]|0;x=b[g+8>>1]|0;t=x&32767;k=t&65535;r=x^w;s=(r&65535)>>>15&255;do if(p<<16>>16==32767){o=m&2147483647;if((n|0)==0&(o|0)==0){k=i&2147483647;if((j|0)==0&(k|0)==0|t<<16>>16!=32767){if((j|t&65535|0)==0&(i|0)==0)break;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=r|32767;l=A;return}else p=j}else{p=j;k=i&2147483647}q=g+10|0;b[v>>1]=b[q>>1]|0;b[v+2>>1]=b[q+2>>1]|0;b[v+4>>1]=b[q+4>>1]|0;q=f+10|0;b[u>>1]=b[q>>1]|0;b[u+2>>1]=b[q+2>>1]|0;b[u+4>>1]=b[q+4>>1]|0;q=(n|0)==0&(o|0)==0;f=(n|0)==(n|0)&(m|0)==(m&-1073741825|0)&((n|0)!=0|(m&1073741823|0)!=0);o=t<<16>>16==32767;p=((p|0)!=0|(k|0)!=0)&o;o=(j|0)==(j|0)&(i|0)==(i&-1073741825|0)&(((j|0)!=0|(i&1073741823|0)!=0)&o);k=m|-1073741824;i=i|-1073741824;if(f|o){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(f)if(!o)if(p){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else z=15;else{if(q){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(p&(o^1))z=15;else{h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0}}while(0);do if((z|0)==15){if(k>>>0<i>>>0|(k|0)==(i|0)&n>>>0<j>>>0){h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(i>>>0<k>>>0|(i|0)==(k|0)&j>>>0<n>>>0){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}if((w&65535)<(x&65535)){h=e;c[h>>2]=n;c[h+4>>2]=k;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[u>>1]|0;b[h+2>>1]=b[u+2>>1]|0;b[h+4>>1]=b[u+4>>1]|0;break}else{h=e;c[h>>2]=j;c[h+4>>2]=i;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}while(0);l=A;return}else{if(t<<16>>16==32767){if((j|0)==0&(i&2147483647|0)==0){if((n|p&65535|0)==0&(m|0)==0)break;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=r|32767;l=A;return}z=g+10|0;b[v>>1]=b[z>>1]|0;b[v+2>>1]=b[z+2>>1]|0;b[v+4>>1]=b[z+4>>1]|0;if((j|0)==(j|0)&(i|0)==(i&-1073741825|0)&((j|0)!=0|(i&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=j;c[h+4>>2]=i|-1073741824;b[e+8>>1]=x;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;l=A;return}do if(!(p<<16>>16)){if(!((n|0)==0&(m|0)==0)){w=m>>>0<1|(m|0)==1&n>>>0<0;o=w?n:m;x=o>>>0<65536;o=x?o<<16:o;x=x?16:0;z=o>>>0<16777216;o=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?o<<8:o)>>>24)>>0]|0)<<24>>24;n=Jl(n|0,m|0,o|0)|0;o=1-o|0;m=y;break}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=r&-32768;l=A;return}while(0);do if(!(t<<16>>16)){if(!((j|0)==0&(i|0)==0)){w=i>>>0<1|(i|0)==1&j>>>0<0;k=w?j:i;x=k>>>0<65536;k=x?k<<16:k;x=x?16:0;z=k>>>0<16777216;k=((w?32:0)|(z?x|8:x)&255)+(d[10416+((z?k<<8:k)>>>24)>>0]|0)<<24>>24;j=Jl(j|0,i|0,k|0)|0;k=1-k|0;i=y;break}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=r&-32768;l=A;return}while(0);z=Dl(j|0,0,n|0,0)|0;r=y;v=Dl(i|0,0,n|0,0)|0;w=y;u=Dl(j|0,0,m|0,0)|0;g=y;x=Dl(i|0,0,m|0,0)|0;t=y;w=xl(v|0,w|0,u|0,g|0)|0;v=y;t=xl(v|0,(v>>>0<g>>>0|(v|0)==(g|0)&w>>>0<u>>>0)&1|0,x|0,t|0)|0;x=y;r=xl(0,w|0,z|0,r|0)|0;z=y;w=xl(t|0,x|0,(z>>>0<w>>>0|(z|0)==(w|0)&r>>>0<0)&1|0,0)|0;x=y;t=(x|0)>0|(x|0)==0&w>>>0>0;u=Jl(w|0,x|0,1)|0;g=y;v=Il(r|0,z|0,63)|0;x=t?g|y:x;z=Jl(r|0,z|0,t&1|0)|0;oi(e,a[h+3>>0]|0,s,k+o+(t?-16383:-16382)|0,t?u|v:w,x,z,y,h);l=A;return}while(0);h=h+2|0;a[h>>0]=a[h>>0]|1;h=e;c[h>>2]=0;c[h+4>>2]=-1073741824;b[e+8>>1]=-1;h=e+10|0;b[h>>1]=b[q>>1]|0;b[h+2>>1]=b[q+2>>1]|0;b[h+4>>1]=b[q+4>>1]|0;l=A;return}function ri(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;A=l;l=l+32|0;v=A+12|0;s=A+6|0;n=A;j=f;i=c[j>>2]|0;j=c[j+4>>2]|0;t=b[f+8>>1]|0;p=t&32767;k=p&65535;u=g;x=c[u>>2]|0;u=c[u+4>>2]|0;w=b[g+8>>1]|0;o=w&32767;q=w^t;z=(q&65535)>>>15&255;a:do if(p<<16>>16==32767){if(!((i|0)==0&(j&2147483647|0)==0)){n=g+10|0;b[v>>1]=b[n>>1]|0;b[v+2>>1]=b[n+2>>1]|0;b[v+4>>1]=b[n+4>>1]|0;n=f+10|0;b[s>>1]=b[n>>1]|0;b[s+2>>1]=b[n+2>>1]|0;b[s+4>>1]=b[n+4>>1]|0;n=(i|0)==(i|0)&(j|0)==(j&-1073741825|0)&((i|0)!=0|(j&1073741823|0)!=0);f=o<<16>>16==32767;m=((x|0)!=0|(u&2147483647|0)!=0)&f;f=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&(((x|0)!=0|(u&1073741823|0)!=0)&f);k=j|-1073741824;j=u|-1073741824;if(n|f){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(n)if(!f)if(m){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}else{h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}else r=12;else if(m&(f^1))r=12;else{h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0}while(0);do if((r|0)==12){if(k>>>0<j>>>0|(k|0)==(j|0)&i>>>0<x>>>0){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<i>>>0){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}if((t&65535)<(w&65535)){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}else{h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}while(0);l=A;return}if(o<<16>>16!=32767){h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=q|32767;l=A;return}if(!((x|0)==0&(u&2147483647|0)==0)){m=g+10|0;b[v>>1]=b[m>>1]|0;b[v+2>>1]=b[m+2>>1]|0;b[v+4>>1]=b[m+4>>1]|0;m=f+10|0;b[s>>1]=b[m>>1]|0;b[s+2>>1]=b[m+2>>1]|0;b[s+4>>1]=b[m+4>>1]|0;m=(i|0)==(i|0)&(j|0)==(j&-1073741825|0)&((i|0)!=0|(j&1073741823|0)!=0);f=(x|0)==(x|0)&(u|0)==(u&-1073741825|0)&((x|0)!=0|(u&1073741823|0)!=0);k=j|-1073741824;j=u|-1073741824;if(m|f){h=h+2|0;a[h>>0]=a[h>>0]|1}do if(m){if(!f){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(k>>>0<j>>>0|(k|0)==(j|0)&i>>>0<x>>>0){h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}if(j>>>0<k>>>0|(j|0)==(k|0)&x>>>0<i>>>0){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}if((t&65535)<(w&65535)){h=e;c[h>>2]=i;c[h+4>>2]=k;b[e+8>>1]=t;h=e+10|0;b[h>>1]=b[s>>1]|0;b[h+2>>1]=b[s+2>>1]|0;b[h+4>>1]=b[s+4>>1]|0;break}else{h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;break}}else{h=e;c[h>>2]=x;c[h+4>>2]=j;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0}while(0);l=A;return}}else{f=o&65535;m=w&32767;b:do if(m<<16>>16<32767){switch(m<<16>>16){case 0:break;default:break b}if(!((x|0)==0&(u|0)==0)){t=u>>>0<1|(u|0)==1&x>>>0<0;f=t?x:u;v=f>>>0<65536;f=v?f<<16:f;v=v?16:0;w=f>>>0<16777216;f=((t?32:0)|(w?v|8:v)&255)+(d[10416+((w?f<<8:f)>>>24)>>0]|0)<<24>>24;x=Jl(x|0,u|0,f|0)|0;f=1-f|0;u=y;break}if((i|p&65535|0)==0&(j|0)==0)break a;h=h+2|0;a[h>>0]=a[h>>0]|4;h=e;c[h>>2]=0;c[h+4>>2]=-2147483648;b[e+8>>1]=q|32767;l=A;return}else{switch(m<<16>>16){case 32767:break;default:break b}if((x|0)==0&(u&2147483647|0)==0){h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=q&-32768;l=A;return}z=g+10|0;b[v>>1]=b[z>>1]|0;b[v+2>>1]=b[z+2>>1]|0;b[v+4>>1]=b[z+4>>1]|0;if((x|0)==(x|0)&(u|0)==(u&-1073741825|0)&(((x|0)!=0|(u&1073741823|0)!=0)&o<<16>>16==32767)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=e;c[h>>2]=x;c[h+4>>2]=u|-1073741824;b[e+8>>1]=w;h=e+10|0;b[h>>1]=b[v>>1]|0;b[h+2>>1]=b[v+2>>1]|0;b[h+4>>1]=b[v+4>>1]|0;l=A;return}while(0);do if(!(p<<16>>16)){if(!((i|0)==0&(j|0)==0)){t=j>>>0<1|(j|0)==1&i>>>0<0;k=t?i:j;v=k>>>0<65536;k=v?k<<16:k;v=v?16:0;w=k>>>0<16777216;k=((t?32:0)|(w?v|8:v)&255)+(d[10416+((w?k<<8:k)>>>24)>>0]|0)<<24>>24;i=Jl(i|0,j|0,k|0)|0;k=1-k|0;j=y;break}h=e;c[h>>2]=0;c[h+4>>2]=0;b[e+8>>1]=q&-32768;l=A;return}while(0);w=u>>>0>j>>>0|(u|0)==(j|0)&x>>>0>i>>>0;r=Jl(i|0,j|0,63)|0;s=y;p=Il(i|0,j|0,(w^1)&1|0)|0;q=y;r=w?0:r;s=w?0:s;w=k-f+(w?16382:16383)|0;if(u>>>0>q>>>0|(u|0)==(q|0)&x>>>0>p>>>0){if(u>>>0>q>>>0|(u|0)==(q|0)&0>p>>>0){f=Fl(p|0,q|0,u|0,0)|0;k=0}else{f=-1;k=0}m=Dl(f|0,0,x|0,0)|0;n=y;t=Dl(f|0,0,u|0,0)|0;v=y;i=yl(r|0,s|0,0,m|0)|0;j=y;m=(s>>>0<m>>>0|(s|0)==(m|0)&r>>>0<0)<<31>>31;v=yl(p|0,q|0,t|0,v|0)|0;n=yl(v|0,y|0,n|0,0)|0;m=xl(n|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;n=y;if((n|0)<0)while(1){k=xl(k|0,f|0,0,-1)|0;f=y;g=xl(i|0,j|0,0,x|0)|0;o=y;m=xl(m|0,n|0,u|0,0)|0;m=xl(m|0,y|0,(o>>>0<j>>>0|(o|0)==(j|0)&g>>>0<i>>>0)&1|0,0)|0;n=y;if((n|0)<0){i=g;j=o}else{i=o;break}}else i=j;if(u>>>0>m>>>0|(u|0)==(m|0)&0>i>>>0){i=Fl(i|0,m|0,u|0,0)|0;j=y}else{i=-1;j=0}k=i|k;t=x;v=0;n=j|f}else{k=-1;t=x;v=0;n=-1}F=Dl(k|0,0,t|0,v|0)|0;i=y;C=Dl(n|0,0,t|0,v|0)|0;j=y;o=Dl(k|0,0,u|0,0)|0;B=y;E=Dl(n|0,0,u|0,0)|0;D=y;j=xl(C|0,j|0,o|0,B|0)|0;C=y;i=xl(0,j|0,F|0,i|0)|0;F=y;m=yl(r|0,s|0,i|0,F|0)|0;g=y;f=(F>>>0<j>>>0|(F|0)==(j|0)&i>>>0<0)<<31>>31;i=(s>>>0<F>>>0|(s|0)==(F|0)&r>>>0<i>>>0)<<31>>31;s=yl(p|0,q|0,E|0,D|0)|0;s=yl(s|0,y|0,C|0,(C>>>0<B>>>0|(C|0)==(B|0)&j>>>0<o>>>0)&1|0)|0;f=xl(s|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;i=xl(f|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;f=y;if((f|0)<0){j=k;o=m;while(1){j=xl(j|0,n|0,-1,-1)|0;n=y;m=xl(o|0,g|0,x|0,u|0)|0;k=y;i=xl(i|0,f|0,(k>>>0<g>>>0|(k|0)==(g|0)&m>>>0<o>>>0)&1|0,0)|0;f=y;if((f|0)>=0){g=k;s=j;r=n;break}else{o=m;g=k}}}else{s=k;r=n}if(u>>>0>g>>>0|(u|0)==(g|0)&x>>>0>m>>>0){if(u>>>0>g>>>0|(u|0)==(g|0)&0>m>>>0){f=Fl(m|0,g|0,u|0,0)|0;j=0}else{f=-1;j=0}n=Dl(f|0,0,t|0,v|0)|0;o=y;E=Dl(f|0,0,u|0,0)|0;F=y;i=yl(0,0,0,n|0)|0;k=y;n=(0!=0|(n|0)!=0)<<31>>31;F=yl(m|0,g|0,E|0,F|0)|0;o=yl(F|0,y|0,o|0,0)|0;n=xl(o|0,y|0,n|0,((n|0)<0)<<31>>31|0)|0;o=y;if((o|0)<0)while(1){j=xl(j|0,f|0,0,-1)|0;f=y;p=xl(i|0,k|0,0,x|0)|0;q=y;n=xl(n|0,o|0,u|0,0)|0;n=xl(n|0,y|0,(q>>>0<k>>>0|(q|0)==(k|0)&p>>>0<i>>>0)&1|0,0)|0;o=y;if((o|0)<0){i=p;k=q}else{i=q;break}}else i=k;if(u>>>0>n>>>0|(u|0)==(n|0)&0>i>>>0){i=Fl(i|0,n|0,u|0,0)|0;k=y}else{i=-1;k=0}j=i|j;i=k|f;F=Jl(j|0,i|0,1)|0;E=y;if(E>>>0<0|(E|0)==0&F>>>0<9){f=Dl(j|0,0,t|0,v|0)|0;q=y;B=Dl(i|0,0,t|0,v|0)|0;D=y;E=Dl(j|0,0,u|0,0)|0;C=y;t=Dl(i|0,0,u|0,0)|0;v=y;D=xl(B|0,D|0,E|0,C|0)|0;B=y;q=xl(0,D|0,f|0,q|0)|0;f=y;n=yl(0,0,q|0,f|0)|0;k=y;F=(f>>>0<D>>>0|(f|0)==(D|0)&q>>>0<0)<<31>>31;f=((q|0)!=0|(f|0)!=0)<<31>>31;m=yl(m|0,g|0,t|0,v|0)|0;m=yl(m|0,y|0,B|0,(B>>>0<C>>>0|(B|0)==(C|0)&D>>>0<E>>>0)&1|0)|0;m=xl(m|0,y|0,F|0,((F|0)<0)<<31>>31|0)|0;f=xl(m|0,y|0,f|0,((f|0)<0)<<31>>31|0)|0;m=y;if((m|0)<0)while(1){j=xl(j|0,i|0,-1,-1)|0;i=y;g=xl(n|0,k|0,x|0,u|0)|0;o=y;f=xl(f|0,m|0,(o>>>0<k>>>0|(o|0)==(k|0)&g>>>0<n>>>0)&1|0,0)|0;m=y;if((m|0)<0){n=g;k=o}else{n=g;k=o;break}}j=j|((n|f|0)!=0|(k|m|0)!=0)&1}}else{j=-1;i=-1}oi(e,a[h+3>>0]|0,z,w,s,r,j,i,h);l=A;return}while(0);F=h+2|0;a[F>>0]=a[F>>0]|1;F=e;c[F>>2]=0;c[F+4>>2]=-1073741824;b[e+8>>1]=-1;F=e+10|0;b[F>>1]=b[n>>1]|0;b[F+2>>1]=b[n+2>>1]|0;b[F+4>>1]=b[n+4>>1]|0;l=A;return}function si(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;x=l;l=l+16|0;j=x+6|0;k=x;q=g;p=c[q>>2]|0;q=c[q+4>>2]|0;m=b[g+8>>1]|0;n=m&32767;i=n&65535;o=(m&65535)>>>15&255;do if(n<<16>>16==32767){if((p|0)==0&(q&2147483647|0)==0){if(o<<24>>24)break;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];l=x;return}w=g+10|0;b[j>>1]=b[w>>1]|0;b[j+2>>1]=b[w+2>>1]|0;b[j+4>>1]=b[w+4>>1]|0;if((p|0)==(p|0)&(q|0)==(q&-1073741825|0)&((p|0)!=0|(q&1073741823|0)!=0)){h=h+2|0;a[h>>0]=a[h>>0]|1}h=f;c[h>>2]=p;c[h+4>>2]=q|-1073741824;b[f+8>>1]=m;h=f+10|0;b[h>>1]=b[j>>1]|0;b[h+2>>1]=b[j+2>>1]|0;b[h+4>>1]=b[j+4>>1]|0;l=x;return}else{if(o<<24>>24){if(!((p|n&65535|0)==0&(q|0)==0))break;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];l=x;return}do if(!(n<<16>>16)){if(!((p|0)==0&(q|0)==0)){u=q>>>0<1|(q|0)==1&p>>>0<0;i=u?p:q;v=i>>>0<65536;i=v?i<<16:i;v=v?16:0;w=i>>>0<16777216;i=((u?32:0)|(w?v|8:v)&255)+(d[10416+((w?i<<8:i)>>>24)>>0]|0)<<24>>24;p=Jl(p|0,q|0,i|0)|0;i=1-i|0;q=y;break}h=f;c[h>>2]=0;c[h+4>>2]=0;b[f+8>>1]=0;l=x;return}while(0);w=(i+-16383>>1)+16383|0;j=Il(p|0,q|0,59)|0;j=j&15;k=i&1;i=Il(p|0,q|0,49)|0;if(!k){i=(i|32768)-(e[10704+(j<<1)>>1]|0)|0;i=i+((q>>>0)/(i>>>0)|0)|0;i=i>>>0>131071?-32768:i<<15;if(i>>>0>q>>>0){j=q;r=20}else n=q>>1}else{i=i+16384-(e[10672+(j<<1)>>1]|0)|0;j=Il(p|0,q|0,33)|0;i=(i<<15)+(((q>>>0)/(i>>>0)|0)<<14)|0;r=20}if((r|0)==20){n=Jl(j|0,0,31)|0;n=Fl(n|0,y|0,i|0,0)|0;n=(i>>>1)+n|0}o=k|2;r=Jl(p|0,q|0,0-o&63|0)|0;s=y;o=Il(p|0,q|0,o|0)|0;p=y;if(n>>>0>p>>>0|(n|0)==(p|0)&0>o>>>0){j=Fl(o|0,p|0,n|0,0)|0;i=Dl(j|0,0,n|0,0)|0;i=yl(o|0,p|0,i|0,y|0)|0;k=y;if((k|0)<0){g=0;do{g=xl(g|0,j|0,0,-1)|0;j=y;i=xl(i|0,k|0,n|0,0)|0;k=y}while((k|0)<0);m=g;g=j}else{m=0;g=j}if(n>>>0>i>>>0|(n|0)==(i|0)&0>s>>>0){i=Fl(s|0,i|0,n|0,0)|0;k=y}else{i=-1;k=0}j=i|m;i=k|g}else{j=-1;i=-1}m=Jl(n|0,0,30)|0;j=xl(j|0,i|0,m|0,y|0)|0;m=y;k=Jl(j|0,m|0,1)|0;i=y;E=Dl(j|0,0,j|0,0)|0;D=y;g=Dl(m|0,0,j|0,0)|0;u=y;C=Dl(m|0,0,m|0,0)|0;B=y;v=Jl(g|0,u|0,1)|0;t=y;z=Il(g|0,u|0,31)|0;A=Jl(g|0,u|0,33)|0;F=y;D=xl(A|0,F|0,E|0,D|0)|0;E=y;q=yl(r|0,s|0,D|0,E|0)|0;n=y;A=(E>>>0<F>>>0|(E|0)==(F|0)&D>>>0<A>>>0)<<31>>31;s=(s>>>0<E>>>0|(s|0)==(E|0)&r>>>0<D>>>0)<<31>>31;o=yl(o|0,p|0,C|0,B|0)|0;o=xl(o|0,y|0,A|0,((A|0)<0)<<31>>31|0)|0;o=xl(o|0,y|0,s|0,((s|0)<0)<<31>>31|0)|0;o=yl(o|0,y|0,z|0,(t>>>0<u>>>0|(t|0)==(u|0)&v>>>0<g>>>0)&1|0)|0;g=y;if((g|0)<0){p=n;while(1){j=xl(j|0,m|0,-1,-1)|0;m=y;k=xl(k|0,i|0,-2,-1)|0;i=y;E=Il(j|0,m|0,63)|0;F=y;r=xl(k|1|0,i|0,q|0,p|0)|0;n=y;F=xl(E|0,F|0,o|0,g|0)|0;o=xl(F|0,y|0,(n>>>0<p>>>0|(n|0)==(p|0)&r>>>0<q>>>0)&1|0,0)|0;g=y;if((g|0)>=0){v=i;u=k;q=r;break}else{q=r;p=n}}}else{v=i;u=k}if(v>>>0>n>>>0|(v|0)==(n|0)&u>>>0>q>>>0){if(v>>>0>n>>>0|(v|0)==(n|0)&0>q>>>0){g=Fl(q|0,n|0,v|0,0)|0;j=0}else{g=-1;j=0}s=u&-2;m=Dl(g|0,0,s|0,0)|0;o=y;E=Dl(g|0,0,v|0,0)|0;F=y;i=yl(0,0,0,m|0)|0;k=y;m=(0!=0|(m|0)!=0)<<31>>31;F=yl(q|0,n|0,E|0,F|0)|0;o=yl(F|0,y|0,o|0,0)|0;m=xl(o|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;o=y;if((o|0)<0)while(1){j=xl(j|0,g|0,0,-1)|0;g=y;p=xl(i|0,k|0,0,u|0)|0;r=y;m=xl(m|0,o|0,v|0,0)|0;m=xl(m|0,y|0,(r>>>0<k>>>0|(r|0)==(k|0)&p>>>0<i>>>0)&1|0,0)|0;o=y;if((o|0)<0){i=p;k=r}else{i=r;break}}else i=k;if(v>>>0>m>>>0|(v|0)==(m|0)&0>i>>>0){i=Fl(i|0,m|0,v|0,0)|0;k=y}else{i=-1;k=0}j=i|j;i=k|g;F=i&1073741823;if(F>>>0<0|(F|0)==0&(j&-2)>>>0<6){F=(j|0)==0&(i|0)==0;j=F?1:j;i=F?0:i;F=Dl(j|0,0,s|0,0)|0;o=y;A=Dl(i|0,0,s|0,0)|0;C=y;D=Dl(j|0,0,v|0,0)|0;B=y;t=Dl(i|0,0,v|0,0)|0;z=y;C=xl(A|0,C|0,D|0,B|0)|0;A=y;o=xl(0,C|0,F|0,o|0)|0;F=y;m=yl(0,0,o|0,F|0)|0;G=y;E=(F>>>0<C>>>0|(F|0)==(C|0)&o>>>0<0)<<31>>31;F=((o|0)!=0|(F|0)!=0)<<31>>31;o=Dl(j|0,0,j|0,0)|0;g=y;s=Dl(i|0,0,j|0,0)|0;p=y;L=Dl(i|0,0,i|0,0)|0;K=y;H=Jl(s|0,p|0,1)|0;k=y;I=Il(s|0,p|0,31)|0;r=Jl(s|0,p|0,33)|0;J=y;g=xl(r|0,J|0,o|0,g|0)|0;o=y;r=xl(L|0,K|0,(o>>>0<J>>>0|(o|0)==(J|0)&g>>>0<r>>>0)&1|0,0)|0;s=xl(r|0,y|0,I|0,(k>>>0<p>>>0|(k|0)==(p|0)&H>>>0<s>>>0)&1|0)|0;H=y;p=yl(0,0,g|0,o|0)|0;k=y;I=yl(m|0,G|0,s|0,H|0)|0;r=y;o=((g|0)!=0|(o|0)!=0)&1;g=(r>>>0<0|(r|0)==0&I>>>0<o>>>0)<<31>>31;o=yl(I|0,r|0,o|0,0)|0;r=y;m=(H>>>0>G>>>0|(H|0)==(G|0)&s>>>0>m>>>0)<<31>>31;z=yl(q|0,n|0,t|0,z|0)|0;D=yl(z|0,y|0,A|0,(A>>>0<B>>>0|(A|0)==(B|0)&C>>>0<D>>>0)&1|0)|0;E=xl(D|0,y|0,E|0,((E|0)<0)<<31>>31|0)|0;F=xl(E|0,y|0,F|0,((F|0)<0)<<31>>31|0)|0;m=xl(F|0,y|0,m|0,((m|0)<0)<<31>>31|0)|0;g=xl(m|0,y|0,g|0,((g|0)<0)<<31>>31|0)|0;m=y;if((m|0)<0){s=r;while(1){j=xl(j|0,i|0,-1,-1)|0;i=y;t=Jl(j|0,i|0,1)|0;n=y;J=Il(j|0,i|0,63)|0;K=y|v;n=xl(t|1|0,n|0,p|0,k|0)|0;t=y;K=xl(J|u|0,K|0,o|0,s|0)|0;J=y;L=(t>>>0<k>>>0|(t|0)==(k|0)&n>>>0<p>>>0)&1;r=xl(K|0,J|0,L|0,0)|0;q=y;g=xl(g|0,m|0,(J>>>0<s>>>0|(J|0)==(s|0)&K>>>0<o>>>0)&1|0,0)|0;g=xl(g|0,y|0,(q>>>0<0|(q|0)==0&r>>>0<L>>>0)&1|0,0)|0;m=y;if((m|0)<0){p=n;k=t;o=r;s=q}else{o=r;k=t;break}}}else{q=r;n=p}j=j|((o|g|n|0)!=0|(q|m|k|0)!=0)&1}}else{j=-1;i=-1}K=Jl(j|0,i|0,1)|0;L=y;J=Il(j|0,i|0,63)|0;oi(f,a[h+3>>0]|0,0,w,J|u,y|v,K,L,h);l=x;return}while(0);L=h+2|0;a[L>>0]=a[L>>0]|1;L=f;c[L>>2]=0;c[L+4>>2]=-1073741824;b[f+8>>1]=-1;L=f+10|0;b[L>>1]=b[k>>1]|0;b[L+2>>1]=b[k+2>>1]|0;b[L+4>>1]=b[k+4>>1]|0;l=x;return}function ti(e,f,g){e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=f;h=c[j>>2]|0;j=c[j+4>>2]|0;f=f+8|0;i=c[f>>2]|0;f=c[f+4>>2]|0;o=f&65535;k=Il(i|0,f|0,48)|0;l=Il(i|0,f|0,63)|0;m=y;p=l&255;n=k&32767;a:do if(n<<16>>16<32767){switch(n<<16>>16){case 0:break;default:{q=16;break a}}if((i|h|0)==0&(o|j|0)==0){q=Jl(l|0,m|0,15)|0;g=e;c[g>>2]=0;c[g+4>>2]=0;b[e+8>>1]=q&32768;return}if(!((i|0)==0&(o|0)==0)){r=o>>>0<1|(o|0)==1&i>>>0<0;n=r?i:o;s=n>>>0<65536;n=s?n<<16:n;s=s?16:0;l=n>>>0<16777216;n=(((r?32:0)|(l?s|8:s)&255)+(d[10416+((l?n<<8:n)>>>24)>>0]|0)<<24)+-251658240|0;l=n>>24;s=Jl(h|0,j|0,l|0)|0;r=y;n=(n|0)==0;m=Jl(i|0,o|0,l|0)|0;f=y;k=Il(h|0,j|0,0-l&63|0)|0;l=1-l|0;h=s;j=r;i=n?i:k|m;f=n?o:y|f;break}o=j>>>0<1|(j|0)==1&h>>>0<0;s=o?h:j;r=s>>>0<65536;s=r?s<<16:s;r=r?16:0;i=s>>>0<16777216;s=(((o?32:0)|(i?r|8:r)&255)+(d[10416+((i?s<<8:s)>>>24)>>0]|0)<<24)+-251658240|0;i=s>>24;if((s|0)<0){k=Il(h|0,j|0,0-i|0)|0;f=y;h=Jl(h|0,j|0,i&63|0)|0;j=y}else{k=Jl(h|0,j|0,i|0)|0;f=y;h=0;j=0}l=-63-i|0;i=k}else{switch(n<<16>>16){case 32767:break;default:{q=16;break a}}if((i|h|0)==0&(o|j|0)==0){s=Jl(l|0,m|0,15)|0;r=e;c[r>>2]=0;c[r+4>>2]=-2147483648;b[e+8>>1]=s|32767;return}if(0==0&(f&2147450880|0)==2147418112?!((i|h|0)==0&(f&32767|j|0)==0):0){s=g+2|0;a[s>>0]=a[s>>0]|1}g=Jl(i|0,f|0,16)|0;p=y;q=Il(h|0,j|0,48)|0;p=Il(g|q|0,p|y|0,1)|0;q=y;g=(p|0)==0&(q|0)==0;s=Jl(l|0,m|0,15)|0;r=e;c[r>>2]=g?0:p;c[r+4>>2]=g?-1073741824:q|-2147483648;b[e+8>>1]=s|32767;return}while(0);if((q|0)==16){l=k&32767;f=o|65536}r=Jl(h|0,j|0,15)|0;s=y;n=Jl(i|0,f|0,15)|0;q=y;o=Il(h|0,j|0,49)|0;oi(e,80,p,l,n|o,q|y,r,s,g);return}function ui(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=d+8|0;g=h;r=c[g>>2]|0;g=c[g+4>>2]|0;q=Jl(r|0,g|0,1)|0;p=y;if(p>>>0>4294836223|(p|0)==-131073&q>>>0>4294967295){l=d;l=(c[l>>2]|r|0?1:(c[l+4>>2]|g&65535|0)!=0)&1}else l=0;if(0==0&(g&2147450880|0)==2147418112){n=d;n=(c[n>>2]|r|0?1:(c[n+4>>2]|g&32767|0)!=0)&1}else n=0;m=e+8|0;i=m;q=c[i>>2]|0;i=c[i+4>>2]|0;p=Jl(q|0,i|0,1)|0;o=y;if(o>>>0>4294836223|(o|0)==-131073&p>>>0>4294967295){k=e;k=(c[k>>2]|q|0?1:(c[k+4>>2]|i&65535|0)!=0)&1}else k=0;if(0==0&(i&2147450880|0)==2147418112){j=e;j=(c[j>>2]|q|0?1:(c[j+4>>2]|i&32767|0)!=0)&1}else j=0;p=g|32768;o=h;c[o>>2]=r;c[o+4>>2]=p;o=i|32768;c[m>>2]=q;c[m+4>>2]=o;if(j|n|0){m=f+2|0;a[m>>0]=a[m>>0]|1}if(!n){if(!(l<<24>>24)){c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}if(j|k^1|0){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}}else if(!j)if(!k){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}else{c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}g=Jl(r|0,p|0,1)|0;h=y;j=d;i=c[j>>2]|0;j=c[j+4>>2]|0;k=Jl(q|0,o|0,1)|0;l=y;m=e;f=c[m>>2]|0;m=c[m+4>>2]|0;n=(g|0)!=(k|0)|(h|0)!=(l|0);if(!((h>>>0>l>>>0|(h|0)==(l|0)&g>>>0>=k>>>0)&(n|(j>>>0>m>>>0|(j|0)==(m|0)&i>>>0>=f>>>0)))){c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}if(!((l>>>0>h>>>0|(l|0)==(h|0)&k>>>0>=g>>>0)&(n|(m>>>0>j>>>0|(m|0)==(j|0)&f>>>0>=i>>>0)))){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}if(p>>>0<o>>>0|(p|0)==(o|0)&r>>>0<q>>>0){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];return}else{c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];return}}function vi(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+32|0;h=x+16|0;g=x;w=b;q=c[w>>2]|0;w=c[w+4>>2]|0;k=b+8|0;m=c[k>>2]|0;k=c[k+4>>2]|0;s=k&65535;k=Il(m|0,k|0,48)|0;k=k&32767;u=d;v=c[u>>2]|0;u=c[u+4>>2]|0;t=d+8|0;j=c[t>>2]|0;t=c[t+4>>2]|0;o=t&65535;t=Il(j|0,t|0,48)|0;t=t&32767;n=k-t|0;do if((n|0)<=0){if((n|0)>=0){if((k|0)!=32767){b=xl(v|0,u|0,q|0,w|0)|0;i=y;g=xl(j|0,o|0,m|0,s|0)|0;g=xl(g|0,y|0,(i>>>0<w>>>0|(i|0)==(w|0)&b>>>0<q>>>0)&1|0,0)|0;h=y;if(k|0){j=b;d=h|131072;b=0;h=0;p=37;break}e=Jl(e&255|0,0,63)|0;f=a;c[f>>2]=b;c[f+4>>2]=i;f=a+8|0;c[f>>2]=g|e;c[f+4>>2]=h|y;l=x;return}if((m|q|v|j|0)==0?(s|w|u|o|0)==0:0){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];l=x;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ui(a,g,h,f);l=x;return}}if((t|0)==32767)if((j|v|0)==0&(o|u|0)==0){e=Jl(e&255|0,0,63)|0;f=a;c[f>>2]=0;c[f+4>>2]=0;f=a+8|0;c[f>>2]=e;c[f+4>>2]=y|2147418112;l=x;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ui(a,g,h,f);l=x;return}g=(k|0)==0;m=g?m:m;d=g?s:s|65536;g=n+(g&1)|0;h=0-g|0;b=g&63;if(!g){k=t;g=d;d=u;u=q;t=w;n=j;b=0;h=0;p=36}else{do if((g|0)<=-64)if((h|0)!=64)if((g|0)>-128){p=Jl(m|0,d|0,b|0)|0;n=y;b=Il(m|0,d|0,h&63|0)|0;r=q;s=w;q=p;p=0;g=0;i=y;h=n;break}else{h=(h|0)==128;r=q;s=w;q=h?m:((m|0)!=0|(d|0)!=0)&1;p=0;g=0;b=0;i=0;h=h?d:0;break}else{r=0;s=0;p=0;g=0;b=m;i=d;h=w}else{g=Jl(q|0,w|0,b|0)|0;n=y;k=Jl(m|0,d|0,b|0)|0;i=y;b=Il(q|0,w|0,h|0)|0;i=i|y;p=Il(m|0,d|0,h|0)|0;r=0;s=0;q=g;g=y;b=k|b;h=n}while(0);k=t;d=u;u=b;t=i;n=j;m=p;b=q|((r|0)!=0|(s|0)!=0)&1;p=36}}else{if((k|0)==32767)if((m|q|0)==0&(s|w|0)==0){c[a>>2]=c[b>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[a+12>>2]=c[b+12>>2];l=x;return}else{c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[h+12>>2]=c[d+12>>2];ui(a,g,h,f);l=x;return}if(!t){g=n+-1|0;if(!g){g=s;d=u;u=q;t=w;n=j;b=0;h=0;p=36;break}else{h=1;i=o}}else{g=n;h=0;i=o|65536}h=h-n&63;do if((g|0)>=64)if((g|0)!=64)if((g|0)<128){t=Jl(j|0,i|0,h|0)|0;h=y;b=Il(j|0,i|0,g&63|0)|0;n=0;o=0;d=y;r=v;p=u;i=t;break}else{t=(g|0)==128;n=0;o=0;b=0;d=0;h=t?i:0;r=v;p=u;i=t?j:((j|0)!=0|(i|0)!=0)&1;break}else{n=0;o=0;b=j;d=i;h=u;r=0;p=0;i=v}else{t=Jl(v|0,u|0,h|0)|0;r=y;h=Jl(j|0,i|0,h|0)|0;d=y;b=Il(v|0,u|0,g|0)|0;d=d|y;n=Il(j|0,i|0,g|0)|0;o=y;b=h|b;h=r;r=0;p=0;i=t}while(0);g=s;v=b;u=q;t=w;b=i|((r|0)!=0|(p|0)!=0)&1;p=36}while(0);if((p|0)==36){j=xl(v|0,d|0,u|0,t|0)|0;i=y;g=xl(n|0,o|0,m|0,g|65536|0)|0;g=xl(g|0,y|0,(i>>>0<t>>>0|(i|0)==(t|0)&j>>>0<u>>>0)&1|0,0)|0;d=y;if(d>>>0<131072|(d|0)==131072&g>>>0<0)k=k+-1|0;else p=37}if((p|0)==37){v=Jl(j|0,i|0,63)|0;w=y;u=Jl(g|0,d|0,63)|0;t=y;j=Il(j|0,i|0,1)|0;i=y|t;g=Il(g|0,d|0,1)|0;d=y;j=j|u;b=v|((b|0)!=0|(h|0)!=0)&1;h=w}yi(a,e,k,g,d,j,i,b,h,f);l=x;return}function wi(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;x=l;l=l+32|0;p=x+16|0;n=x;r=d;v=c[r>>2]|0;r=c[r+4>>2]|0;t=d+8|0;i=c[t>>2]|0;t=c[t+4>>2]|0;m=Il(i|0,t|0,48)|0;h=m&32767;o=e;A=c[o>>2]|0;o=c[o+4>>2]|0;z=e+8|0;j=c[z>>2]|0;z=c[z+4>>2]|0;k=Il(j|0,z|0,48)|0;k=k&32767;q=h-k|0;s=Jl(v|0,r|0,14)|0;u=y;t=Jl(i|0,t|0,14)|0;i=y&1073741823;r=Il(v|0,r|0,50)|0;r=t&-16384|r;i=i|y;t=Jl(A|0,o|0,14)|0;v=y;z=Jl(j|0,z|0,14)|0;j=y&1073741823;o=Il(A|0,o|0,50)|0;o=z&-16384|o;j=j|y;do if((q|0)>0){if((h|0)==32767)if((r|s|0)==0&(i|u|0)==0){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];l=x;return}else{c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ui(b,n,p,g);l=x;return}if(!k){k=q+-1|0;if(!k){n=t;m=v;k=o}else{m=k;k=1;w=34}}else{m=q;k=0;j=j|1073741824;w=34}do if((w|0)==34){k=k-q&63;if((m|0)<64){w=Jl(o|0,j|0,k|0)|0;A=y;z=Il(t|0,v|0,m|0)|0;A=A|y;n=Jl(t|0,v|0,k|0)|0;n=w|z|((n|0)!=0|(y|0)!=0)&1;k=Il(o|0,j|0,m|0)|0;m=A;j=y;break}if((m|0)==64){n=o|((t|0)!=0|(v|0)!=0)&1;m=j;k=0;j=0;break}if((m|0)<128){A=Il(o|0,j|0,m&63|0)|0;m=y;n=Jl(o|0,j|0,k|0)|0;n=A|((n|t|0)!=0|(y|v|0)!=0)&1;k=0;j=0;break}else{n=((o|t|0)!=0|(j|v|0)!=0)&1;m=0;k=0;j=0;break}}while(0);p=n;n=r;i=i|1073741824;w=42}else{if((q|0)>=0){m=m&32767;a:do if(m<<16>>16>=32767){switch(m<<16>>16){case 32767:break;default:break a}if((r|s|t|o|0)==0?(i|u|v|j|0)==0:0){A=g+2|0;a[A>>0]=a[A>>0]|1;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=0;c[A+4>>2]=-32768;l=x;return}else{c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ui(b,n,p,g);l=x;return}}else{switch(m<<16>>16){case 0:break;default:break a}h=1;k=1}while(0);if(j>>>0<i>>>0|(j|0)==(i|0)&o>>>0<r>>>0){p=t;m=v;n=r;k=o;w=42;break}if(!(i>>>0<j>>>0|(i|0)==(j|0)&r>>>0<o>>>0)){if(v>>>0<u>>>0|(v|0)==(u|0)&t>>>0<s>>>0){p=t;m=v;n=r;k=o;w=42;break}if(!(u>>>0<v>>>0|(u|0)==(v|0)&s>>>0<t>>>0)){z=Jl((a[g+1>>0]|0)==1|0,0,63)|0;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=z;c[A+4>>2]=y;l=x;return}else{h=k;m=s;n=u;k=r}}else{h=k;m=s;n=u;k=r}}else{if((k|0)==32767)if((o|t|0)==0&(j|v|0)==0){z=Jl((f^1)&255|0,0,63)|0;A=b;c[A>>2]=0;c[A+4>>2]=0;A=b+8|0;c[A>>2]=z;c[A+4>>2]=y|2147418112;l=x;return}else{c[n>>2]=c[d>>2];c[n+4>>2]=c[d+4>>2];c[n+8>>2]=c[d+8>>2];c[n+12>>2]=c[d+12>>2];c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];ui(b,n,p,g);l=x;return}h=(h|0)==0;p=h?r:r;i=h?i:i|1073741824;h=q+(h&1)|0;m=0-h|0;n=h&63;do if(h){if((h|0)>-64){r=Jl(p|0,i|0,n|0)|0;A=y;z=Il(s|0,u|0,m|0)|0;A=A|y;n=Jl(s|0,u|0,n|0)|0;n=r|z|((n|0)!=0|(y|0)!=0)&1;p=Il(p|0,i|0,m|0)|0;m=n;n=A;i=y;break}if((m|0)==64){m=p|((s|0)!=0|(u|0)!=0)&1;n=i;p=0;i=0;break}if((h|0)>-128){z=Il(p|0,i|0,m&63|0)|0;A=y;m=Jl(p|0,i|0,n|0)|0;m=z|((m|s|0)!=0|(y|u|0)!=0)&1;n=A;p=0;i=0;break}else{m=((p|s|0)!=0|(i|u|0)!=0)&1;n=0;p=0;i=0;break}}else{m=s;n=u}while(0);h=k;j=j|1073741824;k=p}z=yl(t|0,v|0,m|0,n|0)|0;A=y;j=yl(o|0,j|0,k|0,i|0)|0;i=(v>>>0<n>>>0|(v|0)==(n|0)&t>>>0<m>>>0)<<31>>31;i=xl(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;f=f^1;j=y;k=z;m=A}while(0);if((w|0)==42){z=yl(s|0,u|0,p|0,m|0)|0;A=y;j=yl(n|0,i|0,k|0,j|0)|0;i=(u>>>0<m>>>0|(u|0)==(m|0)&s>>>0<p>>>0)<<31>>31;i=xl(j|0,y|0,i|0,((i|0)<0)<<31>>31|0)|0;j=y;k=z;m=A}xi(b,f,h+-15|0,i,j,k,m,g);l=x;return}function xi(a,b,c,e,f,g,h,i){a=a|0;b=b|0;c=c|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;o=(e|0)==0&(f|0)==0;p=o?g:e;q=o?h:f;j=o?0:g;m=o?0:h;o=o?c+-64|0:c;k=q>>>0<1|(q|0)==1&p>>>0<0;g=k?p:q;l=g>>>0<65536;g=l?g<<16:g;l=l?16:0;n=g>>>0<16777216;g=(((k?32:0)|(n?l|8:l)&255)+(d[10416+((n?g<<8:g)>>>24)>>0]|0)<<24)+-251658240|0;n=g>>24;if((g|0)>-16777216){l=Jl(j|0,m|0,n|0)|0;c=y;h=(g|0)==0;g=Jl(p|0,q|0,n|0)|0;k=y;j=Il(j|0,m|0,0-n&63|0)|0;j=h?p:j|g;k=h?q:y|k;m=c;p=0;q=0;o=o-n|0;yi(a,b,o,j,k,l,m,p,q,i);return}e=0-n|0;f=n&63;do if((g|0)<=-1073741824)if((e|0)!=64)if((g|0)==-2147483648){e=(e|0)==128;k=j;l=m;j=e?p:((p|0)!=0|(q|0)!=0)&1;h=0;c=0;f=0;g=0;e=e?q:0;break}else{h=Jl(p|0,q|0,f|0)|0;r=y;f=Il(p|0,q|0,e&63|0)|0;k=j;l=m;j=h;h=0;c=0;g=y;e=r;break}else{k=0;l=0;h=0;c=0;f=p;g=q;e=m}else{c=Jl(j|0,m|0,f|0)|0;r=y;s=Jl(p|0,q|0,f|0)|0;g=y;f=Il(j|0,m|0,e|0)|0;g=g|y;h=Il(p|0,q|0,e|0)|0;k=0;l=0;j=c;c=y;f=s|f;e=r}while(0);m=c;p=f;q=g;r=j|((k|0)!=0|(l|0)!=0)&1;s=e;o=o-n|0;yi(a,b,o,h,m,p,q,r,s,i);return}function yi(b,d,e,f,g,h,i,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=a[l+1>>0]|0;t=s<<24>>24==0;m=Il(j|0,k|0,63)|0;do if(!t)if(s<<24>>24!=3)if(!(d<<24>>24)){m=((j|0)!=0|(k|0)!=0)&s<<24>>24==2&1;break}else{m=((j|0)!=0|(k|0)!=0)&s<<24>>24==1&1;break}else m=0;else m=m&255;while(0);a:do if(e>>>0>32764){do if((e|0)<=32765){if((e|0)==32765)if((f|0)!=-1|(g|0)!=131071|((h|0)!=-1|(i|0)!=-1)|m<<24>>24==0){e=32765;o=m;n=f;m=g;break a}else break;if((e|0)>=0){o=m;n=f;m=g;break a}do if(!(m<<24>>24!=0&((e|0)==-1&(a[l>>0]|0)!=1))){m=0-e|0;n=e&63;if((e|0)<=-64)if((m|0)!=64){h=j|h;i=k|i;if((e|0)>-128){o=Jl(f|0,g|0,n|0)|0;q=y;g=Il(f|0,g|0,m&63|0)|0;j=h;k=i;e=1;n=0;m=0;h=g;i=y;break}else{q=(m|0)==128;j=h;k=i;o=q?f:((f|0)!=0|(g|0)!=0)&1;q=q?g:0;e=1;n=0;m=0;h=0;i=0;break}}else{o=h;q=i;e=1;n=0;m=0;h=f;i=g}else{p=1;r=19}}else{p=g>>>0<131071|(g|0)==131071&f>>>0<4294967295|(f|0)==-1&(g|0)==131071&((h|0)!=-1|(i|0)!=-1);n=e&63;m=0-e|0;r=19}while(0);if((r|0)==19){o=Jl(h|0,i|0,n|0)|0;q=y;r=Jl(f|0,g|0,n|0)|0;n=y;h=Il(h|0,i|0,m|0)|0;i=n|y;n=Il(f|0,g|0,m|0)|0;e=p;m=y;h=r|h}j=o|((j|0)!=0|(k|0)!=0)&1;k=(j|0)!=0|(q|0)!=0;if(e&k){g=l+2|0;a[g>>0]=a[g>>0]|16}if(t){o=Il(o|0,q|0,63)|0;e=0;o=o&255;k=q;break a}if(!(d<<24>>24)){e=0;o=s<<24>>24==2&k&1;k=q;break a}else{e=0;o=s<<24>>24==1&k&1;k=q;break a}}while(0);l=l+2|0;a[l>>0]=a[l>>0]|40;if((s<<24>>24!=3?!(d<<24>>24!=0&s<<24>>24==2):0)?!(d<<24>>24==0&s<<24>>24==1):0){t=Jl(d&255|0,0,63)|0;s=0;g=0;l=y|2147418112;d=b;f=d;c[f>>2]=s;d=d+4|0;c[d>>2]=g;d=b+8|0;b=d;c[b>>2]=t;d=d+4|0;c[d>>2]=l;return}Jl(d&255|0,0,63)|0;s=-1;g=-1;t=-1;l=y|2147418111;d=b;f=d;c[f>>2]=s;d=d+4|0;c[d>>2]=g;d=b+8|0;b=d;c[b>>2]=t;d=d+4|0;c[d>>2]=l;return}else{o=m;n=f;m=g}while(0);if(!((j|0)==0&(k|0)==0)){l=l+2|0;a[l>>0]=a[l>>0]|32}if(!(o<<24>>24))e=(h|n|0)==0&(i|m|0)==0?0:e;else{g=xl(h|0,i|0,1,0)|0;l=y;n=xl(n|0,m|0,(h|0)==-1&(i|0)==-1&1|0,0)|0;i=~(t&((j|0)==0&(k&2147483647|0)==0)&1);m=y;h=g&i;i=l&((i|0)<0)<<31>>31}l=Jl(d&255|0,0,63)|0;g=y;s=Jl(e|0,0,48)|0;t=y;g=xl(n|0,m|0,l|0,g|0)|0;t=xl(g|0,y|0,s|0,t|0)|0;s=h;g=i;l=y;d=b;f=d;c[f>>2]=s;d=d+4|0;c[d>>2]=g;d=b+8|0;b=d;c[b>>2]=t;d=d+4|0;c[d>>2]=l;return} +function ne(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=l;l=l+240|0;u=y+224|0;m=y+216|0;i=y+208|0;j=y+200|0;s=y+192|0;p=y+184|0;o=y+176|0;n=y+168|0;h=y+160|0;q=y;w=y+212|0;x=y+152|0;v=y+136|0;k=y+144|0;r=y+128|0;e=c[d>>2]|0;c[w>>2]=e;a:while(1){f=a[e>>0]|0;b:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break a;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break b;default:{}}e=e+1|0}}case 42:break;default:break a}e=e+2|0;c:while(1)switch(a[e>>0]|0){case 0:break b;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break c;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;if(!(f<<24>>24)){me(b,18018,h);l=y;return}d:do if((g+-48|0)>>>0<10){u=jl(e,w,0)|0;v=x;c[v>>2]=1;c[v+4>>2]=u}else switch(f<<24>>24){case 34:{oe(x,w);break d}case 123:{e=e+1|0;c[w>>2]=e;i=Le(12)|0;c[x>>2]=2;c[x+4>>2]=i;i=k+4|0;h=q+1|0;j=q;e:while(1){f=a[e>>0]|0;f:do if(!(fl(f<<24>>24)|0)){g:do if(f<<24>>24==47){switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break f;default:{}}e=e+1|0}}case 42:break;default:break g}e=e+2|0;h:while(1)switch(a[e>>0]|0){case 0:break f;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break h;else e=f;break}default:e=e+1|0}e=e+2|0;break f}while(0);c[w>>2]=e;f=a[e>>0]|0;g=f<<24>>24;switch(f<<24>>24){case 125:{t=38;break e}case 34:{oe(k,w);e=c[i>>2]|0;if((c[k>>2]|0)==7){t=40;break e}break}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){t=48;break e}a[q>>0]=f;e=e+1|0;g=a[e>>0]|0;t=g<<24>>24;if((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26)))){f=e;e=h;do{if((e-j|0)>126){t=48;break e}a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;t=g<<24>>24}while((t+-48|0)>>>0<10|((t+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(t+-65|0)>>>0<26))))}else{f=e;e=h}c[w>>2]=f;a[e>>0]=0;t=gk(q)|0;e=Tj(t+5|0)|0;c[e>>2]=t;Ll(e+4|0,q|0,t+1|0)|0}}if(!(c[e>>2]|0)){t=48;break e}f=c[w>>2]|0;i:while(1){g=a[f>>0]|0;j:do if(!(fl(g<<24>>24)|0)){if(g<<24>>24!=47)break i;switch(a[f+1>>0]|0){case 47:{f=f+2|0;while(1){switch(a[f>>0]|0){case 10:case 0:break j;default:{}}f=f+1|0}}case 42:break;default:break i}f=f+2|0;k:while(1)switch(a[f>>0]|0){case 0:break j;case 42:{g=f+1|0;if((a[g>>0]|0)==47)break k;else f=g;break}default:f=f+1|0}f=f+2|0}else f=f+1|0;while(0)}c[w>>2]=f;if((a[f>>0]|0)!=58){t=65;break e}c[w>>2]=f+1;ne(v,w);c[m>>2]=c[x>>2];c[m+4>>2]=c[x+4>>2];c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];ie(m,e+4|0,u)|0;e=c[w>>2]|0;l:while(1){f=a[e>>0]|0;m:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break l;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break m;default:{}}e=e+1|0}}case 42:break;default:break l}e=e+2|0;n:while(1)switch(a[e>>0]|0){case 0:break m;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break n;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 125:break f;case 44:break;default:{t=83;break e}}e=e+1|0;c[w>>2]=e}else e=e+1|0;while(0)}if((t|0)==38){c[w>>2]=e+1;break d}else if((t|0)==40){c[b>>2]=7;c[b+4>>2]=e;l=y;return}else if((t|0)==48){me(b,18041,n);l=y;return}else if((t|0)==65){me(b,18063,o);l=y;return}else if((t|0)==83){me(b,18076,p);l=y;return}break}case 91:{e=e+1|0;c[w>>2]=e;n=Le(12)|0;c[x>>2]=3;c[x+4>>2]=n;o=n+8|0;p=n+4|0;m=n+8|0;q=n+8|0;j=0;o:while(1){p:while(1){f=a[e>>0]|0;q:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break p;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break q;default:{}}e=e+1|0}}case 42:break;default:break p}e=e+2|0;r:while(1)switch(a[e>>0]|0){case 0:break q;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break r;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;if((a[e>>0]|0)==93){t=101;break}ne(r,w);i=r;h=c[i>>2]|0;i=c[i+4>>2]|0;k=v;c[k>>2]=h;c[k+4>>2]=i;k=j+1|0;e=c[n>>2]|0;if(e>>>0<=j>>>0){if((e|0)==(j|0)){e=c[p>>2]|0;if((e|0)>(j|0)){f=k;g=c[m>>2]|0;e=j}else{e=(e*3|0)/2|0;e=(k|0)>(e|0)?k:e;g=Vj(c[q>>2]|0,e<<3)|0;c[q>>2]=g;c[p>>2]=e;e=c[n>>2]|0;f=e+1|0}c[n>>2]=f;e=g+(e<<3)|0;t=109}}else{e=(c[o>>2]|0)+(j<<3)|0;c[u>>2]=c[e>>2];c[u+4>>2]=c[e+4>>2];je(u);e=(c[o>>2]|0)+(j<<3)|0;t=109}if((t|0)==109){t=0;j=e;c[j>>2]=h;c[j+4>>2]=i}e=c[w>>2]|0;s:while(1){f=a[e>>0]|0;t:do if(!(fl(f<<24>>24)|0)){if(f<<24>>24!=47)break s;switch(a[e+1>>0]|0){case 47:{e=e+2|0;while(1){switch(a[e>>0]|0){case 10:case 0:break t;default:{}}e=e+1|0}}case 42:break;default:break s}e=e+2|0;u:while(1)switch(a[e>>0]|0){case 0:break t;case 42:{f=e+1|0;if((a[f>>0]|0)==47)break u;else e=f;break}default:e=e+1|0}e=e+2|0}else e=e+1|0;while(0)}c[w>>2]=e;switch(a[e>>0]|0){case 44:{e=e+1|0;c[w>>2]=e;break}case 93:break;default:break o}j=k}if((t|0)==101){c[w>>2]=e+1;break d}me(b,18097,s);l=y;return}default:{if((g+-97|0)>>>0>25&((f<<24>>24==36|(f<<24>>24==95|(g+-65|0)>>>0<26))^1)){me(b,18159,i);l=y;return}a[q>>0]=f;f=e+1|0;e=q+1|0;g=a[f>>0]|0;v=g<<24>>24;v:do if((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26)))){h=q;while(1){if((e-h|0)>126)break v;a[e>>0]=g;f=f+1|0;e=e+1|0;g=a[f>>0]|0;v=g<<24>>24;if(!((v+-48|0)>>>0<10|((v+-97|0)>>>0<26|(g<<24>>24==36|(g<<24>>24==95|(v+-65|0)>>>0<26))))){t=134;break}}}else t=134;while(0);if((t|0)==134){c[w>>2]=f;a[e>>0]=0;if(!(fk(q,18118)|0)){v=x;c[v>>2]=5;c[v+4>>2]=0;break d}if(!(fk(q,18123)|0)){v=x;c[v>>2]=4;c[v+4>>2]=1;break d}if(!(fk(q,18128)|0)){v=x;c[v>>2]=4;c[v+4>>2]=0;break d}}c[j>>2]=q;me(b,18134,j);l=y;return}}while(0);c[d>>2]=c[w>>2];d=x;w=c[d+4>>2]|0;x=b;c[x>>2]=c[d>>2];c[x+4>>2]=w;l=y;return}function oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+4144|0;r=s+4128|0;q=s+4120|0;p=s+4112|0;o=s+4104|0;n=s+4096|0;m=s;j=m+4095|0;e=(c[d>>2]|0)+1|0;k=m;a:while(1){h=e+1|0;i=a[e>>0]|0;f=i<<24>>24;b:do switch(i<<24>>24){case 0:case 10:{e=3;break a}case 34:{e=23;break a}case 92:{g=e+2|0;f=a[h>>0]|0;switch(f|0){case 92:case 34:case 39:{e=g;break b}case 110:{f=10;e=g;break b}case 114:{f=13;e=g;break b}case 116:{f=9;e=g;break b}case 120:{g=a[g>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=12;break a}else{i=h+-87|0;break}else{i=h+-55|0;break}else i=f;while(0);g=a[e+3>>0]|0;h=g<<24>>24;f=h+-48|0;do if(f>>>0>=10)if((h+-65|0)>>>0>=6)if(g<<24>>24<87|(h+-97|0)>>>0>5){e=17;break a}else{f=h+-87|0;break}else{f=h+-55|0;break}while(0);f=f|i<<4;e=e+4|0;break b}default:{e=19;break a}}}default:e=h}while(0);if(k>>>0>=j>>>0){e=21;break}a[k>>0]=f;k=k+1|0}if((e|0)==3){me(b,18180,n);l=s;return}else if((e|0)==12){me(b,18200,o);l=s;return}else if((e|0)==17){me(b,18200,p);l=s;return}else if((e|0)==19){me(b,18218,q);l=s;return}else if((e|0)==21){me(b,18238,r);l=s;return}else if((e|0)==23){a[k>>0]=0;c[d>>2]=h;q=gk(m)|0;r=Tj(q+5|0)|0;c[r>>2]=q;Ll(r+4|0,m|0,q+1|0)|0;c[b>>2]=0;c[b+4>>2]=r;l=s;return}}function pe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+32|0;k=n+24|0;m=n+16|0;i=n+20|0;j=n+8|0;g=n;c[i>>2]=d;ne(g,i);h=c[g>>2]|0;g=c[g+4>>2]|0;f=j;c[f>>2]=h;c[f+4>>2]=g;if((h|0)==7){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return}d=c[i>>2]|0;a:while(1){e=a[d>>0]|0;b:do if(!(fl(e<<24>>24)|0)){if(e<<24>>24!=47){f=19;break a}switch(a[d+1>>0]|0){case 47:{d=d+2|0;while(1){switch(a[d>>0]|0){case 10:case 0:break b;default:{}}d=d+1|0}}case 42:break;default:{f=8;break a}}d=d+2|0;c:while(1)switch(a[d>>0]|0){case 0:break b;case 42:{e=d+1|0;if((a[e>>0]|0)==47)break c;else d=e;break}default:d=d+1|0}d=d+2|0}else d=d+1|0;while(0)}if((f|0)==8)c[i>>2]=d;else if((f|0)==19?(c[i>>2]=d,e<<24>>24==0):0){m=b;c[m>>2]=h;c[m+4>>2]=g;l=n;return};c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];je(k);me(b,18254,m);l=n;return}function qe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=l;l=l+16|0;g=f;h=Tj(e+1|0)|0;Ll(h|0,d|0,e|0)|0;a[h+e>>0]=0;pe(g,h);d=g;g=c[d>>2]|0;d=c[d+4>>2]|0;Uj(h);e=b;c[e>>2]=g;c[e+4>>2]=d;l=f;return}function re(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=Le(16)|0;h=Le(1168)|0;j=h+8|0;hk(j,b)|0;i=Rk(j,47)|0;a[((i|0)==0?j:i+1|0)>>0]=0;i=h+1064|0;c[i>>2]=i;c[h+1068>>2]=i;c[h+4>>2]=d;c[h+1036>>2]=e;c[h+1040>>2]=f;c[h>>2]=g;c[g+12>>2]=h;c[g>>2]=5;c[g+4>>2]=2;c[g+8>>2]=3;nd(b,0,0,g,12,1)|0;return g|0}function se(a){a=a|0;a=(c[a+12>>2]|0)+1048|0;y=c[a+4>>2]|0;return c[a>>2]|0}function te(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=0;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1096|0;g=h;g=xl(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return ze(a,1)|0}function ue(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=c[a+12>>2]|0;c[i+1120>>2]=1;j=i+1128|0;c[j>>2]=b;c[j+4>>2]=d;c[i+1156>>2]=e;c[i+1144>>2]=f;c[i+1140>>2]=0;c[i+1148>>2]=g;c[i+1152>>2]=h;h=i+1112|0;g=h;g=xl(c[g>>2]|0,c[g+4>>2]|0,f|0,((f|0)<0)<<31>>31|0)|0;c[h>>2]=g;c[h+4>>2]=y;return ze(a,1)|0}function ve(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;G=l;l=l+1280|0;B=G+128|0;E=G+1248|0;D=G+1240|0;C=G+1232|0;o=G+1224|0;n=G+1216|0;k=G+1200|0;i=G+1184|0;h=G+1176|0;g=G+1168|0;j=G+1256|0;x=G+1160|0;z=G+1152|0;f=G+1208|0;m=G+1192|0;A=G;v=G+1264|0;u=a+12|0;w=c[u>>2]|0;if((b|0)<0){t=c[3662]|0;c[g>>2]=0-b;nl(t,18287,g)|0;Da(1)}qe(f,d,e);r=f;t=c[r>>2]|0;r=c[r+4>>2]|0;s=x;c[s>>2]=t;c[s+4>>2]=r;if((t|0)==7){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[h>>2]=le(B)|0;_e(18992,h);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if(($e(B,18330,j)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}s=c[j>>2]|0;t=s<<1;b=w+1056|0;c[b>>2]=t;if((s|0)>=1?(t+-1&t|0)==0:0){a=w+1060|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if(($e(B,18361,a)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}a=c[a>>2]|0;if((a|0)<1){_e(18369,k);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}s=c[b>>2]|0;s=Dl(s|0,((s|0)<0)<<31>>31|0,a|0,((a|0)<0)<<31>>31|0)|0;t=y;r=w+1048|0;c[r>>2]=s;c[r+4>>2]=t;c[w+1072>>2]=0;r=(c[w+4>>2]|0)/(c[j>>2]|0)|0;c[w+1076>>2]=(r|0)>1?r:1;c[w+1136>>2]=-1;c[w+1080>>2]=8;t=xl(s|0,t|0,7,0)|0;t=Bl(t|0,y|0,8,0)|0;c[w+1088>>2]=t;c[w+1084>>2]=Le(t<<2)|0;t=w+1160|0;c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];if((af(B,18386,t,1)|0)<0){c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}if((c[t>>2]|0)>32){_e(18405,n);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];he(m,B,18437);b=m;a=c[b>>2]|0;b=c[b+4>>2]|0;s=z;c[s>>2]=a;c[s+4>>2]=b;if((a|0)!=6){if((a|0)!=3){_e(18446,o);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}q=c[b>>2]|0;a:do if((q|0)>0){p=v+4|0;r=w+1064|0;s=w+1068|0;o=0;b:while(1){b=q-o|0;n=c[t>>2]|0;n=(b|0)<(n|0)?b:n;b=(n|0)>0;c:do if(b){a=0;do{c[B>>2]=c[z>>2];c[B+4>>2]=c[z+4>>2];ke(v,B,a+o|0);if((c[v>>2]|0)!=1)break b;c[A+(a<<2)>>2]=c[p>>2];a=a+1|0}while((a|0)<(n|0));if((n|0)==1){d=c[A>>2]|0;b=c[s>>2]|0;d:do if((b|0)!=(r|0)){a=b;while(1){if((c[a+12>>2]|0)==(d|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break d}if((b|0)==(a|0))if(!b)break;else break c;else{j=c[a>>2]|0;k=a+4|0;m=c[k>>2]|0;c[j+4>>2]=m;c[m>>2]=j;c[a>>2]=0;c[k>>2]=0;m=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[k>>2]=m;c[m>>2]=a;break c}}while(0);k=c[u>>2]|0;m=we(k,d)|0;j=k+1104|0;i=j;i=xl(c[i>>2]|0,c[i+4>>2]|0,1,0)|0;c[j>>2]=i;c[j+4>>2]=y;c[D>>2]=k+8;c[D+4>>2]=d;nk(B,1024,18488,D)|0;nd(B,0,0,m,13,1)|0}else F=35}else F=35;while(0);if((F|0)==35){F=0;j=(o|0)/(c[t>>2]|0)|0;k=c[u>>2]|0;m=Tj(140)|0;c[m>>2]=k;c[m+4>>2]=j;c[m+8>>2]=n;do if(b){g=k+1064|0;h=k+1068|0;i=m+12|0;a=0;f=0;do{e=c[A+(f<<2)>>2]|0;d=c[h>>2]|0;e:do if((d|0)!=(g|0)){b=d;while(1){if((c[b+12>>2]|0)==(e|0))break;b=c[b+4>>2]|0;if((b|0)==(g|0)){F=44;break e}}if((d|0)==(b|0))if(!d){F=44;break}else{b=0;break}else{H=c[b>>2]|0;d=b+4|0;e=c[d>>2]|0;c[H+4>>2]=e;c[e>>2]=H;c[b>>2]=0;c[d>>2]=0;e=c[h>>2]|0;c[h>>2]=b;c[b>>2]=g;c[d>>2]=e;c[e>>2]=b;b=0;break}}else F=44;while(0);if((F|0)==44){F=0;b=we(k,e)|0;a=1}c[i+(f<<2)>>2]=b;f=f+1|0}while((f|0)!=(n|0));if(!a){F=48;break}c[E>>2]=k+8;c[E+4>>2]=j;nk(B,1024,18502,E)|0;nd(B,0,0,m,14,1)|0}else F=48;while(0);if((F|0)==48){F=0;Uj(m)}}o=n+o|0;if((q|0)<=(o|0))break a}_e(18466,C);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}while(0)};c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);a=c[w+1036>>2]|0;if(!a){l=G;return}db[a&15](c[w+1040>>2]|0);l=G;return}_e(18341,i);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];je(B);Da(1)}function we(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;h=a+1072|0;d=c[h>>2]|0;i=a+1076|0;g=a+1064|0;a:do if((d|0)>=(c[i>>2]|0)?(e=c[g>>2]|0,(e|0)!=(g|0)):0)do{f=e;e=c[e>>2]|0;if((c[f+16>>2]|0)==1){c[h>>2]=d+-1;Ia(f+20|0);j=c[f>>2]|0;d=c[f+4>>2]|0;c[j+4>>2]=d;c[d>>2]=j;Uj(f);d=c[h>>2]|0;if((d|0)<(c[i>>2]|0))break a}}while((e|0)!=(g|0));while(0);j=Le(28)|0;c[j+8>>2]=a;c[j+12>>2]=b;c[j+16>>2]=0;b=j+20|0;Ga(b|0);Ja(b|0,c[a+1056>>2]<<9|0)|0;b=a+1068|0;i=c[b>>2]|0;c[b>>2]=j;c[j>>2]=g;c[j+4>>2]=i;c[i>>2]=j;c[h>>2]=(c[h>>2]|0)+1;return j|0}function xe(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=l;l=l+16|0;f=h;if((b|0)<0){g=c[3662]|0;c[f>>2]=c[a+12>>2];nl(g,18660,f)|0;Da(1)}g=c[a+8>>2]|0;if((c[g+1056>>2]<<9|0)!=(e|0))ja(18685,18580,366,18714);b=c[g>>2]|0;f=a+16|0;if(c[f>>2]|0)ja(18617,18580,346,18644);La(a+20|0,0,d|0,e|0);c[f>>2]=1;if((c[a+12>>2]|0)!=(c[g+1136>>2]|0)){l=h;return}ze(b,0)|0;l=h;return}function ye(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0;m=l;l=l+16|0;f=m;if((b|0)<0){k=c[3662]|0;c[f>>2]=c[a+4>>2];nl(k,18516,f)|0;Da(1)}j=c[(c[a>>2]|0)+1056>>2]<<9;k=a+8|0;b=c[k>>2]|0;if((N(j,b)|0)!=(e|0))ja(18541,18580,252,18592);if((b|0)<=0){Uj(a);l=m;return}f=a+12|0;b=0;while(1){e=c[f+(b<<2)>>2]|0;if(e|0){g=c[e+8>>2]|0;h=c[g>>2]|0;i=e+16|0;if(c[i>>2]|0){b=9;break}n=d+(N(b,j)|0)|0;La(e+20|0,0,n|0,c[g+1056>>2]<<9|0);c[i>>2]=1;if((c[e+12>>2]|0)==(c[g+1136>>2]|0))ze(h,0)|0}b=b+1|0;if((b|0)>=(c[k>>2]|0)){b=13;break}}if((b|0)==9)ja(18617,18580,346,18644);else if((b|0)==13){Uj(a);l=m;return}}function ze(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0;E=l;l=l+1040|0;C=E+1024|0;B=E;w=a+12|0;x=c[w>>2]|0;z=x+1144|0;A=x+1140|0;a=c[A>>2]|0;d=(c[z>>2]|0)-a|0;a:do if(d|0){m=x+1128|0;n=x+1080|0;o=x+1084|0;p=x+1056|0;q=x+1136|0;r=x+1064|0;s=x+1068|0;t=x+1120|0;u=x+1156|0;v=x+1092|0;b:while(1){i=m;h=c[i>>2]|0;i=c[i+4>>2]|0;e=c[n>>2]|0;f=((e|0)<0)<<31>>31;k=Fl(h|0,i|0,e|0,f|0)|0;g=y;j=c[(c[o>>2]|0)+(k<<2)>>2]|0;do if(!j){e=c[p>>2]|0;f=((e|0)<0)<<31>>31;g=Fl(h|0,i|0,e|0,f|0)|0;f=Dl(g|0,y|0,e|0,f|0)|0;f=yl(h|0,i|0,f|0,y|0)|0;e=e-f|0;d=(d|0)<(e|0)?d:e;c[q>>2]=g;e=c[s>>2]|0;if((e|0)==(r|0))break b;a=e;while(1){if((c[a+12>>2]|0)==(g|0))break;a=c[a+4>>2]|0;if((a|0)==(r|0))break b}if((e|0)==(a|0)){if(!e)break b}else{h=c[a>>2]|0;i=a+4|0;j=c[i>>2]|0;c[h+4>>2]=j;c[j>>2]=h;c[a>>2]=0;c[i>>2]=0;j=c[s>>2]|0;c[s>>2]=a;c[a>>2]=r;c[i>>2]=j;c[j>>2]=a}if(!(c[a+16>>2]|0)){a=1;D=23;break b}if(!(c[t>>2]|0)){Ha(a+20|0,f<<9|0,(c[u>>2]|0)+(c[A>>2]<<9)|0,d<<9|0);a=(c[A>>2]|0)+d|0;c[A>>2]=a;j=m;j=xl(c[j>>2]|0,c[j+4>>2]|0,d|0,((d|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y;c[q>>2]=-1;break}else{h=Le(8)|0;i=c[n>>2]<<9;j=Tj(i)|0;Ga(h|0);Ja(h|0,i|0)|0;c[(c[o>>2]|0)+(k<<2)>>2]=h;k=N(c[n>>2]|0,k)|0;Ha(a+20|0,((c[p>>2]|0)+-1&k)<<9|0,j|0,i|0);La(h|0,0,j|0,i|0);Uj(j);c[v>>2]=(c[v>>2]|0)+1;a=c[A>>2]|0;break}}else{f=Dl(k|0,g|0,e|0,f|0)|0;f=yl(h|0,i|0,f|0,y|0)|0;e=e-f|0;e=(d|0)<(e|0)?d:e;f=f<<9;a=(c[u>>2]|0)+(a<<9)|0;d=e<<9;if(!(c[t>>2]|0))Ha(j|0,f|0,a|0,d|0);else La(j|0,f|0,a|0,d|0);a=(c[A>>2]|0)+e|0;c[A>>2]=a;j=m;j=xl(c[j>>2]|0,c[j+4>>2]|0,e|0,((e|0)<0)<<31>>31|0)|0;k=m;c[k>>2]=j;c[k+4>>2]=y}while(0);d=(c[z>>2]|0)-a|0;if(!d)break a}if((D|0)==23){l=E;return a|0}b=c[w>>2]|0;D=we(b,g)|0;A=b+1104|0;z=A;z=xl(c[z>>2]|0,c[z+4>>2]|0,1,0)|0;c[A>>2]=z;c[A+4>>2]=y;c[C>>2]=b+8;c[C+4>>2]=g;nk(B,1024,18488,C)|0;nd(B,0,0,D,13,1)|0;D=1;l=E;return D|0}while(0);if(b|0){D=0;l=E;return D|0}eb[c[x+1148>>2]&15](c[x+1152>>2]|0,0);D=0;l=E;return D|0}function Ae(){var a=0;a=Le(2592)|0;c[a+2568>>2]=9;c[a+2572>>2]=7;c[a+2576>>2]=2;c[a+2580>>2]=5;return a|0}function Be(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;i=c[a>>2]|0;if((i|0)>=32)ja(18729,18770,85,18778);if(!(((e|0)!=0|(f|0)!=0)&((e&4095|0)==0&0==0)))ja(18797,18770,86,18778);c[a>>2]=i+1;h=a+8+(i*80|0)|0;c[h>>2]=a;c[a+8+(i*80|0)+32>>2]=1;c[a+8+(i*80|0)+36>>2]=g&-5;j=a+8+(i*80|0)+8|0;c[j>>2]=b;c[j+4>>2]=d;b=a+8+(i*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(g&4|0)==0;j=a+8+(i*80|0)+24|0;c[j>>2]=b?e:0;c[j+4>>2]=b?f:0;j=a+8+(i*80|0)+40|0;c[j>>2]=0;b=a+8+(i*80|0)+48|0;c[b>>2]=0;d=Le(e)|0;c[j>>2]=d;if(!d){ll(18847,29,1,c[3662]|0)|0;Da(1)}if(!(g&2))return h|0;f=Il(e|0,f|0,12)|0;f=(f+31|0)>>>5<<2;g=a+8+(i*80|0)+44|0;c[g>>2]=f;j=a+8+(i*80|0)+60|0;c[j>>2]=0;c[a+8+(i*80|0)+52>>2]=Le(f)|0;c[a+8+(i*80|0)+56>>2]=Le(c[g>>2]|0)|0;c[b>>2]=c[a+8+(i*80|0)+52+(c[j>>2]<<2)>>2];return h|0}function Ce(a,b){a=a|0;b=b|0;Uj(c[b+40>>2]|0);return}function De(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=b+48|0;i=c[h>>2]|0;f=b+44|0;d=c[f>>2]|0;g=d>>>2;a:do if(g){e=0;while(1){if(c[i+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>=g>>>0)break a}g=b+24|0;if(!((c[g>>2]|0)==0&(c[g+4>>2]|0)==0)){fb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);d=c[f>>2]|0}}while(0);f=b+60|0;g=c[f>>2]^1;c[f>>2]=g;b=c[b+52+(g<<2)>>2]|0;c[h>>2]=b;Nl(b|0,0,d|0)|0;return i|0}function Ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=b+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!f){if(g)return;if(c[b+32>>2]|0)fb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[b+16>>2]|0);e=b+8|0;c[e>>2]=0;c[e+4>>2]=0;c[h>>2]=0;c[h+4>>2]=0;return}if(!g?(f=b+8|0,(c[f>>2]|0)==(d|0)?(c[f+4>>2]|0)==(e|0):0):0)return;if(!(c[b+32>>2]|0))a=b+16|0;else{f=b+16|0;fb[c[a+2588>>2]&15](c[a+2584>>2]|0,c[b+40>>2]|0,c[f>>2]|0);a=f}b=b+8|0;c[b>>2]=d;c[b+4>>2]=e;d=a;e=c[d+4>>2]|0;c[h>>2]=c[d>>2];c[h+4>>2]=e;return}function Fe(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)<=0){Uj(a);return}e=a+2572|0;d=0;do{if(c[a+8+(d*80|0)+32>>2]|0){eb[c[e>>2]&15](a,a+8+(d*80|0)|0);b=c[a>>2]|0}d=d+1|0}while((d|0)<(b|0));Uj(a);return}function Ge(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;h=c[a>>2]|0;if((h|0)<=0){i=0;return i|0}e=0;while(1){f=a+8+(e*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(j=a+8+(e*80|0)+24|0,g=xl(c[j>>2]|0,c[j+4>>2]|0,g|0,f|0)|0,f=y,f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0):0)break;e=e+1|0;if((e|0)>=(h|0)){e=0;i=7;break}}if((i|0)==7)return e|0;j=a+8+(e*80|0)|0;return j|0}function He(a,b,d,e,f,g,h,i,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0;k=c[a>>2]|0;if((k|0)>=32)ja(18729,18770,197,18877);if(f>>>0<1|(f|0)==1&e>>>0<0){c[a>>2]=k+1;l=a+8+(k*80|0)|0;c[l>>2]=a;m=a+8+(k*80|0)+8|0;c[m>>2]=b;c[m+4>>2]=d;b=a+8+(k*80|0)+16|0;c[b>>2]=e;c[b+4>>2]=f;b=(j&16|0)==0;d=a+8+(k*80|0)+24|0;c[d>>2]=b?e:0;c[d+4>>2]=b?f:0;c[a+8+(k*80|0)+32>>2]=0;c[a+8+(k*80|0)+64>>2]=g;c[a+8+(k*80|0)+68>>2]=h;c[a+8+(k*80|0)+72>>2]=i;c[a+8+(k*80|0)+76>>2]=j;return l|0}else ja(18897,18770,198,18877);return 0}function Ie(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=c[a>>2]|0;if(c[a+32>>2]|0){hb[c[f+2580>>2]&7](f,a,b,d,e);return}h=a+24|0;g=h;g=(c[g>>2]|0)==0&(c[g+4>>2]|0)==0;if(!e){if(g)return;d=a+8|0;c[d>>2]=0;c[d+4>>2]=0;d=h;c[d>>2]=0;c[d+4>>2]=0;return}f=a+8|0;if(!g?(e=f,(c[e>>2]|0)==(b|0)?(c[e+4>>2]|0)==(d|0):0):0)return;e=f;c[e>>2]=b;c[e+4>>2]=d;a=a+16|0;b=c[a+4>>2]|0;d=h;c[d>>2]=c[a>>2];c[d+4>>2]=b;return}function Je(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=c[a>>2]|0;if((i|0)<=0){k=0;return k|0}h=0;while(1){f=a+8+(h*80|0)+8|0;g=c[f>>2]|0;f=c[f+4>>2]|0;if(!(f>>>0>d>>>0|(f|0)==(d|0)&g>>>0>b>>>0)?(l=a+8+(h*80|0)+24|0,l=xl(c[l>>2]|0,c[l+4>>2]|0,g|0,f|0)|0,m=y,m>>>0>d>>>0|(m|0)==(d|0)&l>>>0>b>>>0):0)break;f=h+1|0;if((f|0)<(i|0))h=f;else{f=0;k=11;break}}if((k|0)==11)return f|0;if(!(c[a+8+(h*80|0)+32>>2]|0)){m=0;return m|0}f=yl(b|0,d|0,g|0,f|0)|0;if(e|0?(m=c[a+8+(h*80|0)+48>>2]|0,j=m+(f>>>17<<2)|0,m|0):0)c[j>>2]=c[j>>2]|1<<(f>>>12&31);m=(c[a+8+(h*80|0)+40>>2]|0)+f|0;return m|0}function Ke(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;c[a>>2]=b;c[a+4>>2]=d;c[a+8>>2]=e;return}function Le(a){a=a|0;var b=0;b=Tj(a)|0;if(!b){b=0;return b|0}Nl(b|0,0,a|0)|0;return b|0}function Me(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=a[d>>0]|0;a:do if(f<<24>>24){while(1){if((a[b>>0]|0)!=f<<24>>24){b=0;break}b=b+1|0;d=d+1|0;f=a[d>>0]|0;if(!(f<<24>>24))break a}return b|0}while(0);if(!e){e=1;return e|0}c[e>>2]=b;e=1;return e|0}function Ne(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;return}function Oe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=b+4|0;i=c[h>>2]|0;j=i+1|0;g=b+8|0;k=c[g>>2]|0;f=(k*3|0)>>>1;f=(j|0)>(f|0)?j:f;e=c[b>>2]|0;if(j>>>0>k>>>0){e=Vj(e,f)|0;c[b>>2]=e;c[g>>2]=f}a[e+i>>0]=d;if(j>>>0<=(c[h>>2]|0)>>>0)return;c[h>>2]=j;return}function Pe(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=a+4|0;h=c[g>>2]|0;i=gk(b)|0;j=i+h|0;f=a+8|0;k=c[f>>2]|0;e=(k*3|0)>>>1;e=(j|0)>(e|0)?j:e;d=c[a>>2]|0;if(j>>>0>k>>>0){d=Vj(d,e)|0;c[a>>2]=d;c[f>>2]=e}Ll(d+h|0,b|0,i|0)|0;if(j>>>0<=(c[g>>2]|0)>>>0)return;c[g>>2]=j;return}function Qe(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0;if(!((a|0)!=0&(e|0)!=0)){h=-1;return h|0}switch(b|0){case 128:case 192:case 256:break;default:{h=-2;return h|0}}g=(b|0)==128;do if(!g){f=e+240|0;if((b|0)==192){c[f>>2]=12;break}else{c[f>>2]=14;break}}else c[e+240>>2]=10;while(0);f=(d[a+1>>0]|0)<<16|(d[a>>0]|0)<<24|(d[a+2>>0]|0)<<8|(d[a+3>>0]|0);c[e>>2]=f;c[e+4>>2]=(d[a+5>>0]|0)<<16|(d[a+4>>0]|0)<<24|(d[a+6>>0]|0)<<8|(d[a+7>>0]|0);c[e+8>>2]=(d[a+9>>0]|0)<<16|(d[a+8>>0]|0)<<24|(d[a+10>>0]|0)<<8|(d[a+11>>0]|0);c[e+12>>2]=(d[a+13>>0]|0)<<16|(d[a+12>>0]|0)<<24|(d[a+14>>0]|0)<<8|(d[a+15>>0]|0);if(g){a=0;do{g=c[e+12>>2]|0;f=c[16+((g>>>16&255)<<2)>>2]&-16777216^f^c[16+((g>>>8&255)<<2)>>2]&16711680^c[16+((g&255)<<2)>>2]&65280^c[16+(g>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];h=e;e=e+16|0;c[e>>2]=f;b=c[h+4>>2]^f;c[h+20>>2]=b;b=c[h+8>>2]^b;c[h+24>>2]=b;c[h+28>>2]=b^g;a=a+1|0}while((a|0)!=10);f=0;return f|0}c[e+16>>2]=(d[a+17>>0]|0)<<16|(d[a+16>>0]|0)<<24|(d[a+18>>0]|0)<<8|(d[a+19>>0]|0);c[e+20>>2]=(d[a+21>>0]|0)<<16|(d[a+20>>0]|0)<<24|(d[a+22>>0]|0)<<8|(d[a+23>>0]|0);if((b|0)==192){a=0;while(1){h=c[e+20>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+24|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+28>>2]=g;g=c[e+8>>2]^g;c[e+32>>2]=g;g=c[e+12>>2]^g;c[e+36>>2]=g;a=a+1|0;if((a|0)==8){f=0;break}g=c[e+16>>2]^g;c[e+40>>2]=g;c[e+44>>2]=g^h;e=b}return f|0}c[e+24>>2]=(d[a+25>>0]|0)<<16|(d[a+24>>0]|0)<<24|(d[a+26>>0]|0)<<8|(d[a+27>>0]|0);c[e+28>>2]=(d[a+29>>0]|0)<<16|(d[a+28>>0]|0)<<24|(d[a+30>>0]|0)<<8|(d[a+31>>0]|0);if((b|0)!=256){h=0;return h|0}a=0;while(1){h=c[e+28>>2]|0;f=c[16+((h>>>16&255)<<2)>>2]&-16777216^f^c[16+((h>>>8&255)<<2)>>2]&16711680^c[16+((h&255)<<2)>>2]&65280^c[16+(h>>>24<<2)>>2]&255^c[1040+(a<<2)>>2];b=e+32|0;c[b>>2]=f;g=c[e+4>>2]^f;c[e+36>>2]=g;g=c[e+8>>2]^g;c[e+40>>2]=g;g=c[e+12>>2]^g;c[e+44>>2]=g;a=a+1|0;if((a|0)==7){f=0;break}g=c[16+(g>>>24<<2)>>2]&-16777216^c[e+16>>2]^c[16+((g>>>16&255)<<2)>>2]&16711680^c[16+((g>>>8&255)<<2)>>2]&65280^c[16+((g&255)<<2)>>2]&255;c[e+48>>2]=g;g=c[e+20>>2]^g;c[e+52>>2]=g;g=c[e+24>>2]^g;c[e+56>>2]=g;c[e+60>>2]=g^h;e=b}return f|0}function Re(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;a=Qe(a,b,d)|0;if((a|0)<0){d=a;return d|0}e=d+240|0;a=c[e>>2]|0;if((a|0)<=0){d=0;return d|0}a=a<<2;b=0;do{f=d+(b<<2)|0;g=c[f>>2]|0;h=d+(a<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|1)<<2)|0;g=c[h>>2]|0;f=d+((a|1)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;f=d+((b|2)<<2)|0;g=c[f>>2]|0;h=d+((a|2)<<2)|0;c[f>>2]=c[h>>2];c[h>>2]=g;h=d+((b|3)<<2)|0;g=c[h>>2]|0;f=d+((a|3)<<2)|0;c[h>>2]=c[f>>2];c[f>>2]=g;b=b+4|0;a=a+-4|0}while((b|0)<(a|0));if((c[e>>2]|0)<=1){h=0;return h|0}a=d;b=1;do{h=a;a=a+16|0;g=c[a>>2]|0;c[a>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];g=h+20|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];g=h+24|0;f=c[g>>2]|0;c[g>>2]=c[2112+((c[16+((f>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(f>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((f>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((f&255)<<2)>>2]&255)<<2)>>2];h=h+28|0;g=c[h>>2]|0;c[h>>2]=c[2112+((c[16+((g>>>16&255)<<2)>>2]&255)<<2)>>2]^c[1088+((c[16+(g>>>24<<2)>>2]&255)<<2)>>2]^c[3136+((c[16+((g>>>8&255)<<2)>>2]&255)<<2)>>2]^c[4160+((c[16+((g&255)<<2)>>2]&255)<<2)>>2];b=b+1|0}while((b|0)<(c[e>>2]|0));a=0;return a|0}function Se(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[6208+((h>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((i>>>8&255)<<2)>>2]^c[8256+((b&255)<<2)>>2]^c[n+16>>2];l=c[6208+((i>>>16&255)<<2)>>2]^c[5184+(h>>>24<<2)>>2]^c[7232+((b>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[n+20>>2];m=c[6208+((b>>>16&255)<<2)>>2]^c[5184+(i>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((h&255)<<2)>>2]^c[n+24>>2];g=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(b>>>24<<2)>>2]^c[7232+((h>>>8&255)<<2)>>2]^c[8256+((i&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[6208+((m>>>16&255)<<2)>>2]^c[5184+(l>>>24<<2)>>2]^c[7232+((g>>>8&255)<<2)>>2]^c[8256+((k&255)<<2)>>2]^c[n+36>>2];q=c[6208+((g>>>16&255)<<2)>>2]^c[5184+(m>>>24<<2)>>2]^c[7232+((k>>>8&255)<<2)>>2]^c[8256+((l&255)<<2)>>2]^c[n+40>>2];k=c[6208+((k>>>16&255)<<2)>>2]^c[5184+(g>>>24<<2)>>2]^c[7232+((l>>>8&255)<<2)>>2]^c[8256+((m&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[6208+((l>>>16&255)<<2)>>2]^c[5184+(i<<2)>>2]^c[7232+((m>>>8&255)<<2)>>2]^c[8256+((g&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[16+((l>>>16&255)<<2)>>2]&16711680|c[16+(i<<2)>>2]&-16777216|c[16+((m>>>8&255)<<2)>>2]&65280|c[16+((g&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[16+((m>>>16&255)<<2)>>2]&16711680|c[16+(l>>>24<<2)>>2]&-16777216|c[16+((g>>>8&255)<<2)>>2]&65280|c[16+((k&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[16+((g>>>16&255)<<2)>>2]&16711680|c[16+(m>>>24<<2)>>2]&-16777216|c[16+((k>>>8&255)<<2)>>2]&65280|c[16+((l&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[16+((k>>>16&255)<<2)>>2]&16711680|c[16+(g>>>24<<2)>>2]&-16777216|c[16+((l>>>8&255)<<2)>>2]&65280|c[16+((m&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Te(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;j=c[f+240>>2]>>1;o=j<<3;p=f+(o+-8<<2)|0;n=f;g=((d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|(d[b+3>>0]|0))^c[f>>2];h=((d[b+5>>0]|0)<<16|(d[b+4>>0]|0)<<24|(d[b+6>>0]|0)<<8|(d[b+7>>0]|0))^c[f+4>>2];i=((d[b+9>>0]|0)<<16|(d[b+8>>0]|0)<<24|(d[b+10>>0]|0)<<8|(d[b+11>>0]|0))^c[f+8>>2];b=((d[b+13>>0]|0)<<16|(d[b+12>>0]|0)<<24|(d[b+14>>0]|0)<<8|(d[b+15>>0]|0))^c[f+12>>2];while(1){k=c[2112+((b>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((i>>>8&255)<<2)>>2]^c[4160+((h&255)<<2)>>2]^c[n+16>>2];l=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(h>>>24<<2)>>2]^c[3136+((b>>>8&255)<<2)>>2]^c[4160+((i&255)<<2)>>2]^c[n+20>>2];m=c[2112+((h>>>16&255)<<2)>>2]^c[1088+(i>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((b&255)<<2)>>2]^c[n+24>>2];g=c[2112+((i>>>16&255)<<2)>>2]^c[1088+(b>>>24<<2)>>2]^c[3136+((h>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+28>>2];h=n+32|0;b=j+-1|0;i=k>>>24;if(!b)break;r=c[2112+((k>>>16&255)<<2)>>2]^c[1088+(l>>>24<<2)>>2]^c[3136+((g>>>8&255)<<2)>>2]^c[4160+((m&255)<<2)>>2]^c[n+36>>2];q=c[2112+((l>>>16&255)<<2)>>2]^c[1088+(m>>>24<<2)>>2]^c[3136+((k>>>8&255)<<2)>>2]^c[4160+((g&255)<<2)>>2]^c[n+40>>2];k=c[2112+((m>>>16&255)<<2)>>2]^c[1088+(g>>>24<<2)>>2]^c[3136+((l>>>8&255)<<2)>>2]^c[4160+((k&255)<<2)>>2]^c[n+44>>2];j=b;n=h;g=c[2112+((g>>>16&255)<<2)>>2]^c[1088+(i<<2)>>2]^c[3136+((m>>>8&255)<<2)>>2]^c[4160+((l&255)<<2)>>2]^c[h>>2];h=r;i=q;b=k}r=(c[9280+((g>>>16&255)<<2)>>2]&16711680|c[9280+(i<<2)>>2]&-16777216|c[9280+((m>>>8&255)<<2)>>2]&65280|c[9280+((l&255)<<2)>>2]&255)^c[f+(o<<2)>>2];a[e>>0]=r>>>24;a[e+1>>0]=r>>>16;a[e+2>>0]=r>>>8;a[e+3>>0]=r;r=(c[9280+((k>>>16&255)<<2)>>2]&16711680|c[9280+(l>>>24<<2)>>2]&-16777216|c[9280+((g>>>8&255)<<2)>>2]&65280|c[9280+((m&255)<<2)>>2]&255)^c[p+36>>2];a[e+4>>0]=r>>>24;a[e+5>>0]=r>>>16;a[e+6>>0]=r>>>8;a[e+7>>0]=r;r=(c[9280+((l>>>16&255)<<2)>>2]&16711680|c[9280+(m>>>24<<2)>>2]&-16777216|c[9280+((k>>>8&255)<<2)>>2]&65280|c[9280+((g&255)<<2)>>2]&255)^c[p+40>>2];a[e+8>>0]=r>>>24;a[e+9>>0]=r>>>16;a[e+10>>0]=r>>>8;a[e+11>>0]=r;r=(c[9280+((m>>>16&255)<<2)>>2]&16711680|c[9280+(g>>>24<<2)>>2]&-16777216|c[9280+((l>>>8&255)<<2)>>2]&65280|c[9280+((k&255)<<2)>>2]&255)^c[p+44>>2];a[e+12>>0]=r>>>24;a[e+13>>0]=r>>>16;a[e+14>>0]=r>>>8;a[e+15>>0]=r;return}function Ue(b,c,d,e,f,g){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=l;l=l+16|0;T=U;h=d>>>0>15;if(!g){if(h){i=d+-16|0;j=i&-16;A=j+16|0;g=b+A|0;k=f+1|0;m=f+2|0;n=f+3|0;o=f+4|0;p=f+5|0;q=f+6|0;r=f+7|0;s=f+8|0;t=f+9|0;u=f+10|0;v=f+11|0;w=f+12|0;x=f+13|0;y=f+14|0;z=f+15|0;h=b;b=c;while(1){S=T;Q=h;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Te(h,b,e);a[b>>0]=a[b>>0]^a[f>>0];S=b+1|0;a[S>>0]=a[S>>0]^a[k>>0];S=b+2|0;a[S>>0]=a[S>>0]^a[m>>0];S=b+3|0;a[S>>0]=a[S>>0]^a[n>>0];S=b+4|0;a[S>>0]=a[S>>0]^a[o>>0];S=b+5|0;a[S>>0]=a[S>>0]^a[p>>0];S=b+6|0;a[S>>0]=a[S>>0]^a[q>>0];S=b+7|0;a[S>>0]=a[S>>0]^a[r>>0];S=b+8|0;a[S>>0]=a[S>>0]^a[s>>0];S=b+9|0;a[S>>0]=a[S>>0]^a[t>>0];S=b+10|0;a[S>>0]=a[S>>0]^a[u>>0];S=b+11|0;a[S>>0]=a[S>>0]^a[v>>0];S=b+12|0;a[S>>0]=a[S>>0]^a[w>>0];S=b+13|0;a[S>>0]=a[S>>0]^a[x>>0];S=b+14|0;a[S>>0]=a[S>>0]^a[y>>0];S=b+15|0;a[S>>0]=a[S>>0]^a[z>>0];S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{h=h+16|0;b=b+16|0}}d=i-j|0;h=c+A|0}else{g=b;h=c}if(!d){l=U;return}S=T;Q=g;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));Te(T,T,e);c=0;do{a[h+c>>0]=a[f+c>>0]^a[T+c>>0];c=c+1|0}while((c|0)!=(d|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}if(h){O=d+-16|0;i=O&-16;P=i+16|0;h=b+P|0;j=f+1|0;k=T+1|0;m=f+2|0;n=T+2|0;o=f+3|0;p=T+3|0;q=f+4|0;r=T+4|0;s=f+5|0;t=T+5|0;u=f+6|0;v=T+6|0;w=f+7|0;x=T+7|0;y=f+8|0;z=T+8|0;A=f+9|0;B=T+9|0;C=f+10|0;D=T+10|0;E=f+11|0;F=T+11|0;G=f+12|0;H=T+12|0;I=f+13|0;J=T+13|0;K=f+14|0;L=T+14|0;M=f+15|0;N=T+15|0;g=b;b=c;while(1){a[T>>0]=a[f>>0]^a[g>>0];a[k>>0]=a[j>>0]^a[g+1>>0];a[n>>0]=a[m>>0]^a[g+2>>0];a[p>>0]=a[o>>0]^a[g+3>>0];a[r>>0]=a[q>>0]^a[g+4>>0];a[t>>0]=a[s>>0]^a[g+5>>0];a[v>>0]=a[u>>0]^a[g+6>>0];a[x>>0]=a[w>>0]^a[g+7>>0];a[z>>0]=a[y>>0]^a[g+8>>0];a[B>>0]=a[A>>0]^a[g+9>>0];a[D>>0]=a[C>>0]^a[g+10>>0];a[F>>0]=a[E>>0]^a[g+11>>0];a[H>>0]=a[G>>0]^a[g+12>>0];a[J>>0]=a[I>>0]^a[g+13>>0];a[L>>0]=a[K>>0]^a[g+14>>0];a[N>>0]=a[M>>0]^a[g+15>>0];Se(T,b,e);S=f;Q=b;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));d=d+-16|0;if(d>>>0<=15)break;else{g=g+16|0;b=b+16|0}}d=O-i|0;c=c+P|0}else h=b;if(!d){l=U;return}g=0;do{a[T+g>>0]=a[f+g>>0]^a[h+g>>0];g=g+1|0}while((g|0)!=(d|0));if(d>>>0<16)Ll(T+d|0,f+d|0,16-d|0)|0;Se(T,T,e);S=c;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));S=f;Q=T;R=S+16|0;do{a[S>>0]=a[Q>>0]|0;S=S+1|0;Q=Q+1|0}while((S|0)<(R|0));l=U;return}function Ve(a){a=a|0;var b=0;c[a+40>>2]=0;b=a;c[b>>2]=0;c[b+4>>2]=0;c[a+8>>2]=1779033703;c[a+12>>2]=-1150833019;c[a+16>>2]=1013904242;c[a+20>>2]=-1521486534;c[a+24>>2]=1359893119;c[a+28>>2]=-1694144372;c[a+32>>2]=528734635;c[a+36>>2]=1541459225;return}function We(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=a+40|0;e=c[g>>2]|0;if(e>>>0>64)ra();i=a;f=c[i>>2]|0;i=c[i+4>>2]|0;h=xl(f|0,i|0,d|0,0)|0;j=y;if(j>>>0<i>>>0|(j|0)==(i|0)&h>>>0<f>>>0)ra();if(!d)return;f=a+44|0;while(1){if(!(d>>>0>63&(e|0)==0)){i=64-e|0;i=(d|0)<(i|0)?d:i;Ll(a+44+e|0,b|0,i|0)|0;j=(c[g>>2]|0)+i|0;c[g>>2]=j;e=b+i|0;d=d-i|0;if((j|0)==64){Xe(a,f);i=a;i=xl(c[i>>2]|0,c[i+4>>2]|0,512,0)|0;j=a;c[j>>2]=i;c[j+4>>2]=y;c[g>>2]=0}}else{Xe(a,b);j=a;j=xl(c[j>>2]|0,c[j+4>>2]|0,512,0)|0;e=a;c[e>>2]=j;c[e+4>>2]=y;e=b+64|0;d=d+-64|0}if(!d)break;b=e;e=c[g>>2]|0}return}function Xe(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;i=l;l=l+288|0;f=i+256|0;g=i;h=a+8|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];c[f+24>>2]=c[h+24>>2];c[f+28>>2]=c[h+28>>2];e=0;do{j=b+(e<<2)|0;c[g+(e<<2)>>2]=(d[j+1>>0]|0)<<16|(d[j>>0]|0)<<24|(d[j+2>>0]|0)<<8|(d[j+3>>0]|0);e=e+1|0}while((e|0)!=16);e=16;b=c[g>>2]|0;do{j=c[g+(e+-2<<2)>>2]|0;k=b;b=c[g+(e+-15<<2)>>2]|0;c[g+(e<<2)>>2]=k+(c[g+(e+-7<<2)>>2]|0)+((j>>>19|j<<13)^j>>>10^(j>>>17|j<<15))+((b>>>18|b<<14)^b>>>3^(b>>>7|b<<25));e=e+1|0}while((e|0)!=64);j=f+28|0;q=f+16|0;r=c[q>>2]|0;b=f+24|0;s=c[b>>2]|0;v=f+20|0;e=c[v>>2]|0;k=(c[j>>2]|0)+1116352408+(c[g>>2]|0)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+((e^s)&r^s)|0;t=c[f>>2]|0;u=f+4|0;o=c[u>>2]|0;w=f+8|0;n=c[w>>2]|0;m=f+12|0;p=k+(c[m>>2]|0)|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((o|t)&n|o&t)+k|0;c[j>>2]=k;s=s+1899447441+(c[g+4>>2]|0)+(p&(e^r)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=e+-1245643825+(c[g+8>>2]|0)+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=r+-373957723+(c[g+12>>2]|0)+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=p+961987163+(c[g+16>>2]|0)+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=n+1508970993+(c[g+20>>2]|0)+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+24>>2]|0)+-1841331548+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+28>>2]|0)+-1424204075+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+32>>2]|0)+-670586216+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+36>>2]|0)+310598401+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+40>>2]|0)+607225278+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+44>>2]|0)+1426881987+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+48>>2]|0)+1925078388+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+52>>2]|0)+-2132889090+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+56>>2]|0)+-1680079193+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+60>>2]|0)+-1046744716+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+64>>2]|0)+-459576895+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+68>>2]|0)+-272742522+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+72>>2]|0)+264347078+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+76>>2]|0)+604807628+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+80>>2]|0)+770255983+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+84>>2]|0)+1249150122+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+88>>2]|0)+1555081692+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+92>>2]|0)+1996064986+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+96>>2]|0)+-1740746414+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+100>>2]|0)+-1473132947+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+104>>2]|0)+-1341970488+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+108>>2]|0)+-1084653625+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+112>>2]|0)+-958395405+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+116>>2]|0)+-710438585+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+120>>2]|0)+113926993+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+124>>2]|0)+338241895+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+128>>2]|0)+666307205+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+132>>2]|0)+773529912+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+136>>2]|0)+1294757372+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+140>>2]|0)+1396182291+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+144>>2]|0)+1695183700+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+148>>2]|0)+1986661051+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+152>>2]|0)+-2117940946+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+156>>2]|0)+-1838011259+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+160>>2]|0)+-1564481375+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+164>>2]|0)+-1474664885+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+168>>2]|0)+-1035236496+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+172>>2]|0)+-949202525+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+176>>2]|0)+-778901479+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+180>>2]|0)+-694614492+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+184>>2]|0)+-200395387+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+188>>2]|0)+275423344+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+192>>2]|0)+430227734+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+196>>2]|0)+506948616+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+200>>2]|0)+659060556+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+204>>2]|0)+883997877+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+208>>2]|0)+958139571+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+212>>2]|0)+1322822218+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+216>>2]|0)+1537002063+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;t=(c[g+220>>2]|0)+1747873779+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;r=t+r|0;c[q>>2]=r;t=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+t|0;c[f>>2]=t;k=(c[g+224>>2]|0)+1955562222+k+(r&(e^s)^s)+((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))|0;p=k+p|0;c[m>>2]=p;k=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+((t|o)&n|t&o)+k|0;c[j>>2]=k;s=(c[g+228>>2]|0)+2024104815+s+(p&(r^e)^e)+((p>>>6|p<<26)^(p>>>11|p<<21)^(p>>>25|p<<7))|0;n=s+n|0;c[w>>2]=n;s=((k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10))+((k|t)&o|k&t)+s|0;c[b>>2]=s;e=(c[g+232>>2]|0)+-2067236844+e+(n&(p^r)^r)+((n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7))|0;o=e+o|0;c[u>>2]=o;e=((s>>>2|s<<30)^(s>>>13|s<<19)^(s>>>22|s<<10))+((s|k)&t|s&k)+e|0;c[v>>2]=e;r=(c[g+236>>2]|0)+-1933114872+r+(o&(n^p)^p)+((o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7))|0;t=r+t|0;c[f>>2]=t;r=((e>>>2|e<<30)^(e>>>13|e<<19)^(e>>>22|e<<10))+((e|s)&k|e&s)+r|0;c[q>>2]=r;p=(c[g+240>>2]|0)+-1866530822+p+(t&(o^n)^n)+((t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7))|0;k=p+k|0;c[j>>2]=k;p=((r>>>2|r<<30)^(r>>>13|r<<19)^(r>>>22|r<<10))+((r|e)&s|r&e)+p|0;c[m>>2]=p;n=(c[g+244>>2]|0)+-1538233109+n+(k&(t^o)^o)+((k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7))|0;s=n+s|0;c[b>>2]=s;n=((p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10))+((p|r)&e|p&r)+n|0;c[w>>2]=n;o=(c[g+248>>2]|0)+-1090935817+o+(s&(k^t)^t)+((s>>>6|s<<26)^(s>>>11|s<<21)^(s>>>25|s<<7))|0;e=o+e|0;c[v>>2]=e;o=((n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10))+((n|p)&r|n&p)+o|0;c[u>>2]=o;k=(c[g+252>>2]|0)+-965641998+t+(e&(s^k)^k)+((e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7))|0;g=k+r|0;c[q>>2]=g;k=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((o|n)&p|o&n)+k|0;c[f>>2]=k;c[h>>2]=k+(c[h>>2]|0);k=a+12|0;c[k>>2]=o+(c[k>>2]|0);k=a+16|0;c[k>>2]=n+(c[k>>2]|0);k=a+20|0;c[k>>2]=(c[m>>2]|0)+(c[k>>2]|0);k=a+24|0;c[k>>2]=g+(c[k>>2]|0);k=a+28|0;c[k>>2]=e+(c[k>>2]|0);k=a+32|0;c[k>>2]=(c[b>>2]|0)+(c[k>>2]|0);k=a+36|0;c[k>>2]=(c[j>>2]|0)+(c[k>>2]|0);l=i;return}function Ye(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;h=d+40|0;e=c[h>>2]|0;if(e>>>0>63)ra();i=d;i=xl(c[i>>2]|0,c[i+4>>2]|0,e<<3|0,0)|0;g=d;c[g>>2]=i;c[g+4>>2]=y;g=d+44|0;c[h>>2]=e+1;a[d+44+e>>0]=-128;e=c[h>>2]|0;if(e>>>0<=56){if((e|0)!=56)f=9}else{if(e>>>0<64)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<64);Xe(d,g);c[h>>2]=0;e=0;f=9}if((f|0)==9)do{c[h>>2]=e+1;a[d+44+e>>0]=0;e=c[h>>2]|0}while(e>>>0<56);h=d;i=c[h>>2]|0;h=c[h+4>>2]|0;f=Il(i|0,h|0,56)|0;a[d+100>>0]=f;f=Il(i|0,h|0,48)|0;a[d+101>>0]=f;f=Il(i|0,h|0,40)|0;a[d+102>>0]=f;a[d+103>>0]=h;a[d+104>>0]=i>>>24;a[d+105>>0]=i>>>16;a[d+106>>0]=i>>>8;a[d+107>>0]=i;Xe(d,g);i=c[d+8>>2]|0;a[b>>0]=i>>>24;a[b+1>>0]=i>>>16;a[b+2>>0]=i>>>8;a[b+3>>0]=i;i=c[d+12>>2]|0;a[b+4>>0]=i>>>24;a[b+5>>0]=i>>>16;a[b+6>>0]=i>>>8;a[b+7>>0]=i;i=c[d+16>>2]|0;a[b+8>>0]=i>>>24;a[b+9>>0]=i>>>16;a[b+10>>0]=i>>>8;a[b+11>>0]=i;i=c[d+20>>2]|0;a[b+12>>0]=i>>>24;a[b+13>>0]=i>>>16;a[b+14>>0]=i>>>8;a[b+15>>0]=i;i=c[d+24>>2]|0;a[b+16>>0]=i>>>24;a[b+17>>0]=i>>>16;a[b+18>>0]=i>>>8;a[b+19>>0]=i;i=c[d+28>>2]|0;a[b+20>>0]=i>>>24;a[b+21>>0]=i>>>16;a[b+22>>0]=i>>>8;a[b+23>>0]=i;i=c[d+32>>2]|0;a[b+24>>0]=i>>>24;a[b+25>>0]=i>>>16;a[b+26>>0]=i>>>8;a[b+27>>0]=i;i=c[d+36>>2]|0;a[b+28>>0]=i>>>24;a[b+29>>0]=i>>>16;a[b+30>>0]=i>>>8;a[b+31>>0]=i;return}function Ze(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=l;l=l+112|0;f=e;c[f+40>>2]=0;g=f;c[g>>2]=0;c[g+4>>2]=0;c[f+8>>2]=1779033703;c[f+12>>2]=-1150833019;c[f+16>>2]=1013904242;c[f+20>>2]=-1521486534;c[f+24>>2]=1359893119;c[f+28>>2]=-1694144372;c[f+32>>2]=528734635;c[f+36>>2]=1541459225;We(f,a,b);Ye(d,f);l=e;return}function _e(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;ol(a,e)|0;l=d;return}function $e(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+24|0;f=g+16|0;e=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];he(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[e>>2]=b;_e(18916,e);i=-1;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;_e(18941,f);i=-1;l=g;return i|0}}return 0}function af(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=l;l=l+32|0;i=g+16|0;f=g+8|0;h=g;c[i>>2]=c[a>>2];c[i+4>>2]=c[a+4>>2];he(h,i,b);a=c[h+4>>2]|0;switch(c[h>>2]|0){case 6:{c[d>>2]=e;i=0;l=g;return i|0}case 1:{c[d>>2]=a;i=0;l=g;return i|0}default:{c[f>>2]=b;_e(18941,f);i=-1;l=g;return i|0}}return 0}function bf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=Le(24)|0;c[f>>2]=a;c[f+4>>2]=d;c[f+8>>2]=e;c[a>>2]=Tk(b)|0;if(!(Md(b)|0))cf();else{c[f+12>>2]=8;c[f+16>>2]=f;nd(b,0,0,f,15,1)|0;return}}function cf(){ra()}function df(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;oa=l;l=l+816|0;ma=oa+796|0;na=oa+744|0;ja=oa+736|0;ga=oa+728|0;fa=oa+720|0;ea=oa+712|0;da=oa+704|0;ca=oa+696|0;ba=oa+688|0;aa=oa+680|0;$=oa+672|0;_=oa+664|0;Y=oa+656|0;X=oa+648|0;W=oa+640|0;V=oa+632|0;U=oa+624|0;T=oa+616|0;ia=oa+608|0;P=oa+600|0;O=oa+592|0;N=oa+584|0;M=oa+576|0;L=oa+568|0;K=oa+560|0;ha=oa+552|0;H=oa+544|0;G=oa+536|0;F=oa+528|0;E=oa+520|0;D=oa+512|0;J=oa+504|0;A=oa+488|0;v=oa+480|0;u=oa+472|0;t=oa+464|0;s=oa+456|0;r=oa+448|0;q=oa+440|0;p=oa+432|0;j=oa+424|0;i=oa+416|0;n=oa+408|0;m=oa+400|0;k=oa+392|0;h=oa+384|0;g=oa+376|0;C=oa+288|0;w=oa+256|0;x=oa+792|0;z=oa+748|0;S=oa;la=oa+368|0;pa=oa+360|0;B=oa+352|0;I=oa+344|0;R=oa+336|0;Z=oa+328|0;f=oa+320|0;ka=c[b>>2]|0;qe(pa,d,e);e=pa;d=c[e>>2]|0;e=c[e+4>>2]|0;pa=la;c[pa>>2]=d;c[pa+4>>2]=e;if((d|0)==7){c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];c[g>>2]=le(ma)|0;_e(18992,g);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);Da(1)}pa=w;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19003);pa=C;d=c[pa+4>>2]|0;a:do switch(c[pa>>2]|0){case 6:{c[h>>2]=19003;_e(18916,h);Q=6;break}case 1:{if((d|0)!=1)if((d|0)>1){_e(19011,m);Da(1)}else{_e(19067,n);Da(1)}m=la;n=c[m+4>>2]|0;pa=w;c[pa>>2]=c[m>>2];c[pa+4>>2]=n;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19173);switch(c[C>>2]|0){case 6:{c[i>>2]=19173;_e(18916,i);break}case 0:{g=Tk((c[C+4>>2]|0)+4|0)|0;c[ka+8>>2]=g;d=c[3653]|0;e=kk(d,44)|0;b:do if(!e){o=d;Q=20}else{h=gk(g)|0;while(1){if((e-d|0)==(h|0)?(Zk(g,d,h)|0)==0:0)break b;d=e+1|0;e=kk(d,44)|0;if(!e){o=d;Q=20;break}}}while(0);if((Q|0)==20?fk(g,o)|0:0){c[ka+4>>2]=0;c[p>>2]=g;_e(19202,p);break a}c[ka+4>>2]=14612;db[c[14616>>2]&15](ka);pa=la;d=c[pa+4>>2]|0;e=w;c[e>>2]=c[pa>>2];c[e+4>>2]=d;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19228);e=C;d=c[e>>2]|0;e=c[e+4>>2]|0;switch(d|0){case 6:{c[q>>2]=19228;_e(18916,q);break}case 1:{q=ka+16|0;c[q>>2]=Jl(Hl(d|0,e|0,32)|0,y|0,20)|0;c[q+4>>2]=y;q=la;r=c[q+4>>2]|0;pa=w;c[pa>>2]=c[q>>2];c[pa+4>>2]=r;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19240);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+196>>2]=Tk((c[C+4>>2]|0)+4|0)|0;break}default:{c[s>>2]=19240;_e(19181,s);break a}}r=la;s=c[r+4>>2]|0;pa=w;c[pa>>2]=c[r>>2];c[pa+4>>2]=s;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19245);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+220>>2]=Tk((c[C+4>>2]|0)+4|0)|0;break}default:{c[t>>2]=19245;_e(19181,t);break a}}s=la;t=c[s+4>>2]|0;pa=w;c[pa>>2]=c[s>>2];c[pa+4>>2]=t;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19252);switch(c[C>>2]|0){case 6:break;case 0:{c[ka+232>>2]=Tk((c[C+4>>2]|0)+4|0)|0;break}default:{c[u>>2]=19252;_e(19181,u);break a}}t=la;u=c[t+4>>2]|0;pa=w;c[pa>>2]=c[t>>2];c[pa+4>>2]=u;c[ma>>2]=c[w>>2];c[ma+4>>2]=c[w+4>>2];he(C,ma,19259);switch(c[C>>2]|0){case 6:break;case 0:{d=(c[C+4>>2]|0)+4|0;Ne(ma);h=C;i=z+36|0;c:while(1){g=a[d>>0]|0;switch(g<<24>>24){case 0:break c;case 36:{e=d+1|0;if((a[e>>0]|0)==123){e=C;g=d+2|0;d:while(1){d=a[g>>0]|0;switch(d<<24>>24){case 0:case 125:break d;default:{}}if((e-h|0)>>>0<31){a[e>>0]=d;d=e+1|0}else d=e;e=d;g=g+1|0}a[e>>0]=0;d=(a[g>>0]|0)==125?g+1|0:g;if(!(fk(C,19267)|0)){Sa(x|0)|0;Qa(x|0,z|0)|0;u=c[i>>2]|0;v=(u|0)/60|0;u=(u|0)<-59;v=u?0-v|0:v;pa=(v|0)/60|0;c[A>>2]=u?43:45;c[A+4>>2]=pa;c[A+8>>2]=v-(pa*60|0);nk(w,32,19270,A)|0;Pe(ma,w)}}else{d=e;Q=52}break}default:{d=d+1|0;Q=52}}if((Q|0)==52){Q=0;Oe(ma,g)}}Oe(ma,0);c[ka+184>>2]=c[ma>>2];break}default:{c[v>>2]=19259;_e(19181,v);break a}}i=ka+96|0;c[J>>2]=c[i>>2];nk(S,256,19285,J)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(B,ma,S);e=B;d=c[e>>2]|0;e:do if((d|0)==6)Q=68;else{h=J+4|0;g=J+4|0;e=c[e+4>>2]|0;f:while(1){if((c[i>>2]|0)>3){Q=58;break}pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];he(J,ma,19310);switch(c[J>>2]|0){case 6:{Q=60;break f}case 0:break;default:{Q=61;break f}}pa=Tk((c[h>>2]|0)+4|0)|0;c[ka+48+((c[i>>2]|0)*12|0)+4>>2]=pa;pa=C;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[C>>2];c[ma+4>>2]=c[C+4>>2];he(J,ma,19315);switch(c[J>>2]|0){case 6:{d=0;break}case 0:{d=Tk((c[g>>2]|0)+4|0)|0;break}default:{Q=65;break f}}c[ka+48+((c[i>>2]|0)*12|0)>>2]=d;e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[H>>2]=e;nk(S,256,19285,H)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(B,ma,S);e=B;d=c[e>>2]|0;if((d|0)==6){Q=68;break e}else e=c[e+4>>2]|0}if((Q|0)==58){_e(19293,D);break}else if((Q|0)==60){c[E>>2]=19310;_e(18916,E)}else if((Q|0)==61){c[F>>2]=19310;_e(19181,F)}else if((Q|0)==65){c[G>>2]=19315;_e(19181,G);break a}break a}while(0);g:do if((Q|0)==68){j=ka+164|0;c[ha>>2]=c[j>>2];nk(S,256,19322,ha)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(I,ma,S);e=I;d=c[e>>2]|0;h:do if((d|0)!=6){h=ha+4|0;i=ha+4|0;e=c[e+4>>2]|0;i:while(1){if((c[j>>2]|0)>3){Q=71;break}pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];he(ha,ma,19310);switch(c[ha>>2]|0){case 6:{Q=73;break i}case 0:break;default:{Q=74;break i}}pa=Tk((c[h>>2]|0)+4|0)|0;c[ka+100+(c[j>>2]<<4)+8>>2]=pa;pa=J;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[J>>2];c[ma+4>>2]=c[J+4>>2];he(ha,ma,19349);j:do switch(c[ha>>2]|0){case 6:{d=c[j>>2]|0;if(!d){d=S;e=19353;g=d+10|0;do{a[d>>0]=a[e>>0]|0;d=d+1|0;e=e+1|0}while((d|0)<(g|0));d=S;break j}else{c[O>>2]=d;nk(S,256,19363,O)|0;d=S;break j}}case 0:{d=(c[i>>2]|0)+4|0;break}default:{Q=77;break i}}while(0);d=Tk(d)|0;e=c[j>>2]|0;c[ka+100+(e<<4)+4>>2]=d;e=e+1|0;c[j>>2]=e;c[P>>2]=e;nk(S,256,19322,P)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(I,ma,S);e=I;d=c[e>>2]|0;if((d|0)==6)break h;else e=c[e+4>>2]|0}if((Q|0)==71){_e(19327,K);break g}else if((Q|0)==73){c[L>>2]=19310;_e(18916,L)}else if((Q|0)==74){c[M>>2]=19310;_e(19181,M)}else if((Q|0)==77){c[N>>2]=19349;_e(19181,N);break a}break a}while(0);i=ka+180|0;c[ia>>2]=c[i>>2];nk(S,256,19375,ia)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(R,ma,S);e=R;d=c[e>>2]|0;k:do if((d|0)!=6){g=ia+4|0;h=ia+4|0;e=c[e+4>>2]|0;l:while(1){if((c[i>>2]|0)>0){Q=86;break}pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19411);switch(c[ia>>2]|0){case 6:{Q=88;break l}case 0:break;default:{Q=89;break l}}pa=(c[g>>2]|0)+4|0;P=Tk(pa)|0;c[ka+168+((c[i>>2]|0)*12|0)>>2]=P;if(!(fk(pa,19418)|0)){pa=ha;c[pa>>2]=d;c[pa+4>>2]=e;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19422);switch(c[ia>>2]|0){case 6:{Q=93;break l}case 0:break;default:{Q=94;break l}}pa=Tk((c[h>>2]|0)+4|0)|0;c[ka+168+((c[i>>2]|0)*12|0)+4>>2]=pa}e=(c[i>>2]|0)+1|0;c[i>>2]=e;c[Y>>2]=e;nk(S,256,19375,Y)|0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(R,ma,S);e=R;d=c[e>>2]|0;if((d|0)==6)break k;else e=c[e+4>>2]|0}if((Q|0)==86){_e(19381,T);break g}else if((Q|0)==88){c[U>>2]=19411;_e(18916,U);Q=90}else if((Q|0)==89){c[V>>2]=19411;_e(19181,V);Q=90}else if((Q|0)==93){c[W>>2]=19422;_e(18916,W);Q=95}else if((Q|0)==94){c[X>>2]=19422;_e(19181,X);Q=95}if((Q|0)==90)break a;else if((Q|0)==95)break a}while(0);d=ka+32|0;c[d>>2]=0;c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(Z,ma,19429);g=Z;e=c[g>>2]|0;g=c[g+4>>2]|0;m:do if((e|0)!=6){pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19315);switch(c[ia>>2]|0){case 6:{c[_>>2]=19315;_e(18916,_);break}case 0:{c[d>>2]=Tk((c[ia+4>>2]|0)+4|0)|0;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19438);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[aa>>2]=19438;_e(18916,aa);break}case 1:{c[ka+36>>2]=d;c[ha>>2]=e;c[ha+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19444);pa=ia;d=c[pa+4>>2]|0;switch(c[pa>>2]|0){case 6:{c[ca>>2]=19444;_e(18916,ca);break}case 1:{c[ka+40>>2]=d;pa=ha;c[pa>>2]=e;c[pa+4>>2]=g;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19451);switch(c[ia>>2]|0){case 6:break m;case 0:{c[ka+208>>2]=Tk((c[ia+4>>2]|0)+4|0)|0;break m}default:{c[ea>>2]=19451;_e(19181,ea);break a}}}default:{c[da>>2]=19444;_e(18941,da)}}break a}default:{c[ba>>2]=19438;_e(18941,ba)}}break a}default:{c[$>>2]=19315;_e(19181,$)}}break a}while(0);da=la;ea=c[da+4>>2]|0;pa=ha;c[pa>>2]=c[da>>2];c[pa+4>>2]=ea;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19460);switch(c[ia>>2]|0){case 6:{d=0;break}case 0:{d=Tk((c[ia+4>>2]|0)+4|0)|0;break}default:{c[fa>>2]=19460;_e(19181,fa);break a}}c[ka+192>>2]=d;ea=la;fa=c[ea+4>>2]|0;pa=ha;c[pa>>2]=c[ea>>2];c[pa+4>>2]=fa;c[ma>>2]=c[ha>>2];c[ma+4>>2]=c[ha+4>>2];he(ia,ma,19473);n:do switch(c[ia>>2]|0){case 6:break;case 0:{d=(c[ia+4>>2]|0)+4|0;if(!(fk(d,19479)|0)){c[ka+188>>2]=0;break n}if(!(fk(d,19484)|0)){c[ka+188>>2]=1;break n}c[ja>>2]=d;_e(19489,ja);Da(1);break}default:{c[ga>>2]=19473;_e(19181,ga);break a}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];he(f,ma,19521);switch(c[f>>2]|0){case 4:{c[ka+28>>2]=c[f+4>>2];c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);pa=b+20|0;c[pa>>2]=0;ff(b);l=oa;return}case 6:{c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);pa=b+20|0;c[pa>>2]=0;ff(b);l=oa;return}default:{c[na>>2]=19521;_e(19536,na);break a}}}while(0);Da(1);break}default:{c[r>>2]=19228;_e(18941,r)}}break a}default:{c[j>>2]=19173;_e(19181,j)}}break}default:{c[k>>2]=19003;_e(18941,k);Q=6}}while(0);c[ma>>2]=c[la>>2];c[ma+4>>2]=c[la+4>>2];je(ma);Da(1)}function ef(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g;if((b|0)<0){c[f>>2]=0-b;_e(18963,f);Da(1)}else{fb[c[a+12>>2]&15](c[a+16>>2]|0,d,e);l=g;return}}function ff(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=c[b>>2]|0;f=b+20|0;d=c[f>>2]|0;a:do if((d|0)<4)while(1){e=c[g+196+(d*12|0)>>2]|0;if(e|0)break a;e=d+1|0;c[f>>2]=e;if((d|0)<3)d=e;else{d=e;h=5;break}}else h=5;while(0);do if((h|0)==5){if((d|0)!=4){e=c[g+196+(d*12|0)>>2]|0;break}d=c[b+4>>2]|0;if(d|0)db[d&15](c[b+8>>2]|0);Uj(b);return}while(0);d=c[g>>2]|0;if((((d|0)!=0?(kk(e,58)|0)==0:0)?(a[e>>0]|0)!=47:0)?(i=Rk(d,47)|0,(i|0)!=0):0){g=i+1-d|0;h=(gk(e)|0)+1|0;i=Tj(h+g|0)|0;Ll(i|0,d|0,g|0)|0;Ll(i+g|0,e|0,h|0)|0;d=i}else d=Tk(e)|0;if(!(Md(d)|0))cf();c[b+12>>2]=9;c[b+16>>2]=b;nd(d,0,0,b,15,1)|0;Uj(d);return}function gf(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=c[a>>2]|0;g=Tj(d)|0;e=a+20|0;c[f+196+((c[e>>2]|0)*12|0)+4>>2]=g;Ll(c[f+196+((c[e>>2]|0)*12|0)+4>>2]|0,b|0,d|0)|0;c[f+196+((c[e>>2]|0)*12|0)+8>>2]=d;c[e>>2]=(c[e>>2]|0)+1;ff(a);return}function hf(b,d){b=b|0;d=d|0;var e=0,f=0;if((a[d>>0]|0)==33){e=Tk(d+1|0)|0;d=b+184|0;b=c[d>>2]|0;Uj(b);c[d>>2]=e;return}else{e=b+184|0;f=c[e>>2]|0;f=(f|0)==0?16809164:f;b=gk(f)|0;b=Tj(b+2+(gk(d)|0)|0)|0;hk(b,f)|0;f=b+(gk(b)|0)|0;a[f>>0]=32;a[f+1>>0]=0;ik(b,d)|0;d=b;b=c[e>>2]|0;Uj(b);c[e>>2]=d;return}}function jf(a){a=a|0;var b=0,d=0;Uj(c[a+8>>2]|0);Uj(c[a+184>>2]|0);Uj(c[a+196>>2]|0);Uj(c[a+200>>2]|0);Uj(c[a+208>>2]|0);Uj(c[a+212>>2]|0);Uj(c[a+220>>2]|0);Uj(c[a+224>>2]|0);Uj(c[a+232>>2]|0);Uj(c[a+236>>2]|0);d=a+96|0;if((c[d>>2]|0)>0){b=0;do{Uj(c[a+48+(b*12|0)+4>>2]|0);Uj(c[a+48+(b*12|0)>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+164|0;if((c[d>>2]|0)>0){b=0;do{Uj(c[a+100+(b<<4)+8>>2]|0);Uj(c[a+100+(b<<4)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0))}d=a+180|0;if((c[d>>2]|0)<=0){d=a+192|0;d=c[d>>2]|0;Uj(d);d=a+32|0;d=c[d>>2]|0;Uj(d);a=c[a>>2]|0;Uj(a);return}b=0;do{Uj(c[a+168+(b*12|0)>>2]|0);Uj(c[a+168+(b*12|0)+4>>2]|0);b=b+1|0}while((b|0)<(c[d>>2]|0));d=a+192|0;d=c[d>>2]|0;Uj(d);d=a+32|0;d=c[d>>2]|0;Uj(d);a=c[a>>2]|0;Uj(a);return}function kf(a){a=a|0;return Wa[c[(c[a+4>>2]|0)+8>>2]&15](a)|0}function lf(a){a=a|0;Nl(a|0,0,248)|0;return}function mf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;switch(b|0){case 0:{c[a+36>>2]=e;f=e+d<<16>>16;c[a+40>>2]=f;g=1;break}case 1:{f=(e|d)<<16>>16;c[a+40>>2]=f;g=13;break}case 2:{g=nf(a)|0;c[a+36>>2]=e;f=e+d+g<<16>>16;c[a+40>>2]=f;g=(g|0)==0?1:4;break}case 3:{g=nf(a)|0;c[a+36>>2]=e;f=d-e-g<<16>>16;c[a+40>>2]=f;g=(g|0)==0?7:10;break}case 4:{f=(e&d)<<16>>16;c[a+40>>2]=f;g=13;break}case 5:{c[a+36>>2]=e;f=d-e<<16>>16;c[a+40>>2]=f;g=7;break}case 6:{f=(e^d)<<16>>16;c[a+40>>2]=f;g=13;break}case 7:{c[a+36>>2]=e;c[a+40>>2]=d-e<<16>>16;f=d;g=7;break}default:ra()}c[a+44>>2]=g;return f|0}function nf(a){a=a|0;var b=0,d=0,e=0;b=c[a+44>>2]|0;if((b|0)>24){d=a+48|0;e=c[a+52>>2]|0}else{d=a+40|0;e=b}b=c[d>>2]|0;do switch(e|0){case 0:{a=(b&255)>>>0<(c[a+36>>2]&255)>>>0&1;return a|0}case 1:{a=(b&65535)>>>0<(c[a+36>>2]&65535)>>>0&1;return a|0}case 2:{a=b>>>0<(c[a+36>>2]|0)>>>0&1;return a|0}case 3:{a=(b&255)>>>0<=(c[a+36>>2]&255)>>>0&1;return a|0}case 4:{a=(b&65535)>>>0<=(c[a+36>>2]&65535)>>>0&1;return a|0}case 5:{a=b>>>0<=(c[a+36>>2]|0)>>>0&1;return a|0}case 6:{a=c[a+36>>2]|0;a=(a+b&255)>>>0<(a&255)>>>0&1;return a|0}case 7:{a=c[a+36>>2]|0;a=(a+b&65535)>>>0<(a&65535)>>>0&1;return a|0}case 8:{a=c[a+36>>2]|0;a=(a+b|0)>>>0<a>>>0&1;return a|0}case 9:{a=c[a+36>>2]|0;a=(b+1+a&255)>>>0<=(a&255)>>>0&1;return a|0}case 10:{a=c[a+36>>2]|0;a=(b+1+a&65535)>>>0<=(a&65535)>>>0&1;return a|0}case 11:{a=c[a+36>>2]|0;a=(b+1+a|0)>>>0<=a>>>0&1;return a|0}case 15:{a=(c[a+36>>2]|0)>>>7&1;return a|0}case 16:{a=(c[a+36>>2]|0)>>>15&1;return a|0}case 17:{a=(c[a+36>>2]|0)>>>31;return a|0}case 20:case 19:case 18:{a=c[a+36>>2]&1;return a|0}case 23:case 22:case 21:{a=(c[a+36>>2]|0)!=0&1;return a|0}case 24:{a=c[a+36>>2]&1;return a|0}case 14:case 13:case 12:{a=0;return a|0}default:ra()}while(0);return 0}function of(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0;q=l;l=l+16|0;p=q;if((d|0)<1){l=q;return}o=b+448|0;f=o;e=c[f>>2]|0;f=c[f+4>>2]|0;j=xl(e|0,f|0,d|0,((d|0)<0)<<31>>31|0)|0;k=y;i=b+441|0;if(a[i>>0]|0){l=q;return}b=e;d=f;a:while(1){d=yl(j|0,k|0,b|0,d|0)|0;h=c[5746]|0;do if((h|0)>-1){b=h+64|0;f=c[5766]|0;g=(f|0)==0;if(!g?c[f+(b>>>5<<2)>>2]&1<<(b&31)|0:0){c[5746]=32;g=f+112|0;c[g>>2]=b;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=0;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=c[5747];c[g+4>>2]=0;g=52;break}b=c[5748]|0;e=(a[22996]|0)==0;if((b|0)==8&e){if(g){g=12;break a}if((c[f+12>>2]|0)>-1){g=12;break a}c[5746]=32;g=f+112|0;c[g>>2]=127;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=0;c[g+4>>2]=0;g=52;break}b:do if((b|0)<0|e^1)g=18;else{if((b|0)==14)switch(h|0){case 30:case 13:case 12:case 11:case 10:case 0:case 14:break;default:{g=18;break b}}else switch(h|0){case 30:case 13:case 12:case 11:case 10:case 0:break;default:{g=18;break b}}e=22976;e=xl(c[e>>2]|0,c[e+4>>2]|0,1,0)|0;b=22976;c[b>>2]=e;c[b+4>>2]=y;b=0;e=8;d=d+-1|0;g=19}while(0);if((g|0)==18){g=0;b=c[5747]|0;d=d+-1|0;e=22976;e=xl(c[e>>2]|0,c[e+4>>2]|0,1,0)|0;f=22976;c[f>>2]=e;c[f+4>>2]=y;switch(h|0){case 17:case 14:case 13:case 12:case 11:case 10:case 8:{e=h;g=19;break}default:{f=0;e=h}}}if((g|0)==19){g=0;f=1}if(!(pf(e,0,0,f,b)|0)){c[5746]=-1;if(!d)break;else{g=23;break}}else if((c[5746]|0)==32){g=52;break}else break}else g=23;while(0);c:do if((g|0)==23){g=0;b=c[5743]|0;while(1){if((b|0)>-1){d=d+-1|0;f=22976;f=xl(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;h=22976;c[h>>2]=f;c[h+4>>2]=y;if(pf(b,1,0,0,0)|0){g=26;break}c[5743]=-1;if(!d)break c}f=c[5766]|0;if(!(a[22971]|0)){g=40;break}e=(f|0)==0;if(e)b=(c[5647]|0)>>>9&(a[23072]&1)&((a[22970]^1)&255);else{if(!(c[f+96>>2]&16777216))b=c[5647]|0;else b=c[(c[5767]|0)+1392>>2]|0;b=b>>>9&1}if(!b){g=40;break}if(!e?c[f+12>>2]&1|0:0){g=38;break}b=Wa[c[16808496>>2]&15](c[4202125]|0)|0;c[5743]=b}if((g|0)==26){g=0;if((c[5746]|0)==32){g=52;break}else break}else if((g|0)==38){c[5746]=32;h=f+112|0;c[h>>2]=96;c[h+4>>2]=0;h=(c[5766]|0)+120|0;c[h>>2]=0;c[h+4>>2]=0;g=52;break}else if((g|0)==40){g=0;do if((f|0)!=0?(m=f+96|0,n=c[m>>2]|0,(n&256|0)!=0):0){b=a[22970]|0;if((c[5647]&512|0)!=0&b<<24>>24==0){if(c[f+12>>2]&16|0){c[5746]=32;g=f+112|0;c[g>>2]=100;c[g+4>>2]=0;g=(c[5766]|0)+120|0;c[g>>2]=0;c[g+4>>2]=0;g=52;break c}c[m>>2]=n&-257;d=d+-1|0;f=22976;f=xl(c[f>>2]|0,c[f+4>>2]|0,1,0)|0;h=22976;c[h>>2]=f;c[h+4>>2]=y;if(!(pf(c[(c[5766]|0)+100>>2]&255,1,0,0,0)|0))if(!d)break c;else{g=48;break}else if((c[5746]|0)==32){g=52;break c}else break c}}else g=48;while(0);if((g|0)==48){g=0;b=a[22970]|0}if(!(b<<24>>24)){qf(d);break}else{qf(1);a[22970]=0;break}}}while(0);if((g|0)==52){c[5746]=-1;rf()}if(a[i>>0]|0){g=55;break}d=o;b=c[d>>2]|0;d=c[d+4>>2]|0;if(!((k|0)>(d|0)|(k|0)==(d|0)&j>>>0>b>>>0)){g=55;break}}if((g|0)==12){q=c[3662]|0;c[p>>2]=19569;c[p+4>>2]=7874;c[p+8>>2]=19579;nl(q,19558,p)|0;ra()}else if((g|0)==55){l=q;return}}function pf(f,g,h,i,j){f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=l;l=l+16|0;z=B+4|0;A=B;c[5748]=f;a[22996]=g;a[22997]=i;c[5750]=j;a:do if(!(c[5732]&1)){k=f<<2;if((k|3)>>>0>(c[5723]|0)>>>0){c[5746]=13;c[5747]=f<<3|2;A=-1;l=B;return A|0}f=(c[5722]|0)+k|0;k=c[23084+(f>>>12<<2)>>2]|0;do if((k|f)&1)if(!(zf(f,1,0,0)|0)){o=c[5762]|0;break}else{A=-1;l=B;return A|0}else o=e[k+f>>1]|0;while(0);k=f+2|0;f=c[23084+(k>>>12<<2)>>2]|0;do if((f|k)&1)if(!(zf(k,1,0,0)|0)){n=c[5762]|0;break}else{A=-1;l=B;return A|0}else n=e[f+k>>1]|0;while(0);m=c[5636]|0;h=(g|0)==2?h:c[5640]|0;k=(c[5729]&m+-2)+(c[5694]|0)|0;f=sf()|0;g=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((g|k)&1){if(Bf(k,f,1,2)|0){A=-1;l=B;return A|0}}else b[g+k>>1]=f;k=(c[5729]&m+-4)+(c[5694]|0)|0;f=c[5689]|0;g=c[8411692+((c[5770]|0)+(k>>>12)<<2)>>2]|0;if((g|k)&1){if(Bf(k,f,1,2)|0){A=-1;l=B;return A|0}}else b[g+k>>1]=f;k=m+-6|0;f=(c[5729]&k)+(c[5694]|0)|0;g=c[8411692+((f>>>12)+(c[5770]|0)<<2)>>2]|0;if((g|f)&1){if(Bf(f,h,1,2)|0){A=-1;l=B;return A|0}}else b[g+f>>1]=h;z=c[5729]|0;c[5636]=c[5636]&~z|z&k;c[5640]=o;c[5689]=n;z=n<<4;c[5690]=z;A=(c[5696]|0)>>>6&65536;c[5729]=(A^65536)+-1;c[5731]=(c[5694]|z|c[5698]|c[5686]|0)==0?A>>>16:0;c[5730]=(c[5692]&4194304|0)==0?384:0;c[5647]=c[5647]&-328449}else{c[z>>2]=0;c[A>>2]=0;n=(g|0)==2;p=n?h:c[5640]|0;g=f<<3;b:do if((g|7)>>>0>(c[5723]|0)>>>0){c[5746]=13;c[5747]=g|2}else{f=(c[5722]|0)+g|0;k=c[23084+(f>>>12<<2)>>2]|0;if((k|f)&3)if(!(zf(f,2,0,0)|0))k=23048;else break;else k=k+f|0;m=c[k>>2]|0;k=f+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else break;else k=f+k|0;y=c[k>>2]|0;switch(y>>>8&31){case 5:{if(!(y&32768)){c[5746]=11;c[5747]=g|2;break b}k=Xg(g&65535,m,y,2,p,i,j)|0;if(!k)break a;l=B;return k|0}case 15:case 14:case 6:case 7:{o=d[22968]|0;if(n?(y>>>13&3)>>>0<o>>>0:0){c[5746]=13;c[5747]=g|2;break b}if(!(y&32768)){c[5746]=11;c[5747]=g|2;break b}f=m>>>16;w=y&-65536|m&65535;x=f&65532;if(!x){c[5746]=13;c[5747]=0;break b}k=(m>>>17&2^2)+6|0;if((f|7)>>>0>(c[22740+(k<<4)+8>>2]|0)>>>0){c[5746]=13;c[5747]=x;break b}f=(c[22740+(k<<4)+4>>2]|0)+(f&65528)|0;k=c[23084+(f>>>12<<2)>>2]|0;if((k|f)&3)if(!(zf(f,2,0,0)|0))k=23048;else break b;else k=k+f|0;v=c[k>>2]|0;k=f+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else break b;else k=f+k|0;u=c[k>>2]|0;if(!(u>>>11&1&u>>>12)){c[5746]=13;c[5747]=x;break b}h=u>>>13&3;if(h>>>0>o>>>0){c[5746]=13;c[5747]=x;break b}if(!(u&32768)){c[5746]=11;c[5747]=x;break b}k=u&1024;do if((k|0)==0&h>>>0<o>>>0){if(_g(z,A,h)|0)break b;k=c[z>>2]|0;g=k&65532;if(!g){c[5746]=10;c[5747]=0;break b}if((k&3|0)!=(h|0)){c[5746]=10;c[5747]=g;break b}f=(k>>>1&2^2)+6|0;if((k|7)>>>0>(c[22740+(f<<4)+8>>2]|0)>>>0){c[5746]=10;c[5747]=g;break b}f=(c[22740+(f<<4)+4>>2]|0)+(k&-8)|0;k=c[23084+(f>>>12<<2)>>2]|0;if((k|f)&3)if(!(zf(f,2,0,0)|0))k=23048;else break b;else k=k+f|0;m=c[k>>2]|0;k=f+4|0;f=c[23084+(k>>>12<<2)>>2]|0;if((f|k)&3)if(!(zf(k,2,0,0)|0))k=23048;else break b;else k=f+k|0;k=c[k>>2]|0;if((k>>>13&3|0)!=(h|0)){c[5746]=10;c[5747]=g;break b}if(k>>>12&1^1|k>>>11&1|k>>>9&1^1|0){c[5746]=10;c[5747]=g;break b}if(!(k&32768)){c[5746]=10;c[5747]=g;break b}else{f=k;n=1;t=h;s=k&-16777216|m>>>16|k<<16&16711680;r=k;q=m&65535;break}}else{if(!((k|0)!=0|(h|0)==(o|0))){c[5746]=13;c[5747]=x;break b}if(!(c[5647]&131072)){f=c[5696]|0;s=c[5694]|0;c[A>>2]=c[5636];n=0;t=o;r=0;q=0;break}else{c[5746]=13;c[5747]=x;break b}}while(0);h=(f>>>6&65536^65536)+-1|0;do if((y&6144|0)==2048){do if(n){do if(c[5647]&131072|0){k=(c[A>>2]|0)+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5705]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5701]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5697]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5685]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&3)if(!(Bf(k,f,2,0)|0))break;else break b;else{c[g+k>>2]=f;break}}while(0);k=(c[A>>2]|0)+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5693]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5636]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&3)if(!(Bf(k,f,2,0)|0))break;else break b;else{c[g+k>>2]=f;break}}while(0);k=(c[A>>2]|0)+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=sf()|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5689]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&3){if(Bf(f,g,2,0)|0)break b}else{c[m+f>>2]=g;k=c[A>>2]|0}k=k+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&3){if(Bf(k,p,2,0)|0)break b}else c[k+f>>2]=p;if(!i)break;k=(c[A>>2]|0)+-4|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&3)if(!(Bf(k,j,2,0)|0))break;else break b;else{c[k+f>>2]=j;break}}else{do if(n){do if(c[5647]&131072|0){k=(c[A>>2]|0)+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5705]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5701]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5697]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5685]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&1)if(!(Bf(k,f,1,0)|0))break;else break b;else{b[g+k>>1]=f;break}}while(0);k=(c[A>>2]|0)+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5693]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[5636]|0;g=c[8411692+(k>>>12<<2)>>2]|0;if((g|k)&1)if(!(Bf(k,f,1,0)|0))break;else break b;else{b[g+k>>1]=f;break}}while(0);k=(c[A>>2]|0)+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=sf()|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;f=(k&h)+s|0;g=c[5689]|0;m=c[8411692+(f>>>12<<2)>>2]|0;if((m|f)&1){if(Bf(f,g,1,0)|0)break b}else{b[m+f>>1]=g;k=c[A>>2]|0}k=k+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&1){if(Bf(k,p,1,0)|0)break b}else b[k+f>>1]=p;if(!i)break;k=(c[A>>2]|0)+-2|0;c[A>>2]=k;k=(k&h)+s|0;f=c[8411692+(k>>>12<<2)>>2]|0;if((k|f)&1)if(!(Bf(k,j,1,0)|0))break;else break b;else{b[k+f>>1]=j;break}}while(0);if(n){f=c[5647]|0;if(!(f&131072)){m=c[5692]&4194304;p=c[5686]|0;g=c[5698]|0;k=c[5690]|0}else{c[5685]=0;c[5686]=0;c[5687]=0;c[5688]=0;n=(c[5696]|0)>>>6&65536;h=(n^65536)+-1|0;k=c[5690]|0;m=c[5692]&4194304;g=(m|0)==0?384:0;n=(c[5694]|k|0)==0?n>>>16:0;o=22788;p=o+48|0;do{c[o>>2]=0;o=o+4|0}while((o|0)<(p|0));c[5729]=h;c[5731]=n;c[5730]=g;p=0;g=0}o=c[z>>2]&-4|t;c[z>>2]=o;h=r&983040|q;c[5693]=o;c[5694]=s;c[5695]=(r&8388608|0)==0?h:h<<12|4095;c[5696]=r;h=r>>>6&65536;o=(h^65536)+-1|0;c[5729]=o;h=h>>>16;c[5731]=(p|s|g|k|0)==0?h:0;c[5730]=(m|0)==0?384:0;n=o;m=p;k=s}else{n=(c[5696]|0)>>>6&65536;h=n>>>16;n=(n^65536)+-1|0;o=c[5729]|0;m=c[5686]|0;g=c[5698]|0;k=c[5694]|0;f=c[5647]|0}c[5636]=c[A>>2]&o|c[5636]&~o;A=u&-16777216|v>>>16|u<<16&16711680;z=u&983040|v&65535;c[5689]=t|x;c[5690]=A;c[5691]=(u&8388608|0)==0?z:z<<12|4095;c[5692]=u;c[5729]=n;c[5731]=(m|A|g|k|0)==0?h:0;c[5730]=(u&4194304|0)==0?384:0;a[22968]=t;c[5770]=(t|0)==3?1048576:0;c[5640]=w;k=f&-513;if(!(y&256))c[5647]=k;else k=f;c[5647]=k&-213249;break a}default:{c[5746]=13;c[5747]=g|2;break b}}}while(0);A=-1;l=B;return A|0}while(0);c[5748]=-1;A=0;l=B;return A|0} +function Tj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+16|0;o=x;do if(a>>>0<245){k=a>>>0<11?16:a+11&-8;a=k>>>3;n=c[4202145]|0;d=n>>>a;if(d&3|0){b=(d&1^1)+a|0;a=16808620+(b<<1<<2)|0;d=a+8|0;e=c[d>>2]|0;f=e+8|0;g=c[f>>2]|0;if((g|0)==(a|0))c[4202145]=n&~(1<<b);else{c[g+12>>2]=a;c[d>>2]=g}w=b<<3;c[e+4>>2]=w|3;w=e+w+4|0;c[w>>2]=c[w>>2]|1;w=f;l=x;return w|0}m=c[4202147]|0;if(k>>>0>m>>>0){if(d|0){b=2<<a;b=d<<a&(b|0-b);b=(b&0-b)+-1|0;i=b>>>12&16;b=b>>>i;d=b>>>5&8;b=b>>>d;g=b>>>2&4;b=b>>>g;a=b>>>1&2;b=b>>>a;e=b>>>1&1;e=(d|i|g|a|e)+(b>>>e)|0;b=16808620+(e<<1<<2)|0;a=b+8|0;g=c[a>>2]|0;i=g+8|0;d=c[i>>2]|0;if((d|0)==(b|0)){a=n&~(1<<e);c[4202145]=a}else{c[d+12>>2]=b;c[a>>2]=d;a=n}w=e<<3;h=w-k|0;c[g+4>>2]=k|3;f=g+k|0;c[f+4>>2]=h|1;c[g+w>>2]=h;if(m|0){e=c[4202150]|0;b=m>>>3;d=16808620+(b<<1<<2)|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[4202147]=h;c[4202150]=f;w=i;l=x;return w|0}g=c[4202146]|0;if(g){d=(g&0-g)+-1|0;f=d>>>12&16;d=d>>>f;e=d>>>5&8;d=d>>>e;h=d>>>2&4;d=d>>>h;i=d>>>1&2;d=d>>>i;j=d>>>1&1;j=c[16808884+((e|f|h|i|j)+(d>>>j)<<2)>>2]|0;d=j;i=j;j=(c[j+4>>2]&-8)-k|0;while(1){a=c[d+16>>2]|0;if(!a){a=c[d+20>>2]|0;if(!a)break}h=(c[a+4>>2]&-8)-k|0;f=h>>>0<j>>>0;d=a;i=f?a:i;j=f?h:j}h=i+k|0;if(h>>>0>i>>>0){f=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){d=0;break}}while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);do if(f|0){b=c[i+28>>2]|0;a=16808884+(b<<2)|0;if((i|0)==(c[a>>2]|0)){c[a>>2]=d;if(!d){c[4202146]=g&~(1<<b);break}}else{w=f+16|0;c[((c[w>>2]|0)==(i|0)?w:f+20|0)>>2]=d;if(!d)break}c[d+24>>2]=f;b=c[i+16>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}b=c[i+20>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}while(0);if(j>>>0<16){w=j+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[h+4>>2]=j|1;c[h+j>>2]=j;if(m|0){e=c[4202150]|0;b=m>>>3;d=16808620+(b<<1<<2)|0;b=1<<b;if(!(b&n)){c[4202145]=b|n;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=e;c[b+12>>2]=e;c[e+8>>2]=b;c[e+12>>2]=d}c[4202147]=j;c[4202150]=h}w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=k}else if(a>>>0<=4294967231){a=a+11|0;k=a&-8;e=c[4202146]|0;if(e){f=0-k|0;a=a>>>8;if(a)if(k>>>0>16777215)j=31;else{n=(a+1048320|0)>>>16&8;r=a<<n;i=(r+520192|0)>>>16&4;r=r<<i;j=(r+245760|0)>>>16&2;j=14-(i|n|j)+(r<<j>>>15)|0;j=k>>>(j+7|0)&1|j<<1}else j=0;d=c[16808884+(j<<2)>>2]|0;a:do if(!d){d=0;a=0;r=61}else{a=0;i=k<<((j|0)==31?0:25-(j>>>1)|0);g=0;while(1){h=(c[d+4>>2]&-8)-k|0;if(h>>>0<f>>>0)if(!h){a=d;f=0;r=65;break a}else{a=d;f=h}r=c[d+20>>2]|0;d=c[d+16+(i>>>31<<2)>>2]|0;g=(r|0)==0|(r|0)==(d|0)?g:r;if(!d){d=g;r=61;break}else i=i<<1}}while(0);if((r|0)==61){if((d|0)==0&(a|0)==0){a=2<<j;a=(a|0-a)&e;if(!a){n=k;break}n=(a&0-a)+-1|0;h=n>>>12&16;n=n>>>h;g=n>>>5&8;n=n>>>g;i=n>>>2&4;n=n>>>i;j=n>>>1&2;n=n>>>j;d=n>>>1&1;a=0;d=c[16808884+((g|h|i|j|d)+(n>>>d)<<2)>>2]|0}if(!d){i=a;h=f}else r=65}if((r|0)==65){g=d;while(1){n=(c[g+4>>2]&-8)-k|0;d=n>>>0<f>>>0;f=d?n:f;a=d?g:a;d=c[g+16>>2]|0;if(!d)d=c[g+20>>2]|0;if(!d){i=a;h=f;break}else g=d}}if(((i|0)!=0?h>>>0<((c[4202147]|0)-k|0)>>>0:0)?(m=i+k|0,m>>>0>i>>>0):0){g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+20|0;b=c[a>>2]|0;if(!b){a=i+16|0;b=c[a>>2]|0;if(!b){b=0;break}}while(1){f=b+20|0;d=c[f>>2]|0;if(!d){f=b+16|0;d=c[f>>2]|0;if(!d)break;else{b=d;a=f}}else{b=d;a=f}}c[a>>2]=0}else{w=c[i+8>>2]|0;c[w+12>>2]=b;c[b+8>>2]=w}while(0);do if(g){a=c[i+28>>2]|0;d=16808884+(a<<2)|0;if((i|0)==(c[d>>2]|0)){c[d>>2]=b;if(!b){e=e&~(1<<a);c[4202146]=e;break}}else{w=g+16|0;c[((c[w>>2]|0)==(i|0)?w:g+20|0)>>2]=b;if(!b)break}c[b+24>>2]=g;a=c[i+16>>2]|0;if(a|0){c[b+16>>2]=a;c[a+24>>2]=b}a=c[i+20>>2]|0;if(a){c[b+20>>2]=a;c[a+24>>2]=b}}while(0);b:do if(h>>>0<16){w=h+k|0;c[i+4>>2]=w|3;w=i+w+4|0;c[w>>2]=c[w>>2]|1}else{c[i+4>>2]=k|3;c[m+4>>2]=h|1;c[m+h>>2]=h;b=h>>>3;if(h>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=m;c[b+12>>2]=m;c[m+8>>2]=b;c[m+12>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;d=(w+245760|0)>>>16&2;d=14-(u|v|d)+(w<<d>>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=16808884+(d<<2)|0;c[m+28>>2]=d;a=m+16|0;c[a+4>>2]=0;c[a>>2]=0;a=1<<d;if(!(e&a)){c[4202146]=e|a;c[b>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break}b=c[b>>2]|0;c:do if((c[b+4>>2]&-8|0)!=(h|0)){e=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(h|0)){b=a;break c}else{e=e<<1;b=a}}c[d>>2]=m;c[m+24>>2]=b;c[m+12>>2]=m;c[m+8>>2]=m;break b}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=m;c[v>>2]=m;c[m+8>>2]=w;c[m+12>>2]=b;c[m+24>>2]=0}while(0);w=i+8|0;l=x;return w|0}else n=k}else n=k}else n=-1;while(0);d=c[4202147]|0;if(d>>>0>=n>>>0){b=d-n|0;a=c[4202150]|0;if(b>>>0>15){w=a+n|0;c[4202150]=w;c[4202147]=b;c[w+4>>2]=b|1;c[a+d>>2]=b;c[a+4>>2]=n|3}else{c[4202147]=0;c[4202150]=0;c[a+4>>2]=d|3;w=a+d+4|0;c[w>>2]=c[w>>2]|1}w=a+8|0;l=x;return w|0}h=c[4202148]|0;if(h>>>0>n>>>0){u=h-n|0;c[4202148]=u;w=c[4202151]|0;v=w+n|0;c[4202151]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}if(!(c[4202263]|0)){c[4202265]=4096;c[4202264]=4096;c[4202266]=-1;c[4202267]=-1;c[4202268]=0;c[4202256]=0;c[4202263]=o&-16^1431655768;a=4096}else a=c[4202265]|0;i=n+48|0;j=n+47|0;g=a+j|0;f=0-a|0;k=g&f;if(k>>>0<=n>>>0){w=0;l=x;return w|0}a=c[4202255]|0;if(a|0?(m=c[4202253]|0,o=m+k|0,o>>>0<=m>>>0|o>>>0>a>>>0):0){w=0;l=x;return w|0}d:do if(!(c[4202256]&4)){d=c[4202151]|0;e:do if(d){e=16809028;while(1){o=c[e>>2]|0;if(o>>>0<=d>>>0?(o+(c[e+4>>2]|0)|0)>>>0>d>>>0:0)break;a=c[e+8>>2]|0;if(!a){r=128;break e}else e=a}b=g-h&f;if(b>>>0<2147483647){a=Ol(b|0)|0;if((a|0)==((c[e>>2]|0)+(c[e+4>>2]|0)|0)){if((a|0)!=(-1|0)){h=b;g=a;r=145;break d}}else{e=a;r=136}}else b=0}else r=128;while(0);do if((r|0)==128){d=Ol(0)|0;if((d|0)!=(-1|0)?(b=d,p=c[4202264]|0,q=p+-1|0,b=((q&b|0)==0?0:(q+b&0-p)-b|0)+k|0,p=c[4202253]|0,q=b+p|0,b>>>0>n>>>0&b>>>0<2147483647):0){o=c[4202255]|0;if(o|0?q>>>0<=p>>>0|q>>>0>o>>>0:0){b=0;break}a=Ol(b|0)|0;if((a|0)==(d|0)){h=b;g=d;r=145;break d}else{e=a;r=136}}else b=0}while(0);do if((r|0)==136){d=0-b|0;if(!(i>>>0>b>>>0&(b>>>0<2147483647&(e|0)!=(-1|0))))if((e|0)==(-1|0)){b=0;break}else{h=b;g=e;r=145;break d}a=c[4202265]|0;a=j-b+a&0-a;if(a>>>0>=2147483647){h=b;g=e;r=145;break d}if((Ol(a|0)|0)==(-1|0)){Ol(d|0)|0;b=0;break}else{h=a+b|0;g=e;r=145;break d}}while(0);c[4202256]=c[4202256]|4;r=143}else{b=0;r=143}while(0);if(((r|0)==143?k>>>0<2147483647:0)?(u=Ol(k|0)|0,q=Ol(0)|0,s=q-u|0,t=s>>>0>(n+40|0)>>>0,!((u|0)==(-1|0)|t^1|u>>>0<q>>>0&((u|0)!=(-1|0)&(q|0)!=(-1|0))^1)):0){h=t?s:b;g=u;r=145}if((r|0)==145){b=(c[4202253]|0)+h|0;c[4202253]=b;if(b>>>0>(c[4202254]|0)>>>0)c[4202254]=b;j=c[4202151]|0;f:do if(j){b=16809028;while(1){a=c[b>>2]|0;d=c[b+4>>2]|0;if((g|0)==(a+d|0)){r=154;break}e=c[b+8>>2]|0;if(!e)break;else b=e}if(((r|0)==154?(v=b+4|0,(c[b+12>>2]&8|0)==0):0)?g>>>0>j>>>0&a>>>0<=j>>>0:0){c[v>>2]=d+h;w=(c[4202148]|0)+h|0;u=j+8|0;u=(u&7|0)==0?0:0-u&7;v=j+u|0;u=w-u|0;c[4202151]=v;c[4202148]=u;c[v+4>>2]=u|1;c[j+w+4>>2]=40;c[4202152]=c[4202267];break}if(g>>>0<(c[4202149]|0)>>>0)c[4202149]=g;d=g+h|0;b=16809028;while(1){if((c[b>>2]|0)==(d|0)){r=162;break}a=c[b+8>>2]|0;if(!a)break;else b=a}if((r|0)==162?(c[b+12>>2]&8|0)==0:0){c[b>>2]=g;m=b+4|0;c[m>>2]=(c[m>>2]|0)+h;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;b=d+8|0;b=d+((b&7|0)==0?0:0-b&7)|0;k=m+n|0;i=b-m-n|0;c[m+4>>2]=n|3;g:do if((j|0)==(b|0)){w=(c[4202148]|0)+i|0;c[4202148]=w;c[4202151]=k;c[k+4>>2]=w|1}else{if((c[4202150]|0)==(b|0)){w=(c[4202147]|0)+i|0;c[4202147]=w;c[4202150]=k;c[k+4>>2]=w|1;c[k+w>>2]=w;break}a=c[b+4>>2]|0;if((a&3|0)==1){h=a&-8;e=a>>>3;h:do if(a>>>0<256){a=c[b+8>>2]|0;d=c[b+12>>2]|0;if((d|0)==(a|0)){c[4202145]=c[4202145]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}else{g=c[b+24>>2]|0;a=c[b+12>>2]|0;do if((a|0)==(b|0)){d=b+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{w=c[b+8>>2]|0;c[w+12>>2]=a;c[a+8>>2]=w}while(0);if(!g)break;d=c[b+28>>2]|0;e=16808884+(d<<2)|0;do if((c[e>>2]|0)!=(b|0)){w=g+16|0;c[((c[w>>2]|0)==(b|0)?w:g+20|0)>>2]=a;if(!a)break h}else{c[e>>2]=a;if(a|0)break;c[4202146]=c[4202146]&~(1<<d);break h}while(0);c[a+24>>2]=g;d=b+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(!d)break;c[a+20>>2]=d;c[d+24>>2]=a}while(0);b=b+h|0;f=h+i|0}else f=i;b=b+4|0;c[b>>2]=c[b>>2]&-2;c[k+4>>2]=f|1;c[k+f>>2]=f;b=f>>>3;if(f>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=k;c[b+12>>2]=k;c[k+8>>2]=b;c[k+12>>2]=d;break}b=f>>>8;do if(!b)e=0;else{if(f>>>0>16777215){e=31;break}v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}while(0);b=16808884+(e<<2)|0;c[k+28>>2]=e;a=k+16|0;c[a+4>>2]=0;c[a>>2]=0;a=c[4202146]|0;d=1<<e;if(!(a&d)){c[4202146]=a|d;c[b>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break}b=c[b>>2]|0;i:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break i}else{e=e<<1;b=a}}c[d>>2]=k;c[k+24>>2]=b;c[k+12>>2]=k;c[k+8>>2]=k;break g}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=k;c[v>>2]=k;c[k+8>>2]=w;c[k+12>>2]=b;c[k+24>>2]=0}while(0);w=m+8|0;l=x;return w|0}b=16809028;while(1){a=c[b>>2]|0;if(a>>>0<=j>>>0?(w=a+(c[b+4>>2]|0)|0,w>>>0>j>>>0):0)break;b=c[b+8>>2]|0}f=w+-47|0;a=f+8|0;a=f+((a&7|0)==0?0:0-a&7)|0;f=j+16|0;a=a>>>0<f>>>0?j:a;b=a+8|0;d=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=d-u|0;c[4202151]=v;c[4202148]=u;c[v+4>>2]=u|1;c[g+d+4>>2]=40;c[4202152]=c[4202267];d=a+4|0;c[d>>2]=27;c[b>>2]=c[4202257];c[b+4>>2]=c[4202258];c[b+8>>2]=c[4202259];c[b+12>>2]=c[4202260];c[4202257]=g;c[4202258]=h;c[4202260]=0;c[4202259]=b;b=a+24|0;do{v=b;b=b+4|0;c[b>>2]=7}while((v+8|0)>>>0<w>>>0);if((a|0)!=(j|0)){g=a-j|0;c[d>>2]=c[d>>2]&-2;c[j+4>>2]=g|1;c[a>>2]=g;b=g>>>3;if(g>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=j;c[b+12>>2]=j;c[j+8>>2]=b;c[j+12>>2]=d;break}b=g>>>8;if(b)if(g>>>0>16777215)e=31;else{v=(b+1048320|0)>>>16&8;w=b<<v;u=(w+520192|0)>>>16&4;w=w<<u;e=(w+245760|0)>>>16&2;e=14-(u|v|e)+(w<<e>>>15)|0;e=g>>>(e+7|0)&1|e<<1}else e=0;d=16808884+(e<<2)|0;c[j+28>>2]=e;c[j+20>>2]=0;c[f>>2]=0;b=c[4202146]|0;a=1<<e;if(!(b&a)){c[4202146]=b|a;c[d>>2]=j;c[j+24>>2]=d;c[j+12>>2]=j;c[j+8>>2]=j;break}b=c[d>>2]|0;j:do if((c[b+4>>2]&-8|0)!=(g|0)){e=g<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(g|0)){b=a;break j}else{e=e<<1;b=a}}c[d>>2]=j;c[j+24>>2]=b;c[j+12>>2]=j;c[j+8>>2]=j;break f}while(0);v=b+8|0;w=c[v>>2]|0;c[w+12>>2]=j;c[v>>2]=j;c[j+8>>2]=w;c[j+12>>2]=b;c[j+24>>2]=0}}else{w=c[4202149]|0;if((w|0)==0|g>>>0<w>>>0)c[4202149]=g;c[4202257]=g;c[4202258]=h;c[4202260]=0;c[4202154]=c[4202263];c[4202153]=-1;c[4202158]=16808620;c[4202157]=16808620;c[4202160]=16808628;c[4202159]=16808628;c[4202162]=16808636;c[4202161]=16808636;c[4202164]=16808644;c[4202163]=16808644;c[4202166]=16808652;c[4202165]=16808652;c[4202168]=16808660;c[4202167]=16808660;c[4202170]=16808668;c[4202169]=16808668;c[4202172]=16808676;c[4202171]=16808676;c[4202174]=16808684;c[4202173]=16808684;c[4202176]=16808692;c[4202175]=16808692;c[4202178]=16808700;c[4202177]=16808700;c[4202180]=16808708;c[4202179]=16808708;c[4202182]=16808716;c[4202181]=16808716;c[4202184]=16808724;c[4202183]=16808724;c[4202186]=16808732;c[4202185]=16808732;c[4202188]=16808740;c[4202187]=16808740;c[4202190]=16808748;c[4202189]=16808748;c[4202192]=16808756;c[4202191]=16808756;c[4202194]=16808764;c[4202193]=16808764;c[4202196]=16808772;c[4202195]=16808772;c[4202198]=16808780;c[4202197]=16808780;c[4202200]=16808788;c[4202199]=16808788;c[4202202]=16808796;c[4202201]=16808796;c[4202204]=16808804;c[4202203]=16808804;c[4202206]=16808812;c[4202205]=16808812;c[4202208]=16808820;c[4202207]=16808820;c[4202210]=16808828;c[4202209]=16808828;c[4202212]=16808836;c[4202211]=16808836;c[4202214]=16808844;c[4202213]=16808844;c[4202216]=16808852;c[4202215]=16808852;c[4202218]=16808860;c[4202217]=16808860;c[4202220]=16808868;c[4202219]=16808868;w=h+-40|0;u=g+8|0;u=(u&7|0)==0?0:0-u&7;v=g+u|0;u=w-u|0;c[4202151]=v;c[4202148]=u;c[v+4>>2]=u|1;c[g+w+4>>2]=40;c[4202152]=c[4202267]}while(0);b=c[4202148]|0;if(b>>>0>n>>>0){u=b-n|0;c[4202148]=u;w=c[4202151]|0;v=w+n|0;c[4202151]=v;c[v+4>>2]=u|1;c[w+4>>2]=n|3;w=w+8|0;l=x;return w|0}}c[(ak()|0)>>2]=12;w=0;l=x;return w|0}function Uj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!a)return;d=a+-8|0;f=c[4202149]|0;a=c[a+-4>>2]|0;b=a&-8;j=d+b|0;do if(!(a&1)){e=c[d>>2]|0;if(!(a&3))return;h=d+(0-e)|0;g=e+b|0;if(h>>>0<f>>>0)return;if((c[4202150]|0)==(h|0)){a=j+4|0;b=c[a>>2]|0;if((b&3|0)!=3){i=h;b=g;break}c[4202147]=g;c[a>>2]=b&-2;c[h+4>>2]=g|1;c[h+g>>2]=g;return}d=e>>>3;if(e>>>0<256){a=c[h+8>>2]|0;b=c[h+12>>2]|0;if((b|0)==(a|0)){c[4202145]=c[4202145]&~(1<<d);i=h;b=g;break}else{c[a+12>>2]=b;c[b+8>>2]=a;i=h;b=g;break}}f=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){b=h+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){a=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0}else{i=c[h+8>>2]|0;c[i+12>>2]=a;c[a+8>>2]=i}while(0);if(f){b=c[h+28>>2]|0;d=16808884+(b<<2)|0;if((c[d>>2]|0)==(h|0)){c[d>>2]=a;if(!a){c[4202146]=c[4202146]&~(1<<b);i=h;b=g;break}}else{i=f+16|0;c[((c[i>>2]|0)==(h|0)?i:f+20|0)>>2]=a;if(!a){i=h;b=g;break}}c[a+24>>2]=f;b=h+16|0;d=c[b>>2]|0;if(d|0){c[a+16>>2]=d;c[d+24>>2]=a}b=c[b+4>>2]|0;if(b){c[a+20>>2]=b;c[b+24>>2]=a;i=h;b=g}else{i=h;b=g}}else{i=h;b=g}}else{i=d;h=d}while(0);if(h>>>0>=j>>>0)return;a=j+4|0;e=c[a>>2]|0;if(!(e&1))return;if(!(e&2)){if((c[4202151]|0)==(j|0)){j=(c[4202148]|0)+b|0;c[4202148]=j;c[4202151]=i;c[i+4>>2]=j|1;if((i|0)!=(c[4202150]|0))return;c[4202150]=0;c[4202147]=0;return}if((c[4202150]|0)==(j|0)){j=(c[4202147]|0)+b|0;c[4202147]=j;c[4202150]=h;c[i+4>>2]=j|1;c[h+j>>2]=j;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){b=c[j+8>>2]|0;a=c[j+12>>2]|0;if((a|0)==(b|0)){c[4202145]=c[4202145]&~(1<<d);break}else{c[b+12>>2]=a;c[a+8>>2]=b;break}}else{g=c[j+24>>2]|0;a=c[j+12>>2]|0;do if((a|0)==(j|0)){b=j+16|0;d=b+4|0;a=c[d>>2]|0;if(!a){a=c[b>>2]|0;if(!a){d=0;break}}else b=d;while(1){e=a+20|0;d=c[e>>2]|0;if(!d){e=a+16|0;d=c[e>>2]|0;if(!d)break;else{a=d;b=e}}else{a=d;b=e}}c[b>>2]=0;d=a}else{d=c[j+8>>2]|0;c[d+12>>2]=a;c[a+8>>2]=d;d=a}while(0);if(g|0){a=c[j+28>>2]|0;b=16808884+(a<<2)|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=d;if(!d){c[4202146]=c[4202146]&~(1<<a);break}}else{e=g+16|0;c[((c[e>>2]|0)==(j|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;a=j+16|0;b=c[a>>2]|0;if(b|0){c[d+16>>2]=b;c[b+24>>2]=d}a=c[a+4>>2]|0;if(a|0){c[d+20>>2]=a;c[a+24>>2]=d}}}while(0);c[i+4>>2]=f|1;c[h+f>>2]=f;if((i|0)==(c[4202150]|0)){c[4202147]=f;return}}else{c[a>>2]=e&-2;c[i+4>>2]=b|1;c[h+b>>2]=b;f=b}a=f>>>3;if(f>>>0<256){d=16808620+(a<<1<<2)|0;b=c[4202145]|0;a=1<<a;if(!(b&a)){c[4202145]=b|a;a=d;b=d+8|0}else{b=d+8|0;a=c[b>>2]|0}c[b>>2]=i;c[a+12>>2]=i;c[i+8>>2]=a;c[i+12>>2]=d;return}a=f>>>8;if(a)if(f>>>0>16777215)e=31;else{h=(a+1048320|0)>>>16&8;j=a<<h;g=(j+520192|0)>>>16&4;j=j<<g;e=(j+245760|0)>>>16&2;e=14-(g|h|e)+(j<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;a=16808884+(e<<2)|0;c[i+28>>2]=e;c[i+20>>2]=0;c[i+16>>2]=0;b=c[4202146]|0;d=1<<e;a:do if(!(b&d)){c[4202146]=b|d;c[a>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i}else{a=c[a>>2]|0;b:do if((c[a+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=a+16+(e>>>31<<2)|0;b=c[d>>2]|0;if(!b)break;if((c[b+4>>2]&-8|0)==(f|0)){a=b;break b}else{e=e<<1;a=b}}c[d>>2]=i;c[i+24>>2]=a;c[i+12>>2]=i;c[i+8>>2]=i;break a}while(0);h=a+8|0;j=c[h>>2]|0;c[j+12>>2]=i;c[h>>2]=i;c[i+8>>2]=j;c[i+12>>2]=a;c[i+24>>2]=0}while(0);j=(c[4202153]|0)+-1|0;c[4202153]=j;if(j|0)return;a=16809036;while(1){a=c[a>>2]|0;if(!a)break;else a=a+8|0}c[4202153]=-1;return}function Vj(a,b){a=a|0;b=b|0;var d=0,e=0;if(!a){b=Tj(b)|0;return b|0}if(b>>>0>4294967231){c[(ak()|0)>>2]=12;b=0;return b|0}d=Wj(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(d|0){b=d+8|0;return b|0}d=Tj(b)|0;if(!d){b=0;return b|0}e=c[a+-4>>2]|0;e=(e&-8)-((e&3|0)==0?8:4)|0;Ll(d|0,a|0,(e>>>0<b>>>0?e:b)|0)|0;Uj(a);b=d;return b|0}function Wj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;l=a+4|0;m=c[l>>2]|0;d=m&-8;i=a+d|0;if(!(m&3)){if(b>>>0<256){a=0;return a|0}if(d>>>0>=(b+4|0)>>>0?(d-b|0)>>>0<=c[4202265]<<1>>>0:0)return a|0;a=0;return a|0}if(d>>>0>=b>>>0){d=d-b|0;if(d>>>0<=15)return a|0;k=a+b|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|3;m=i+4|0;c[m>>2]=c[m>>2]|1;Xj(k,d);return a|0}if((c[4202151]|0)==(i|0)){k=(c[4202148]|0)+d|0;d=k-b|0;e=a+b|0;if(k>>>0<=b>>>0){a=0;return a|0}c[l>>2]=m&1|b|2;c[e+4>>2]=d|1;c[4202151]=e;c[4202148]=d;return a|0}if((c[4202150]|0)==(i|0)){e=(c[4202147]|0)+d|0;if(e>>>0<b>>>0){a=0;return a|0}d=e-b|0;if(d>>>0>15){k=a+b|0;e=a+e|0;c[l>>2]=m&1|b|2;c[k+4>>2]=d|1;c[e>>2]=d;e=e+4|0;c[e>>2]=c[e>>2]&-2;e=k}else{c[l>>2]=m&1|e|2;e=a+e+4|0;c[e>>2]=c[e>>2]|1;e=0;d=0}c[4202147]=d;c[4202150]=e;return a|0}e=c[i+4>>2]|0;if(e&2|0){a=0;return a|0}j=(e&-8)+d|0;if(j>>>0<b>>>0){a=0;return a|0}k=j-b|0;f=e>>>3;do if(e>>>0<256){e=c[i+8>>2]|0;d=c[i+12>>2]|0;if((d|0)==(e|0)){c[4202145]=c[4202145]&~(1<<f);break}else{c[e+12>>2]=d;c[d+8>>2]=e;break}}else{h=c[i+24>>2]|0;d=c[i+12>>2]|0;do if((d|0)==(i|0)){e=i+16|0;f=e+4|0;d=c[f>>2]|0;if(!d){d=c[e>>2]|0;if(!d){f=0;break}}else e=f;while(1){g=d+20|0;f=c[g>>2]|0;if(!f){g=d+16|0;f=c[g>>2]|0;if(!f)break;else{d=f;e=g}}else{d=f;e=g}}c[e>>2]=0;f=d}else{f=c[i+8>>2]|0;c[f+12>>2]=d;c[d+8>>2]=f;f=d}while(0);if(h|0){d=c[i+28>>2]|0;e=16808884+(d<<2)|0;if((c[e>>2]|0)==(i|0)){c[e>>2]=f;if(!f){c[4202146]=c[4202146]&~(1<<d);break}}else{g=h+16|0;c[((c[g>>2]|0)==(i|0)?g:h+20|0)>>2]=f;if(!f)break}c[f+24>>2]=h;d=i+16|0;e=c[d>>2]|0;if(e|0){c[f+16>>2]=e;c[e+24>>2]=f}d=c[d+4>>2]|0;if(d|0){c[f+20>>2]=d;c[d+24>>2]=f}}}while(0);if(k>>>0<16){c[l>>2]=m&1|j|2;m=a+j+4|0;c[m>>2]=c[m>>2]|1;return a|0}else{i=a+b|0;c[l>>2]=m&1|b|2;c[i+4>>2]=k|3;m=a+j+4|0;c[m>>2]=c[m>>2]|1;Xj(i,k);return a|0}return 0}function Xj(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=a+b|0;d=c[a+4>>2]|0;do if(!(d&1)){f=c[a>>2]|0;if(!(d&3))return;h=a+(0-f)|0;b=f+b|0;if((c[4202150]|0)==(h|0)){a=i+4|0;d=c[a>>2]|0;if((d&3|0)!=3)break;c[4202147]=b;c[a>>2]=d&-2;c[h+4>>2]=b|1;c[i>>2]=b;return}e=f>>>3;if(f>>>0<256){a=c[h+8>>2]|0;d=c[h+12>>2]|0;if((d|0)==(a|0)){c[4202145]=c[4202145]&~(1<<e);break}else{c[a+12>>2]=d;c[d+8>>2]=a;break}}g=c[h+24>>2]|0;a=c[h+12>>2]|0;do if((a|0)==(h|0)){d=h+16|0;e=d+4|0;a=c[e>>2]|0;if(!a){a=c[d>>2]|0;if(!a){a=0;break}}else d=e;while(1){f=a+20|0;e=c[f>>2]|0;if(!e){f=a+16|0;e=c[f>>2]|0;if(!e)break;else{a=e;d=f}}else{a=e;d=f}}c[d>>2]=0}else{f=c[h+8>>2]|0;c[f+12>>2]=a;c[a+8>>2]=f}while(0);if(g){d=c[h+28>>2]|0;e=16808884+(d<<2)|0;if((c[e>>2]|0)==(h|0)){c[e>>2]=a;if(!a){c[4202146]=c[4202146]&~(1<<d);break}}else{f=g+16|0;c[((c[f>>2]|0)==(h|0)?f:g+20|0)>>2]=a;if(!a)break}c[a+24>>2]=g;d=h+16|0;e=c[d>>2]|0;if(e|0){c[a+16>>2]=e;c[e+24>>2]=a}d=c[d+4>>2]|0;if(d){c[a+20>>2]=d;c[d+24>>2]=a}}}else h=a;while(0);a=i+4|0;e=c[a>>2]|0;if(!(e&2)){if((c[4202151]|0)==(i|0)){i=(c[4202148]|0)+b|0;c[4202148]=i;c[4202151]=h;c[h+4>>2]=i|1;if((h|0)!=(c[4202150]|0))return;c[4202150]=0;c[4202147]=0;return}if((c[4202150]|0)==(i|0)){i=(c[4202147]|0)+b|0;c[4202147]=i;c[4202150]=h;c[h+4>>2]=i|1;c[h+i>>2]=i;return}f=(e&-8)+b|0;d=e>>>3;do if(e>>>0<256){a=c[i+8>>2]|0;b=c[i+12>>2]|0;if((b|0)==(a|0)){c[4202145]=c[4202145]&~(1<<d);break}else{c[a+12>>2]=b;c[b+8>>2]=a;break}}else{g=c[i+24>>2]|0;b=c[i+12>>2]|0;do if((b|0)==(i|0)){a=i+16|0;d=a+4|0;b=c[d>>2]|0;if(!b){b=c[a>>2]|0;if(!b){d=0;break}}else a=d;while(1){e=b+20|0;d=c[e>>2]|0;if(!d){e=b+16|0;d=c[e>>2]|0;if(!d)break;else{b=d;a=e}}else{b=d;a=e}}c[a>>2]=0;d=b}else{d=c[i+8>>2]|0;c[d+12>>2]=b;c[b+8>>2]=d;d=b}while(0);if(g|0){b=c[i+28>>2]|0;a=16808884+(b<<2)|0;if((c[a>>2]|0)==(i|0)){c[a>>2]=d;if(!d){c[4202146]=c[4202146]&~(1<<b);break}}else{e=g+16|0;c[((c[e>>2]|0)==(i|0)?e:g+20|0)>>2]=d;if(!d)break}c[d+24>>2]=g;b=i+16|0;a=c[b>>2]|0;if(a|0){c[d+16>>2]=a;c[a+24>>2]=d}b=c[b+4>>2]|0;if(b|0){c[d+20>>2]=b;c[b+24>>2]=d}}}while(0);c[h+4>>2]=f|1;c[h+f>>2]=f;if((h|0)==(c[4202150]|0)){c[4202147]=f;return}}else{c[a>>2]=e&-2;c[h+4>>2]=b|1;c[h+b>>2]=b;f=b}b=f>>>3;if(f>>>0<256){d=16808620+(b<<1<<2)|0;a=c[4202145]|0;b=1<<b;if(!(a&b)){c[4202145]=a|b;b=d;a=d+8|0}else{a=d+8|0;b=c[a>>2]|0}c[a>>2]=h;c[b+12>>2]=h;c[h+8>>2]=b;c[h+12>>2]=d;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{g=(b+1048320|0)>>>16&8;i=b<<g;d=(i+520192|0)>>>16&4;i=i<<d;e=(i+245760|0)>>>16&2;e=14-(d|g|e)+(i<<e>>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=16808884+(e<<2)|0;c[h+28>>2]=e;c[h+20>>2]=0;c[h+16>>2]=0;a=c[4202146]|0;d=1<<e;if(!(a&d)){c[4202146]=a|d;c[b>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}b=c[b>>2]|0;a:do if((c[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){d=b+16+(e>>>31<<2)|0;a=c[d>>2]|0;if(!a)break;if((c[a+4>>2]&-8|0)==(f|0)){b=a;break a}else{e=e<<1;b=a}}c[d>>2]=h;c[h+24>>2]=b;c[h+12>>2]=h;c[h+8>>2]=h;return}while(0);g=b+8|0;i=c[g>>2]|0;c[i+12>>2]=h;c[g>>2]=h;c[h+8>>2]=i;c[h+12>>2]=b;c[h+24>>2]=0;return}function Yj(a){a=a|0;var b=0,d=0;b=l;l=l+16|0;d=b;c[d>>2]=bk(c[a+60>>2]|0)|0;a=$j(pa(6,d|0)|0)|0;l=b;return a|0}function Zj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0;n=l;l=l+48|0;k=n+32|0;g=n+16|0;f=n;i=a+28|0;e=c[i>>2]|0;c[f>>2]=e;j=a+20|0;e=(c[j>>2]|0)-e|0;c[f+4>>2]=e;c[f+8>>2]=b;c[f+12>>2]=d;e=e+d|0;h=a+60|0;c[g>>2]=c[h>>2];c[g+4>>2]=f;c[g+8>>2]=2;g=$j(na(146,g|0)|0)|0;a:do if((e|0)!=(g|0)){b=2;while(1){if((g|0)<0)break;e=e-g|0;p=c[f+4>>2]|0;o=g>>>0>p>>>0;f=o?f+8|0:f;b=b+(o<<31>>31)|0;p=g-(o?p:0)|0;c[f>>2]=(c[f>>2]|0)+p;o=f+4|0;c[o>>2]=(c[o>>2]|0)-p;c[k>>2]=c[h>>2];c[k+4>>2]=f;c[k+8>>2]=b;g=$j(na(146,k|0)|0)|0;if((e|0)==(g|0)){m=3;break a}}c[a+16>>2]=0;c[i>>2]=0;c[j>>2]=0;c[a>>2]=c[a>>2]|32;if((b|0)==2)d=0;else d=d-(c[f+4>>2]|0)|0}else m=3;while(0);if((m|0)==3){p=c[a+44>>2]|0;c[a+16>>2]=p+(c[a+48>>2]|0);c[i>>2]=p;c[j>>2]=p}l=n;return d|0}function _j(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;f=l;l=l+32|0;g=f;e=f+20|0;c[g>>2]=c[a+60>>2];c[g+4>>2]=0;c[g+8>>2]=b;c[g+12>>2]=e;c[g+16>>2]=d;if(($j(ma(140,g|0)|0)|0)<0){c[e>>2]=-1;a=-1}else a=c[e>>2]|0;l=f;return a|0}function $j(a){a=a|0;if(a>>>0>4294963200){c[(ak()|0)>>2]=0-a;a=-1}return a|0}function ak(){return 16809140}function bk(a){a=a|0;return a|0}function ck(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+32|0;f=g;c[b+36>>2]=1;if((c[b>>2]&64|0)==0?(c[f>>2]=c[b+60>>2],c[f+4>>2]=21523,c[f+8>>2]=g+16,oa(54,f|0)|0):0)a[b+75>>0]=-1;f=Zj(b,d,e)|0;l=g;return f|0}function dk(a){a=a|0;return (a+-48|0)>>>0<10|0}function ek(){return 14904}function fk(b,c){b=b|0;c=c|0;var d=0,e=0;d=a[b>>0]|0;e=a[c>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=e<<24>>24)b=e;else{do{b=b+1|0;c=c+1|0;d=a[b>>0]|0;e=a[c>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=e<<24>>24));b=e}return (d&255)-(b&255)|0}function gk(b){b=b|0;var d=0,e=0,f=0;f=b;a:do if(!(f&3))e=5;else{d=f;while(1){if(!(a[b>>0]|0)){b=d;break a}b=b+1|0;d=b;if(!(d&3)){e=5;break}}}while(0);if((e|0)==5){while(1){d=c[b>>2]|0;if(!((d&-2139062144^-2139062144)&d+-16843009))b=b+4|0;else break}if((d&255)<<24>>24)do b=b+1|0;while((a[b>>0]|0)!=0)}return b-f|0}function hk(a,b){a=a|0;b=b|0;jk(a,b)|0;return a|0}function ik(a,b){a=a|0;b=b|0;hk(a+(gk(a)|0)|0,b)|0;return a|0}function jk(b,d){b=b|0;d=d|0;var e=0,f=0;e=d;a:do if(!((e^b)&3)){if(e&3)do{e=a[d>>0]|0;a[b>>0]=e;if(!(e<<24>>24))break a;d=d+1|0;b=b+1|0}while((d&3|0)!=0);e=c[d>>2]|0;if(!((e&-2139062144^-2139062144)&e+-16843009)){f=b;while(1){d=d+4|0;b=f+4|0;c[f>>2]=e;e=c[d>>2]|0;if((e&-2139062144^-2139062144)&e+-16843009|0)break;else f=b}}f=10}else f=10;while(0);if((f|0)==10){f=a[d>>0]|0;a[b>>0]=f;if(f<<24>>24)do{d=d+1|0;b=b+1|0;f=a[d>>0]|0;a[b>>0]=f}while(f<<24>>24!=0)}return b|0}function kk(b,c){b=b|0;c=c|0;b=mk(b,c)|0;return ((a[b>>0]|0)==(c&255)<<24>>24?b:0)|0}function lk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=d&255;f=(e|0)!=0;a:do if(f&(b&3|0)!=0){g=d&255;while(1){if((a[b>>0]|0)==g<<24>>24){i=6;break a}b=b+1|0;e=e+-1|0;f=(e|0)!=0;if(!(f&(b&3|0)!=0)){i=5;break}}}else i=5;while(0);if((i|0)==5)if(f)i=6;else i=16;b:do if((i|0)==6){g=d&255;if((a[b>>0]|0)==g<<24>>24)if(!e){i=16;break}else break;f=N(h,16843009)|0;c:do if(e>>>0>3)while(1){h=c[b>>2]^f;if((h&-2139062144^-2139062144)&h+-16843009|0)break c;b=b+4|0;e=e+-4|0;if(e>>>0<=3){i=11;break}}else i=11;while(0);if((i|0)==11)if(!e){i=16;break}while(1){if((a[b>>0]|0)==g<<24>>24)break b;e=e+-1|0;if(!e){i=16;break}else b=b+1|0}}while(0);if((i|0)==16)b=0;return b|0}function mk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;f=d&255;a:do if(!f)b=b+(gk(b)|0)|0;else{if(b&3){e=d&255;do{g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break a;b=b+1|0}while((b&3|0)!=0)}f=N(f,16843009)|0;e=c[b>>2]|0;b:do if(!((e&-2139062144^-2139062144)&e+-16843009))do{g=e^f;if((g&-2139062144^-2139062144)&g+-16843009|0)break b;b=b+4|0;e=c[b>>2]|0}while(!((e&-2139062144^-2139062144)&e+-16843009|0));while(0);e=d&255;while(1){g=a[b>>0]|0;if(g<<24>>24==0?1:g<<24>>24==e<<24>>24)break;else b=b+1|0}}while(0);return b|0}function nk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=l;l=l+16|0;g=f;c[g>>2]=e;e=ok(a,b,d,g)|0;l=f;return e|0}function ok(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,m=0,n=0;n=l;l=l+128|0;g=n+124|0;m=n;h=m;i=15148;j=h+124|0;do{c[h>>2]=c[i>>2];h=h+4|0;i=i+4|0}while((h|0)<(j|0));if((d+-1|0)>>>0>2147483646)if(!d){b=g;d=1;k=4}else{c[(ak()|0)>>2]=75;d=-1}else k=4;if((k|0)==4){k=-2-b|0;k=d>>>0>k>>>0?k:d;c[m+48>>2]=k;g=m+20|0;c[g>>2]=b;c[m+44>>2]=b;d=b+k|0;b=m+16|0;c[b>>2]=d;c[m+28>>2]=d;d=pk(m,e,f)|0;if(k){m=c[g>>2]|0;a[m+(((m|0)==(c[b>>2]|0))<<31>>31)>>0]=0}}l=n;return d|0}function pk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=l;l=l+224|0;n=s+208|0;p=s+160|0;q=s+80|0;r=s;f=p;g=f+40|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(g|0));c[n>>2]=c[e>>2];if((qk(0,d,n,q,p)|0)<0)e=-1;else{if((c[b+76>>2]|0)>-1)o=rk(b)|0;else o=0;e=c[b>>2]|0;m=e&32;if((a[b+74>>0]|0)<1)c[b>>2]=e&-33;f=b+48|0;if(!(c[f>>2]|0)){g=b+44|0;h=c[g>>2]|0;c[g>>2]=r;i=b+28|0;c[i>>2]=r;j=b+20|0;c[j>>2]=r;c[f>>2]=80;k=b+16|0;c[k>>2]=r+80;e=qk(b,d,n,q,p)|0;if(h){Ya[c[b+36>>2]&63](b,0,0)|0;e=(c[j>>2]|0)==0?-1:e;c[g>>2]=h;c[f>>2]=0;c[k>>2]=0;c[i>>2]=0;c[j>>2]=0}}else e=qk(b,d,n,q,p)|0;f=c[b>>2]|0;c[b>>2]=f|m;if(o|0)sk(b);e=(f&32|0)==0?e:-1}l=s;return e|0}function qk(d,e,f,g,i){d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=l;l=l+64|0;D=I+56|0;E=I+40|0;A=I;G=I+48|0;H=I+60|0;c[D>>2]=e;w=(d|0)!=0;x=A+40|0;z=x;A=A+39|0;B=G+4|0;j=0;e=0;m=0;a:while(1){do{do if((e|0)>-1)if((j|0)>(2147483647-e|0)){c[(ak()|0)>>2]=75;e=-1;break}else{e=j+e|0;break}while(0);s=c[D>>2]|0;j=a[s>>0]|0;if(!(j<<24>>24)){v=94;break a}k=s;b:while(1){switch(j<<24>>24){case 37:{v=10;break b}case 0:{j=k;break b}default:{}}u=k+1|0;c[D>>2]=u;j=a[u>>0]|0;k=u}c:do if((v|0)==10){v=0;j=k;do{if((a[k+1>>0]|0)!=37)break c;j=j+1|0;k=k+2|0;c[D>>2]=k}while((a[k>>0]|0)==37)}while(0);j=j-s|0;if(w)tk(d,s,j)}while((j|0)!=0);u=(dk(a[(c[D>>2]|0)+1>>0]|0)|0)==0;k=c[D>>2]|0;if(!u?(a[k+2>>0]|0)==36:0){q=(a[k+1>>0]|0)+-48|0;o=1;j=3}else{q=-1;o=m;j=1}j=k+j|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0;if(m>>>0>31|(1<<m&75913|0)==0)n=0;else{n=0;do{n=1<<m|n;j=j+1|0;c[D>>2]=j;k=a[j>>0]|0;m=(k<<24>>24)+-32|0}while(!(m>>>0>31|(1<<m&75913|0)==0))}if(k<<24>>24==42){if((dk(a[j+1>>0]|0)|0)!=0?(F=c[D>>2]|0,(a[F+2>>0]|0)==36):0){j=F+1|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;m=1;k=F+3|0}else{if(o|0){e=-1;break}if(w){u=(c[f>>2]|0)+(4-1)&~(4-1);j=c[u>>2]|0;c[f>>2]=u+4}else j=0;m=0;k=(c[D>>2]|0)+1|0}c[D>>2]=k;u=(j|0)<0;t=u?0-j|0:j;n=u?n|8192:n;u=m}else{j=uk(D)|0;if((j|0)<0){e=-1;break}t=j;u=o;k=c[D>>2]|0}do if((a[k>>0]|0)==46){j=k+1|0;if((a[j>>0]|0)!=42){c[D>>2]=j;j=uk(D)|0;k=c[D>>2]|0;break}if(dk(a[k+2>>0]|0)|0?(C=c[D>>2]|0,(a[C+3>>0]|0)==36):0){j=C+2|0;c[i+((a[j>>0]|0)+-48<<2)>>2]=10;j=c[g+((a[j>>0]|0)+-48<<3)>>2]|0;k=C+4|0;c[D>>2]=k;break}if(u|0){e=-1;break a}if(w){r=(c[f>>2]|0)+(4-1)&~(4-1);j=c[r>>2]|0;c[f>>2]=r+4}else j=0;k=(c[D>>2]|0)+2|0;c[D>>2]=k}else j=-1;while(0);r=0;while(1){if(((a[k>>0]|0)+-65|0)>>>0>57){e=-1;break a}m=k;k=k+1|0;c[D>>2]=k;m=a[(a[m>>0]|0)+-65+(11728+(r*58|0))>>0]|0;o=m&255;if((o+-1|0)>>>0>=8)break;else r=o}if(!(m<<24>>24)){e=-1;break}p=(q|0)>-1;do if(m<<24>>24==19)if(p){e=-1;break a}else v=54;else{if(p){c[i+(q<<2)>>2]=o;p=g+(q<<3)|0;q=c[p+4>>2]|0;v=E;c[v>>2]=c[p>>2];c[v+4>>2]=q;v=54;break}if(!w){e=0;break a}vk(E,o,f);k=c[D>>2]|0;v=55}while(0);if((v|0)==54){v=0;if(w)v=55;else j=0}d:do if((v|0)==55){v=0;k=a[k+-1>>0]|0;k=(r|0)!=0&(k&15|0)==3?k&-33:k;m=n&-65537;q=(n&8192|0)==0?n:m;e:do switch(k|0){case 110:switch((r&255)<<24>>24){case 0:{c[c[E>>2]>>2]=e;j=0;break d}case 1:{c[c[E>>2]>>2]=e;j=0;break d}case 2:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}case 3:{b[c[E>>2]>>1]=e;j=0;break d}case 4:{a[c[E>>2]>>0]=e;j=0;break d}case 6:{c[c[E>>2]>>2]=e;j=0;break d}case 7:{j=c[E>>2]|0;c[j>>2]=e;c[j+4>>2]=((e|0)<0)<<31>>31;j=0;break d}default:{j=0;break d}}case 112:{k=120;j=j>>>0>8?j:8;m=q|8;v=67;break}case 88:case 120:{m=q;v=67;break}case 111:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;p=xk(k,m,x)|0;v=z-p|0;n=0;o=20067;j=(q&8|0)==0|(j|0)>(v|0)?j:v+1|0;v=73;break}case 105:case 100:{m=E;k=c[m>>2]|0;m=c[m+4>>2]|0;if((m|0)<0){k=yl(0,0,k|0,m|0)|0;m=y;n=E;c[n>>2]=k;c[n+4>>2]=m;n=1;o=20067;v=72;break e}else{n=(q&2049|0)!=0&1;o=(q&2048|0)==0?((q&1|0)==0?20067:20069):20068;v=72;break e}}case 117:{m=E;n=0;o=20067;k=c[m>>2]|0;m=c[m+4>>2]|0;v=72;break}case 99:{a[A>>0]=c[E>>2];r=A;n=0;o=20067;p=1;j=z;break}case 109:{k=zk(c[(ak()|0)>>2]|0)|0;v=77;break}case 115:{k=c[E>>2]|0;k=(k|0)==0?20077:k;v=77;break}case 67:{c[G>>2]=c[E>>2];c[B>>2]=0;c[E>>2]=G;o=-1;v=81;break}case 83:{if(!j){Ak(d,32,t,0,q);j=0;v=91}else{o=j;v=81}break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{j=Ck(d,+h[E>>3],t,j,q,k)|0;break d}default:{r=s;n=0;o=20067;p=j;m=q;j=z}}while(0);f:do if((v|0)==67){s=E;r=c[s>>2]|0;s=c[s+4>>2]|0;p=wk(r,s,x,k&32)|0;o=(m&8|0)==0|(r|0)==0&(s|0)==0;n=o?0:2;o=o?20067:20067+(k>>>4)|0;q=m;k=r;m=s;v=73}else if((v|0)==72){p=yk(k,m,x)|0;v=73}else if((v|0)==77){v=0;s=lk(k,0,j)|0;q=(s|0)==0;r=k;n=0;o=20067;p=q?j:s-k|0;j=q?k+j|0:s}else if((v|0)==81){v=0;n=c[E>>2]|0;j=0;while(1){k=c[n>>2]|0;if(!k)break;k=Bk(H,k)|0;m=(k|0)<0;if(m|k>>>0>(o-j|0)>>>0){v=85;break}j=k+j|0;if(o>>>0>j>>>0)n=n+4|0;else break}if((v|0)==85){v=0;if(m){e=-1;break a}}Ak(d,32,t,j,q);if(!j){j=0;v=91}else{m=c[E>>2]|0;n=0;while(1){k=c[m>>2]|0;if(!k){v=91;break f}k=Bk(H,k)|0;n=k+n|0;if((n|0)>(j|0)){v=91;break f}tk(d,H,k);if(n>>>0>=j>>>0){v=91;break}else m=m+4|0}}}while(0);if((v|0)==73){v=0;m=(k|0)!=0|(m|0)!=0;s=(j|0)!=0|m;m=z-p+((m^1)&1)|0;r=s?p:x;p=s?((j|0)>(m|0)?j:m):0;m=(j|0)>-1?q&-65537:q;j=z}else if((v|0)==91){v=0;Ak(d,32,t,j,q^8192);j=(t|0)>(j|0)?t:j;break}q=j-r|0;p=(p|0)<(q|0)?q:p;s=p+n|0;j=(t|0)<(s|0)?s:t;Ak(d,32,j,s,m);tk(d,o,n);Ak(d,48,j,s,m^65536);Ak(d,48,p,q,0);tk(d,r,q);Ak(d,32,j,s,m^8192)}while(0);m=u}g:do if((v|0)==94)if(!d)if(!m)e=0;else{e=1;while(1){j=c[i+(e<<2)>>2]|0;if(!j)break;vk(g+(e<<3)|0,j,f);e=e+1|0;if(e>>>0>=10){e=1;break g}}while(1){if(c[i+(e<<2)>>2]|0){e=-1;break g}e=e+1|0;if(e>>>0>=10){e=1;break}}}while(0);l=I;return e|0}function rk(a){a=a|0;return 0}function sk(a){a=a|0;return}function tk(a,b,d){a=a|0;b=b|0;d=d|0;if(!(c[a>>2]&32))Ok(b,d,a)|0;return}function uk(b){b=b|0;var d=0,e=0;if(!(dk(a[c[b>>2]>>0]|0)|0))d=0;else{d=0;do{e=c[b>>2]|0;d=(d*10|0)+-48+(a[e>>0]|0)|0;e=e+1|0;c[b>>2]=e}while((dk(a[e>>0]|0)|0)!=0)}return d|0}function vk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;c[a>>2]=b;break a}case 10:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{e=(c[d>>2]|0)+(4-1)&~(4-1);b=c[e>>2]|0;c[d>>2]=e+4;e=a;c[e>>2]=b;c[e+4>>2]=0;break a}case 12:{e=(c[d>>2]|0)+(8-1)&~(8-1);b=e;f=c[b>>2]|0;b=c[b+4>>2]|0;c[d>>2]=e+8;e=a;c[e>>2]=f;c[e+4>>2]=b;break a}case 13:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&65535)<<16>>16;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 14:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&65535;c[f+4>>2]=0;break a}case 15:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;e=(e&255)<<24>>24;f=a;c[f>>2]=e;c[f+4>>2]=((e|0)<0)<<31>>31;break a}case 16:{f=(c[d>>2]|0)+(4-1)&~(4-1);e=c[f>>2]|0;c[d>>2]=f+4;f=a;c[f>>2]=e&255;c[f+4>>2]=0;break a}case 17:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}case 18:{f=(c[d>>2]|0)+(8-1)&~(8-1);g=+h[f>>3];c[d>>2]=f+8;h[a>>3]=g;break a}default:break a}while(0);while(0);return}function wk(b,c,e,f){b=b|0;c=c|0;e=e|0;f=f|0;if(!((b|0)==0&(c|0)==0))do{e=e+-1|0;a[e>>0]=d[12192+(b&15)>>0]|0|f;b=Il(b|0,c|0,4)|0;c=y}while(!((b|0)==0&(c|0)==0));return e|0}function xk(b,c,d){b=b|0;c=c|0;d=d|0;if(!((b|0)==0&(c|0)==0))do{d=d+-1|0;a[d>>0]=b&7|48;b=Il(b|0,c|0,3)|0;c=y}while(!((b|0)==0&(c|0)==0));return d|0}function yk(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(c>>>0>0|(c|0)==0&b>>>0>4294967295){do{e=b;b=Fl(b|0,c|0,10,0)|0;f=c;c=y;g=Dl(b|0,c|0,10,0)|0;g=yl(e|0,f|0,g|0,y|0)|0;d=d+-1|0;a[d>>0]=g&255|48}while(f>>>0>9|(f|0)==9&e>>>0>4294967295);c=b}else c=b;if(c)do{g=c;c=(c>>>0)/10|0;d=d+-1|0;a[d>>0]=g-(c*10|0)|48}while(g>>>0>=10);return d|0}function zk(a){a=a|0;return Jk(a,c[(Ik()|0)+188>>2]|0)|0}function Ak(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+256|0;f=g;if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;Nl(f|0,b<<24>>24|0,(e>>>0<256?e:256)|0)|0;if(e>>>0>255){b=c-d|0;do{tk(a,f,256);e=e+-256|0}while(e>>>0>255);e=b&255}tk(a,f,e)}l=g;return}function Bk(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Gk(a,b,0)|0;return a|0}function Ck(b,e,f,g,h,i){b=b|0;e=+e;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;H=l;l=l+560|0;m=H+32|0;v=H+536|0;G=H;F=G;n=H+540|0;c[v>>2]=0;E=n+12|0;Dk(e)|0;j=y;if((j|0)<0){e=-e;Dk(e)|0;D=1;C=20084;j=y}else{D=(h&2049|0)!=0&1;C=(h&2048|0)==0?((h&1|0)==0?20085:20090):20087}do if(0==0&(j&2146435072|0)==2146435072){G=(i&32|0)!=0;j=D+3|0;Ak(b,32,f,j,h&-65537);tk(b,C,D);tk(b,e!=e|0.0!=0.0?(G?20111:20115):G?20103:20107,3);Ak(b,32,f,j,h^8192)}else{r=+Ek(e,v)*2.0;j=r!=0.0;if(j)c[v>>2]=(c[v>>2]|0)+-1;u=i|32;if((u|0)==97){p=i&32;s=(p|0)==0?C:C+9|0;q=D|2;j=12-g|0;do if(!(g>>>0>11|(j|0)==0)){e=8.0;do{j=j+-1|0;e=e*16.0}while((j|0)!=0);if((a[s>>0]|0)==45){e=-(e+(-r-e));break}else{e=r+e-e;break}}else e=r;while(0);k=c[v>>2]|0;j=(k|0)<0?0-k|0:k;j=yk(j,((j|0)<0)<<31>>31,E)|0;if((j|0)==(E|0)){j=n+11|0;a[j>>0]=48}a[j+-1>>0]=(k>>31&2)+43;o=j+-2|0;a[o>>0]=i+15;k=(g|0)<1;m=(h&8|0)==0;n=G;do{D=~~e;j=n+1|0;a[n>>0]=p|d[12192+D>>0];e=(e-+(D|0))*16.0;if((j-F|0)==1?!(m&(k&e==0.0)):0){a[j>>0]=46;n=n+2|0}else n=j}while(e!=0.0);if((g|0)!=0?(-2-F+n|0)<(g|0):0){k=E;m=o;j=g+2+k-m|0}else{k=E;m=o;j=k-F-m+n|0}E=j+q|0;Ak(b,32,f,E,h);tk(b,s,q);Ak(b,48,f,E,h^65536);F=n-F|0;tk(b,G,F);G=k-m|0;Ak(b,48,j-(F+G)|0,0,0);tk(b,o,G);Ak(b,32,f,E,h^8192);j=E;break}k=(g|0)<0?6:g;if(j){j=(c[v>>2]|0)+-28|0;c[v>>2]=j;e=r*268435456.0}else{e=r;j=c[v>>2]|0}B=(j|0)<0?m:m+288|0;m=B;do{z=~~e>>>0;c[m>>2]=z;m=m+4|0;e=(e-+(z>>>0))*1.0e9}while(e!=0.0);z=B;if((j|0)>0){p=B;while(1){o=(j|0)<29?j:29;j=m+-4|0;if(j>>>0>=p>>>0){n=0;do{t=Jl(c[j>>2]|0,0,o|0)|0;t=xl(t|0,y|0,n|0,0)|0;w=y;n=Fl(t|0,w|0,1e9,0)|0;x=Dl(n|0,y|0,1e9,0)|0;x=yl(t|0,w|0,x|0,y|0)|0;c[j>>2]=x;j=j+-4|0}while(j>>>0>=p>>>0);if(n){x=p+-4|0;c[x>>2]=n;n=x}else n=p}else n=p;a:do if(m>>>0>n>>>0){j=m;while(1){m=j+-4|0;if(c[m>>2]|0){m=j;break a}if(m>>>0>n>>>0)j=m;else break}}while(0);j=(c[v>>2]|0)-o|0;c[v>>2]=j;if((j|0)>0)p=n;else break}}else n=B;if((j|0)<0){g=((k+25|0)/9|0)+1|0;t=(u|0)==102;do{s=0-j|0;s=(s|0)<9?s:9;if(n>>>0<m>>>0){o=(1<<s)+-1|0;p=1e9>>>s;q=0;j=n;do{x=c[j>>2]|0;c[j>>2]=(x>>>s)+q;q=N(x&o,p)|0;j=j+4|0}while(j>>>0<m>>>0);n=(c[n>>2]|0)==0?n+4|0:n;if(q){c[m>>2]=q;m=m+4|0}}else n=(c[n>>2]|0)==0?n+4|0:n;j=t?B:n;m=(m-j>>2|0)>(g|0)?j+(g<<2)|0:m;j=(c[v>>2]|0)+s|0;c[v>>2]=j}while((j|0)<0);t=n}else t=n;if(t>>>0<m>>>0){j=(z-t>>2)*9|0;o=c[t>>2]|0;if(o>>>0>=10){n=10;do{n=n*10|0;j=j+1|0}while(o>>>0>=n>>>0)}}else j=0;w=(u|0)==103;x=(k|0)!=0;n=k-((u|0)==102?0:j)+((x&w)<<31>>31)|0;if((n|0)<(((m-z>>2)*9|0)+-9|0)){v=n+9216|0;n=(v|0)/9|0;g=B+4+(n+-1024<<2)|0;n=v-(n*9|0)|0;if((n|0)<8){o=10;while(1){o=o*10|0;if((n|0)<7)n=n+1|0;else break}}else o=10;q=c[g>>2]|0;n=(q>>>0)/(o>>>0)|0;s=q-(N(n,o)|0)|0;p=(g+4|0)==(m|0);if(!(p&(s|0)==0)){r=(n&1|0)==0?9007199254740992.0:9007199254740994.0;v=o>>>1;e=s>>>0<v>>>0?.5:p&(s|0)==(v|0)?1.0:1.5;if(D){v=(a[C>>0]|0)==45;e=v?-e:e;r=v?-r:r}n=q-s|0;c[g>>2]=n;if(r+e!=r){v=n+o|0;c[g>>2]=v;if(v>>>0>999999999){o=g;j=t;while(1){n=o+-4|0;c[o>>2]=0;if(n>>>0<j>>>0){j=j+-4|0;c[j>>2]=0}v=(c[n>>2]|0)+1|0;c[n>>2]=v;if(v>>>0>999999999)o=n;else{o=j;break}}}else{n=g;o=t}j=(z-o>>2)*9|0;q=c[o>>2]|0;if(q>>>0>=10){p=10;do{p=p*10|0;j=j+1|0}while(q>>>0>=p>>>0)}}else{n=g;o=t}}else{n=g;o=t}v=n+4|0;m=m>>>0>v>>>0?v:m}else o=t;g=0-j|0;b:do if(m>>>0>o>>>0)while(1){n=m+-4|0;if(c[n>>2]|0){v=m;u=1;break b}if(n>>>0>o>>>0)m=n;else{v=n;u=0;break}}else{v=m;u=0}while(0);do if(w){k=k+((x^1)&1)|0;if((k|0)>(j|0)&(j|0)>-5){p=i+-1|0;k=k+-1-j|0}else{p=i+-2|0;k=k+-1|0}if(!(h&8)){if(u?(A=c[v+-4>>2]|0,(A|0)!=0):0)if(!((A>>>0)%10|0)){n=0;m=10;do{m=m*10|0;n=n+1|0}while(!((A>>>0)%(m>>>0)|0|0))}else n=0;else n=9;m=((v-z>>2)*9|0)+-9|0;if((p|32|0)==102){i=m-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}else{i=m+j-n|0;i=(i|0)>0?i:0;k=(k|0)<(i|0)?k:i;break}}}else p=i;while(0);t=(k|0)!=0;q=t?1:h>>>3&1;s=(p|32|0)==102;if(s){w=0;j=(j|0)>0?j:0}else{m=(j|0)<0?g:j;m=yk(m,((m|0)<0)<<31>>31,E)|0;n=E;if((n-m|0)<2)do{m=m+-1|0;a[m>>0]=48}while((n-m|0)<2);a[m+-1>>0]=(j>>31&2)+43;j=m+-2|0;a[j>>0]=p;w=j;j=n-j|0}j=D+1+k+q+j|0;Ak(b,32,f,j,h);tk(b,C,D);Ak(b,48,f,j,h^65536);if(s){q=o>>>0>B>>>0?B:o;s=G+9|0;o=s;p=G+8|0;n=q;do{m=yk(c[n>>2]|0,0,s)|0;if((n|0)==(q|0)){if((m|0)==(s|0)){a[p>>0]=48;m=p}}else if(m>>>0>G>>>0){Nl(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}tk(b,m,o-m|0);n=n+4|0}while(n>>>0<=B>>>0);if(!((h&8|0)==0&(t^1)))tk(b,20119,1);if(n>>>0<v>>>0&(k|0)>0)while(1){m=yk(c[n>>2]|0,0,s)|0;if(m>>>0>G>>>0){Nl(G|0,48,m-F|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}tk(b,m,(k|0)<9?k:9);n=n+4|0;m=k+-9|0;if(!(n>>>0<v>>>0&(k|0)>9)){k=m;break}else k=m}Ak(b,48,k+9|0,9,0)}else{v=u?v:o+4|0;if(o>>>0<v>>>0&(k|0)>-1){g=G+9|0;t=(h&8|0)==0;u=g;q=0-F|0;s=G+8|0;p=o;do{m=yk(c[p>>2]|0,0,g)|0;if((m|0)==(g|0)){a[s>>0]=48;m=s}do if((p|0)==(o|0)){n=m+1|0;tk(b,m,1);if(t&(k|0)<1){m=n;break}tk(b,20119,1);m=n}else{if(m>>>0<=G>>>0)break;Nl(G|0,48,m+q|0)|0;do m=m+-1|0;while(m>>>0>G>>>0)}while(0);F=u-m|0;tk(b,m,(k|0)>(F|0)?F:k);k=k-F|0;p=p+4|0}while(p>>>0<v>>>0&(k|0)>-1)}Ak(b,48,k+18|0,18,0);tk(b,w,E-w|0)}Ak(b,32,f,j,h^8192)}while(0);l=H;return ((j|0)<(f|0)?f:j)|0}function Dk(a){a=+a;var b=0;h[j>>3]=a;b=c[j>>2]|0;y=c[j+4>>2]|0;return b|0}function Ek(a,b){a=+a;b=b|0;return +(+Fk(a,b))}function Fk(a,b){a=+a;b=b|0;var d=0,e=0,f=0;h[j>>3]=a;d=c[j>>2]|0;e=c[j+4>>2]|0;f=Il(d|0,e|0,52)|0;switch(f&2047){case 0:{if(a!=0.0){a=+Fk(a*18446744073709551616.0,b);d=(c[b>>2]|0)+-64|0}else d=0;c[b>>2]=d;break}case 2047:break;default:{c[b>>2]=(f&2047)+-1022;c[j>>2]=d;c[j+4>>2]=e&-2146435073|1071644672;a=+h[j>>3]}}return +a}function Gk(b,d,e){b=b|0;d=d|0;e=e|0;do if(b){if(d>>>0<128){a[b>>0]=d;b=1;break}if(!(c[c[(Hk()|0)+188>>2]>>2]|0))if((d&-128|0)==57216){a[b>>0]=d;b=1;break}else{c[(ak()|0)>>2]=84;b=-1;break}if(d>>>0<2048){a[b>>0]=d>>>6|192;a[b+1>>0]=d&63|128;b=2;break}if(d>>>0<55296|(d&-8192|0)==57344){a[b>>0]=d>>>12|224;a[b+1>>0]=d>>>6&63|128;a[b+2>>0]=d&63|128;b=3;break}if((d+-65536|0)>>>0<1048576){a[b>>0]=d>>>18|240;a[b+1>>0]=d>>>12&63|128;a[b+2>>0]=d>>>6&63|128;a[b+3>>0]=d&63|128;b=4;break}else{c[(ak()|0)>>2]=84;b=-1;break}}else b=1;while(0);return b|0}function Hk(){return ek()|0}function Ik(){return ek()|0}function Jk(b,e){b=b|0;e=e|0;var f=0,g=0;f=0;while(1){if((d[12208+f>>0]|0)==(b|0)){g=4;break}f=f+1|0;if((f|0)==87){b=87;g=5;break}}if((g|0)==4)if(!f)f=12304;else{b=f;g=5}if((g|0)==5){f=12304;do{do{g=f;f=f+1|0}while((a[g>>0]|0)!=0);b=b+-1|0}while((b|0)!=0)}return Kk(f,c[e+20>>2]|0)|0}function Kk(a,b){a=a|0;b=b|0;return Lk(a,b)|0}function Lk(a,b){a=a|0;b=b|0;if(!b)b=0;else b=Mk(c[b>>2]|0,c[b+4>>2]|0,a)|0;return ((b|0)==0?a:b)|0}function Mk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;o=(c[b>>2]|0)+1794895138|0;h=Nk(c[b+8>>2]|0,o)|0;f=Nk(c[b+12>>2]|0,o)|0;g=Nk(c[b+16>>2]|0,o)|0;a:do if((h>>>0<d>>>2>>>0?(n=d-(h<<2)|0,f>>>0<n>>>0&g>>>0<n>>>0):0)?((g|f)&3|0)==0:0){n=f>>>2;m=g>>>2;l=0;while(1){j=h>>>1;k=l+j|0;i=k<<1;g=i+n|0;f=Nk(c[b+(g<<2)>>2]|0,o)|0;g=Nk(c[b+(g+1<<2)>>2]|0,o)|0;if(!(g>>>0<d>>>0&f>>>0<(d-g|0)>>>0)){f=0;break a}if(a[b+(g+f)>>0]|0){f=0;break a}f=fk(e,b+g|0)|0;if(!f)break;f=(f|0)<0;if((h|0)==1){f=0;break a}l=f?l:k;h=f?j:h-j|0}f=i+m|0;g=Nk(c[b+(f<<2)>>2]|0,o)|0;f=Nk(c[b+(f+1<<2)>>2]|0,o)|0;if(f>>>0<d>>>0&g>>>0<(d-f|0)>>>0)f=(a[b+(f+g)>>0]|0)==0?b+f|0:0;else f=0}else f=0;while(0);return f|0}function Nk(a,b){a=a|0;b=b|0;var c=0;c=Kl(a|0)|0;return ((b|0)==0?a:c)|0}function Ok(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=e+16|0;g=c[f>>2]|0;if(!g)if(!(Pk(e)|0)){g=c[f>>2]|0;h=5}else f=0;else h=5;a:do if((h|0)==5){j=e+20|0;i=c[j>>2]|0;f=i;if((g-i|0)>>>0<d>>>0){f=Ya[c[e+36>>2]&63](e,b,d)|0;break}b:do if((a[e+75>>0]|0)<0|(d|0)==0){h=0;g=b}else{i=d;while(1){g=i+-1|0;if((a[b+g>>0]|0)==10)break;if(!g){h=0;g=b;break b}else i=g}f=Ya[c[e+36>>2]&63](e,b,i)|0;if(f>>>0<i>>>0)break a;h=i;g=b+i|0;d=d-i|0;f=c[j>>2]|0}while(0);Ll(f|0,g|0,d|0)|0;c[j>>2]=(c[j>>2]|0)+d;f=h+d|0}while(0);return f|0}function Pk(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=c[b>>2]|0;if(!(d&8)){c[b+8>>2]=0;c[b+4>>2]=0;e=c[b+44>>2]|0;c[b+28>>2]=e;c[b+20>>2]=e;c[b+16>>2]=e+(c[b+48>>2]|0);b=0}else{c[b>>2]=d|32;b=-1}return b|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+20|0;f=c[e>>2]|0;a=(c[a+16>>2]|0)-f|0;a=a>>>0>d>>>0?d:a;Ll(f|0,b|0,a|0)|0;c[e>>2]=(c[e>>2]|0)+a;return d|0}function Rk(a,b){a=a|0;b=b|0;return Sk(a,b,(gk(a)|0)+1|0)|0}function Sk(b,c,d){b=b|0;c=c|0;d=d|0;a:do if(!d)d=0;else{c=c&255;while(1){d=d+-1|0;if((a[b+d>>0]|0)==c<<24>>24)break;if(!d){d=0;break a}}d=b+d|0}while(0);return d|0}function Tk(a){a=a|0;var b=0,c=0;b=(gk(a)|0)+1|0;c=Tj(b)|0;if(!c)a=0;else a=Ll(c|0,a|0,b|0)|0;return a|0}function Uk(b,c){b=b|0;c=c|0;var d=0;d=a[c>>0]|0;do if(d<<24>>24){b=kk(b,d<<24>>24)|0;if(b){if(a[c+1>>0]|0)if(a[b+1>>0]|0){if(!(a[c+2>>0]|0)){b=Vk(b,c)|0;break}if(a[b+2>>0]|0){if(!(a[c+3>>0]|0)){b=Wk(b,c)|0;break}if(a[b+3>>0]|0)if(!(a[c+4>>0]|0)){b=Xk(b,c)|0;break}else{b=Yk(b,c)|0;break}else b=0}else b=0}else b=0}else b=0}while(0);return b|0}function Vk(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c>>0]|0)<<8|(d[c+1>>0]|0);c=b+1|0;e=a[c>>0]|0;a:do if(!(e<<24>>24))c=0;else{e=(d[b>>0]|0)<<8|e&255;while(1){b=e&65535;if((b|0)==(f|0))break;c=c+1|0;e=a[c>>0]|0;if(!(e<<24>>24)){c=0;break a}else e=b<<8|e&255}c=c+-1|0}while(0);return c|0}function Wk(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8;e=b+2|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(c&255)<<8;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=(b|c&255)<<8;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-2|0)|0}function Xk(b,c){b=b|0;c=c|0;var e=0,f=0;f=(d[c+1>>0]|0)<<16|(d[c>>0]|0)<<24|(d[c+2>>0]|0)<<8|(d[c+3>>0]|0);e=b+3|0;c=a[e>>0]|0;b=(d[b+1>>0]|0)<<16|(d[b>>0]|0)<<24|(d[b+2>>0]|0)<<8|c&255;c=c<<24>>24==0;if(!((b|0)==(f|0)|c))do{e=e+1|0;c=a[e>>0]|0;b=b<<8|c&255;c=c<<24>>24==0}while(!((b|0)==(f|0)|c));return (c?0:e+-3|0)|0}function Yk(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;x=l;l=l+1056|0;v=x+1024|0;w=x;c[v>>2]=0;c[v+4>>2]=0;c[v+8>>2]=0;c[v+12>>2]=0;c[v+16>>2]=0;c[v+20>>2]=0;c[v+24>>2]=0;c[v+28>>2]=0;f=a[e>>0]|0;a:do if(f<<24>>24){q=0;do{if(!(a[b+q>>0]|0)){f=0;break a}u=f&255;t=v+(u>>>5<<2)|0;c[t>>2]=c[t>>2]|1<<(u&31);q=q+1|0;c[w+(u<<2)>>2]=q;f=a[e+q>>0]|0}while(f<<24>>24!=0);n=q>>>0>1;if(n){k=1;j=1;m=0;i=-1;o=1;while(1){f=a[e+(j+i)>>0]|0;g=a[e+o>>0]|0;do if(f<<24>>24==g<<24>>24)if((j|0)==(k|0)){h=k;f=1;g=k+m|0;break}else{h=k;f=j+1|0;g=m;break}else if((f&255)>(g&255)){h=o-i|0;f=1;g=o;break}else{h=1;f=1;g=m+1|0;i=m;break}while(0);o=f+g|0;if(o>>>0>=q>>>0)break;else{k=h;j=f;m=g}}if(n){n=1;m=1;o=0;g=-1;p=1;while(1){f=a[e+(m+g)>>0]|0;j=a[e+p>>0]|0;do if(f<<24>>24==j<<24>>24)if((m|0)==(n|0)){f=n;j=1;k=n+o|0;break}else{f=n;j=m+1|0;k=o;break}else if((f&255)<(j&255)){f=p-g|0;j=1;k=p;break}else{f=1;j=1;k=o+1|0;g=o;break}while(0);p=j+k|0;if(p>>>0>=q>>>0){u=q;j=25;break}else{n=f;m=j;o=k}}}else{u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=q;f=1;g=-1;j=25}}else{h=1;i=-1;u=0;f=1;g=-1;j=25}while(0);b:do if((j|0)==25){s=(g+1|0)>>>0>(i+1|0)>>>0;f=s?f:h;s=s?g:i;t=s+1|0;if(!(Zk(e,e+f|0,t)|0)){n=u-f|0;r=n;m=f}else{n=u-s+-1|0;n=(s>>>0>n>>>0?s:n)+1|0;r=0;m=n;n=u-n|0}o=u|63;p=u+-1|0;q=(r|0)!=0;f=b;k=0;g=b;while(1){h=f;do if((g-h|0)>>>0<u>>>0){i=lk(g,0,o)|0;if(i)if((i-h|0)>>>0<u>>>0){f=0;break b}else break;else{i=g+o|0;break}}else i=g;while(0);g=d[f+p>>0]|0;c:do if(!(1<<(g&31)&c[v+(g>>>5<<2)>>2])){h=0;g=u}else{g=u-(c[w+(g<<2)>>2]|0)|0;if(g|0){h=0;g=q&(k|0)!=0&g>>>0<m>>>0?n:g;break}j=t>>>0>k>>>0;g=j?t:k;h=a[e+g>>0]|0;d:do if(h<<24>>24){while(1){if(h<<24>>24!=(a[f+g>>0]|0))break;g=g+1|0;h=a[e+g>>0]|0;if(!(h<<24>>24))break d}h=0;g=g-s|0;break c}while(0);if(!j)break b;g=t;while(1){g=g+-1|0;if((a[e+g>>0]|0)!=(a[f+g>>0]|0)){h=r;g=m;break c}if(g>>>0<=k>>>0)break b}}while(0);f=f+g|0;k=h;g=i}}while(0);l=x;return f|0}function Zk(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if(!d)b=0;else{while(1){e=a[b>>0]|0;f=a[c>>0]|0;if(e<<24>>24!=f<<24>>24)break;d=d+-1|0;if(!d){b=0;break a}else{b=b+1|0;c=c+1|0}}b=(e&255)-(f&255)|0}while(0);return b|0}function _k(a,b,c){a=a|0;b=b|0;c=c|0;c=bl(a,b,c,-1,0)|0;return c|0}function $k(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=al(a,b,f)|0;l=e;return d|0}function al(a,b,c){a=a|0;b=b|0;c=c|0;return ok(a,2147483647,b,c)|0}function bl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;j=l;l=l+128|0;h=j;c[h>>2]=0;i=h+4|0;c[i>>2]=a;c[h+44>>2]=a;g=h+8|0;c[g>>2]=(a|0)<0?-1:a+2147483647|0;c[h+76>>2]=-1;cl(h,0);d=dl(h,d,1,e,f)|0;if(b|0)c[b>>2]=a+((c[i>>2]|0)+(c[h+108>>2]|0)-(c[g>>2]|0));l=j;return d|0}function cl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0))c[a+100>>2]=e+b;else c[a+100>>2]=d;return}function dl(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:do if(e>>>0>36){c[(ak()|0)>>2]=22;h=0;g=0}else{r=b+4|0;q=b+100|0;do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0}while((fl(i)|0)!=0);b:do switch(i|0){case 43:case 45:{i=((i|0)==45)<<31>>31;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;p=i;i=d[j>>0]|0;break b}else{p=i;i=el(b)|0;break b}}default:p=0}while(0);j=(e|0)==0;do if((e|16|0)==16&(i|0)==48){i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0;if((i|32|0)!=120)if(j){o=8;n=47;break}else{n=32;break}i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0;if((d[14113+i>>0]|0)>15){g=(c[q>>2]|0)==0;if(!g)c[r>>2]=(c[r>>2]|0)+-1;if(!f){cl(b,0);h=0;g=0;break a}if(g){h=0;g=0;break a}c[r>>2]=(c[r>>2]|0)+-1;h=0;g=0;break a}else{o=16;n=47}}else{e=j?10:e;if(e>>>0>(d[14113+i>>0]|0)>>>0)n=32;else{if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;cl(b,0);c[(ak()|0)>>2]=22;h=0;g=0;break a}}while(0);c:do if((n|0)==32)if((e|0)==10){e=i+-48|0;if(e>>>0<10){i=0;do{i=(i*10|0)+e|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;e=j+-48|0}while(e>>>0<10&i>>>0<429496729);if(e>>>0<10){m=0;do{f=Dl(i|0,m|0,10,0)|0;k=y;l=((e|0)<0)<<31>>31;o=~l;if(k>>>0>o>>>0|(k|0)==(o|0)&f>>>0>~e>>>0){f=10;e=m;n=76;break c}i=xl(f|0,k|0,e|0,l|0)|0;m=y;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;e=j+-48|0}while(e>>>0<10&(m>>>0<429496729|(m|0)==429496729&i>>>0<2576980378));if(e>>>0>9){j=p;e=m}else{f=10;e=m;n=76}}else{j=p;e=0}}else{j=p;e=0;i=0}}else{o=e;n=47}while(0);d:do if((n|0)==47){if(!(o+-1&o)){n=a[20121+((o*23|0)>>>5&7)>>0]|0;f=a[14113+i>>0]|0;e=f&255;if(o>>>0>e>>>0){i=0;do{i=e|i<<n;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;f=a[14113+j>>0]|0;e=f&255}while(i>>>0<134217728&o>>>0>e>>>0);k=e;e=0}else{j=i;k=e;e=0;i=0}l=Il(-1,-1,n|0)|0;m=y;if(o>>>0<=k>>>0|(m>>>0<e>>>0|(m|0)==(e|0)&l>>>0<i>>>0)){f=o;n=76;break}while(1){i=Jl(i|0,e|0,n|0)|0;e=y;i=i|f&255;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=el(b)|0;f=a[14113+j>>0]|0;if(o>>>0<=(f&255)>>>0|(e>>>0>m>>>0|(e|0)==(m|0)&i>>>0>l>>>0)){f=o;n=76;break d}}}e=a[14113+i>>0]|0;f=e&255;if(o>>>0>f>>>0){i=0;do{i=f+(N(i,o)|0)|0;e=c[r>>2]|0;if(e>>>0<(c[q>>2]|0)>>>0){c[r>>2]=e+1;j=d[e>>0]|0}else j=el(b)|0;e=a[14113+j>>0]|0;f=e&255}while(i>>>0<119304647&o>>>0>f>>>0);k=e;e=0}else{j=i;k=e;i=0;e=0}if(o>>>0>f>>>0){m=Fl(-1,-1,o|0,0)|0;n=y;f=k;while(1){if(e>>>0>n>>>0|(e|0)==(n|0)&i>>>0>m>>>0){f=o;n=76;break d}k=Dl(i|0,e|0,o|0,0)|0;l=y;f=f&255;if(l>>>0>4294967295|(l|0)==-1&k>>>0>~f>>>0){f=o;n=76;break d}i=xl(k|0,l|0,f|0,0)|0;e=y;j=c[r>>2]|0;if(j>>>0<(c[q>>2]|0)>>>0){c[r>>2]=j+1;j=d[j>>0]|0}else j=el(b)|0;f=a[14113+j>>0]|0;if(o>>>0<=(f&255)>>>0){f=o;n=76;break}}}else{f=o;n=76}}while(0);if((n|0)==76)if(f>>>0>(d[14113+j>>0]|0)>>>0){do{i=c[r>>2]|0;if(i>>>0<(c[q>>2]|0)>>>0){c[r>>2]=i+1;i=d[i>>0]|0}else i=el(b)|0}while(f>>>0>(d[14113+i>>0]|0)>>>0);c[(ak()|0)>>2]=34;j=(g&1|0)==0&0==0?p:0;e=h;i=g}else j=p;if(c[q>>2]|0)c[r>>2]=(c[r>>2]|0)+-1;if(!(e>>>0<h>>>0|(e|0)==(h|0)&i>>>0<g>>>0)){if(!((g&1|0)!=0|0!=0|(j|0)!=0)){c[(ak()|0)>>2]=34;g=xl(g|0,h|0,-1,-1)|0;h=y;break}if(e>>>0>h>>>0|(e|0)==(h|0)&i>>>0>g>>>0){c[(ak()|0)>>2]=34;break}}g=((j|0)<0)<<31>>31;g=yl(i^j|0,e^g|0,j|0,g|0)|0;h=y}while(0);y=h;return g|0}function el(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;f=b+104|0;i=c[f>>2]|0;if((i|0)!=0?(c[b+108>>2]|0)>=(i|0):0)j=4;else{e=gl(b)|0;if((e|0)>=0){f=c[f>>2]|0;i=c[b+8>>2]|0;if(f){h=c[b+4>>2]|0;f=f-(c[b+108>>2]|0)|0;g=i;if((i-h|0)<(f|0))j=9;else c[b+100>>2]=h+(f+-1)}else{g=i;j=9}if((j|0)==9)c[b+100>>2]=i;f=b+4|0;if(!g)f=c[f>>2]|0;else{f=c[f>>2]|0;b=b+108|0;c[b>>2]=g+1-f+(c[b>>2]|0)}f=f+-1|0;if((e|0)!=(d[f>>0]|0|0))a[f>>0]=e}else j=4}if((j|0)==4){c[b+100>>2]=0;e=-1}return e|0}function fl(a){a=a|0;return ((a|0)==32|(a+-9|0)>>>0<5)&1|0}function gl(a){a=a|0;var b=0,e=0;e=l;l=l+16|0;b=e;if((hl(a)|0)==0?(Ya[c[a+32>>2]&63](a,b,1)|0)==1:0)a=d[b>>0]|0;else a=-1;l=e;return a|0}function hl(b){b=b|0;var d=0,e=0;d=b+74|0;e=a[d>>0]|0;a[d>>0]=e+255|e;d=b+20|0;e=b+28|0;if((c[d>>2]|0)>>>0>(c[e>>2]|0)>>>0)Ya[c[b+36>>2]&63](b,0,0)|0;c[b+16>>2]=0;c[e>>2]=0;c[d>>2]=0;d=c[b>>2]|0;if(!(d&4)){e=(c[b+44>>2]|0)+(c[b+48>>2]|0)|0;c[b+8>>2]=e;c[b+4>>2]=e;d=d<<27>>31}else{c[b>>2]=d|32;d=-1}return d|0}function il(a,b,c){a=a|0;b=b|0;c=c|0;c=bl(a,b,c,-1,-1)|0;return c|0}function jl(a,b,c){a=a|0;b=b|0;c=c|0;c=bl(a,b,c,-2147483648,0)|0;return c|0}function kl(a,b){a=a|0;b=b|0;var c=0;c=gk(a)|0;return ((ll(a,1,c,b)|0)!=(c|0))<<31>>31|0}function ll(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=N(d,b)|0;d=(b|0)==0?0:d;if((c[e+76>>2]|0)>-1){g=(rk(e)|0)==0;a=Ok(a,f,e)|0;if(!g)sk(e)}else a=Ok(a,f,e)|0;if((a|0)!=(f|0))d=(a>>>0)/(b>>>0)|0;return d|0}function ml(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,m=0;m=l;l=l+16|0;j=m;k=e&255;a[j>>0]=k;g=b+16|0;h=c[g>>2]|0;if(!h)if(!(Pk(b)|0)){h=c[g>>2]|0;i=4}else f=-1;else i=4;do if((i|0)==4){i=b+20|0;g=c[i>>2]|0;if(g>>>0<h>>>0?(f=e&255,(f|0)!=(a[b+75>>0]|0)):0){c[i>>2]=g+1;a[g>>0]=k;break}if((Ya[c[b+36>>2]&63](b,j,1)|0)==1)f=d[j>>0]|0;else f=-1}while(0);l=m;return f|0}function nl(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=l;l=l+16|0;f=e;c[f>>2]=d;d=pk(a,b,f)|0;l=e;return d|0}function ol(a,b){a=a|0;b=b|0;return pk(c[3694]|0,a,b)|0}function pl(a,b){a=a|0;b=b|0;var d=0,e=0;d=l;l=l+16|0;e=d;c[e>>2]=b;b=pk(c[3694]|0,a,e)|0;l=d;return b|0}function ql(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((c[d+76>>2]|0)>=0?(rk(d)|0)!=0:0){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(i=d+20|0,j=c[i>>2]|0,j>>>0<(c[d+16>>2]|0)>>>0):0){c[i>>2]=j+1;a[j>>0]=f}else e=ml(d,b)|0;sk(d)}else k=3;do if((k|0)==3){f=b&255;e=b&255;if((e|0)!=(a[d+75>>0]|0)?(g=d+20|0,h=c[g>>2]|0,h>>>0<(c[d+16>>2]|0)>>>0):0){c[g>>2]=h+1;a[h>>0]=f;break}e=ml(d,b)|0}while(0);return e|0}function rl(b){b=b|0;var d=0,e=0,f=0,g=0;f=c[3694]|0;if((c[f+76>>2]|0)>-1)g=rk(f)|0;else g=0;do if((kl(b,f)|0)<0)b=-1;else{if((a[f+75>>0]|0)!=10?(d=f+20|0,e=c[d>>2]|0,e>>>0<(c[f+16>>2]|0)>>>0):0){c[d>>2]=e+1;a[e>>0]=10;b=0;break}b=(ml(f,10)|0)>>31}while(0);if(g|0)sk(f);return b|0}function sl(){ka(16809160);return}function tl(){return 16809144}function ul(){return 16809152}function vl(){return 16809156}function wl(){}function xl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (y=b+d+(c>>>0<a>>>0|0)>>>0,c|0)|0}function yl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (y=d,a-c>>>0|0)|0}function zl(a){a=a|0;return (a?31-(Q(a^a-1)|0)|0:32)|0}function Al(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=a;j=b;k=j;h=d;n=e;i=n;if(!k){g=(f|0)!=0;if(!i){if(g){c[f>>2]=(l>>>0)%(h>>>0);c[f+4>>2]=0}n=0;f=(l>>>0)/(h>>>0)>>>0;return (y=n,f)|0}else{if(!g){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;f=0;return (y=n,f)|0}}g=(i|0)==0;do if(h){if(!g){g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=31){m=g+1|0;i=31-g|0;b=g-31>>31;h=m;a=l>>>(m>>>0)&b|k<<i;b=k>>>(m>>>0)&b;g=0;i=l<<i;break}if(!f){n=0;f=0;return (y=n,f)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;n=0;f=0;return (y=n,f)|0}g=h-1|0;if(g&h|0){i=(Q(h|0)|0)+33-(Q(k|0)|0)|0;p=64-i|0;m=32-i|0;j=m>>31;o=i-32|0;b=o>>31;h=i;a=m-1>>31&k>>>(o>>>0)|(k<<m|l>>>(i>>>0))&b;b=b&k>>>(i>>>0);g=l<<p&j;i=(k<<p|l>>>(o>>>0))&j|l<<m&i-33>>31;break}if(f|0){c[f>>2]=g&l;c[f+4>>2]=0}if((h|0)==1){o=j|b&0;p=a|0|0;return (y=o,p)|0}else{p=zl(h|0)|0;o=k>>>(p>>>0)|0;p=k<<32-p|l>>>(p>>>0)|0;return (y=o,p)|0}}else{if(g){if(f|0){c[f>>2]=(k>>>0)%(h>>>0);c[f+4>>2]=0}o=0;p=(k>>>0)/(h>>>0)>>>0;return (y=o,p)|0}if(!l){if(f|0){c[f>>2]=0;c[f+4>>2]=(k>>>0)%(i>>>0)}o=0;p=(k>>>0)/(i>>>0)>>>0;return (y=o,p)|0}g=i-1|0;if(!(g&i)){if(f|0){c[f>>2]=a|0;c[f+4>>2]=g&k|b&0}o=0;p=k>>>((zl(i|0)|0)>>>0);return (y=o,p)|0}g=(Q(i|0)|0)-(Q(k|0)|0)|0;if(g>>>0<=30){b=g+1|0;i=31-g|0;h=b;a=k<<i|l>>>(b>>>0);b=k>>>(b>>>0);g=0;i=l<<i;break}if(!f){o=0;p=0;return (y=o,p)|0}c[f>>2]=a|0;c[f+4>>2]=j|b&0;o=0;p=0;return (y=o,p)|0}while(0);if(!h){k=i;j=0;i=0}else{m=d|0|0;l=n|e&0;k=xl(m|0,l|0,-1,-1)|0;d=y;j=i;i=0;do{e=j;j=g>>>31|j<<1;g=i|g<<1;e=a<<1|e>>>31|0;n=a>>>31|b<<1|0;yl(k|0,d|0,e|0,n|0)|0;p=y;o=p>>31|((p|0)<0?-1:0)<<1;i=o&1;a=yl(e|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=y;h=h-1|0}while((h|0)!=0);k=j;j=0}h=0;if(f|0){c[f>>2]=a;c[f+4>>2]=b}o=(g|0)>>>31|(k|h)<<1|(h<<1|g>>>31)&0|j;p=(g<<1|0>>>31)&-2|i;return (y=o,p)|0}function Bl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=yl(j^a|0,i^b|0,j|0,i|0)|0;g=y;a=f^j;b=e^i;return yl((Al(h,g,yl(f^c|0,e^d|0,f|0,e|0)|0,y,0)|0)^a|0,y^b|0,a|0,b|0)|0}function Cl(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=N(e,f)|0;d=a>>>16;a=(c>>>16)+(N(e,d)|0)|0;e=b>>>16;b=N(e,f)|0;return (y=(a>>>16)+(N(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function Dl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=Cl(e,f)|0;a=y;return (y=(N(b,f)|0)+(N(d,e)|0)+a|a&0,c|0|0)|0}function El(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=l;l=l+16|0;i=f|0;h=b>>31|((b|0)<0?-1:0)<<1;g=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;j=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;a=yl(h^a|0,g^b|0,h|0,g|0)|0;b=y;Al(a,b,yl(k^d|0,j^e|0,k|0,j|0)|0,y,i)|0;e=yl(c[i>>2]^h|0,c[i+4>>2]^g|0,h|0,g|0)|0;d=y;l=f;return (y=d,e)|0}function Fl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Al(a,b,c,d,0)|0}function Gl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;g=l;l=l+16|0;f=g|0;Al(a,b,d,e,f)|0;l=g;return (y=c[f+4>>2]|0,c[f>>2]|0)|0}function Hl(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=(b|0)<0?-1:0;return b>>c-32|0}function Il(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}y=0;return b>>>c-32|0}function Jl(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){y=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}y=a<<c-32;return 0}function Kl(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function Ll(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)>=8192)return za(b|0,d|0,e|0)|0;h=b|0;g=b+e|0;if((b&3)==(d&3)){while(b&3){if(!e)return h|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}e=g&-4|0;f=e-64|0;while((b|0)<=(f|0)){c[b>>2]=c[d>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];c[b+24>>2]=c[d+24>>2];c[b+28>>2]=c[d+28>>2];c[b+32>>2]=c[d+32>>2];c[b+36>>2]=c[d+36>>2];c[b+40>>2]=c[d+40>>2];c[b+44>>2]=c[d+44>>2];c[b+48>>2]=c[d+48>>2];c[b+52>>2]=c[d+52>>2];c[b+56>>2]=c[d+56>>2];c[b+60>>2]=c[d+60>>2];b=b+64|0;d=d+64|0}while((b|0)<(e|0)){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0}}else{e=g-4|0;while((b|0)<(e|0)){a[b>>0]=a[d>>0]|0;a[b+1>>0]=a[d+1>>0]|0;a[b+2>>0]=a[d+2>>0]|0;a[b+3>>0]=a[d+3>>0]|0;b=b+4|0;d=d+4|0}}while((b|0)<(g|0)){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0}return h|0}function Ml(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b>>0]=a[c>>0]|0}b=e}else Ll(b,c,d)|0;return b|0}function Nl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;h=b+e|0;d=d&255;if((e|0)>=67){while(b&3){a[b>>0]=d;b=b+1|0}f=h&-4|0;g=f-64|0;i=d|d<<8|d<<16|d<<24;while((b|0)<=(g|0)){c[b>>2]=i;c[b+4>>2]=i;c[b+8>>2]=i;c[b+12>>2]=i;c[b+16>>2]=i;c[b+20>>2]=i;c[b+24>>2]=i;c[b+28>>2]=i;c[b+32>>2]=i;c[b+36>>2]=i;c[b+40>>2]=i;c[b+44>>2]=i;c[b+48>>2]=i;c[b+52>>2]=i;c[b+56>>2]=i;c[b+60>>2]=i;b=b+64|0}while((b|0)<(f|0)){c[b>>2]=i;b=b+4|0}}while((b|0)<(h|0)){a[b>>0]=d;b=b+1|0}return h-e|0}function Ol(a){a=a|0;var b=0,d=0;d=c[i>>2]|0;b=d+a|0;if((a|0)>0&(b|0)<(d|0)|(b|0)<0){V()|0;la(12);return -1}c[i>>2]=b;if((b|0)>(U()|0)?(T()|0)==0:0){c[i>>2]=d;la(12);return -1}return d|0}function Pl(a,b){a=a|0;b=b|0;return Wa[a&15](b|0)|0}function Ql(a,b,c){a=a|0;b=b|0;c=c|0;return Xa[a&3](b|0,c|0)|0}function Rl(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ya[a&63](b|0,c|0,d|0)|0}function Sl(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Za[a&3](b|0,c|0,d|0,e|0)|0}function Tl(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return _a[a&7](b|0,c|0,d|0,e|0,f|0)|0}function Ul(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return $a[a&15](b|0,c|0,d|0,e|0,f|0,g|0)|0}function Vl(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;return ab[a&3](b|0,c|0,d|0,e|0,f|0,g|0,h|0)|0}function Wl(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return bb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0)|0}function Xl(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;return cb[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0,k|0,l|0,m|0,n|0,o|0,p|0,q|0)|0}function Yl(a,b){a=a|0;b=b|0;db[a&15](b|0)}function Zl(a,b,c){a=a|0;b=b|0;c=c|0;eb[a&15](b|0,c|0)}function _l(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fb[a&15](b|0,c|0,d|0)}function $l(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;gb[a&63](b|0,c|0,d|0,e|0)}function am(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;hb[a&7](b|0,c|0,d|0,e|0,f|0)}function bm(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ib[a&1](b|0,c|0,d|0,e|0,f|0,g|0)}function cm(a){a=a|0;R(0);return 0}function dm(a,b){a=a|0;b=b|0;R(1);return 0}function em(a,b,c){a=a|0;b=b|0;c=c|0;R(2);return 0}function fm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(3);return 0}function gm(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(4);return 0}function hm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(5);return 0}function im(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;R(6);return 0}function jm(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;R(7);return 0}function km(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;R(8);return 0}function lm(a){a=a|0;R(9)}function mm(a,b){a=a|0;b=b|0;R(10)}function nm(a,b,c){a=a|0;b=b|0;c=c|0;R(11)}function om(a,b,c){a=a|0;b=b|0;c=c|0;ua(a|0,b|0,c|0)}function pm(a,b,c){a=a|0;b=b|0;c=c|0;Ra(a|0,b|0,c|0)}function qm(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;R(12)}function rm(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;R(13)}function sm(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;R(14)} + +// EMSCRIPTEN_END_FUNCS +var Wa=[cm,qh,uh,Yj,Xb,se,lh,xh,Hh,Ih,cm,cm,cm,cm,cm,cm];var Xa=[dm,sh,De,dm];var Ya=[em,Zj,_j,ck,Qk,Cb,Gb,Hb,Kb,Mb,Cc,Nc,Oc,Pc,Zc,td,ae,ce,mh,yh,Bh,Dh,Jh,Lh,Oh,Qh,Uh,Wh,Ui,Wi,Yi,vj,xj,Ej,Gj,Ij,Kj,Mj,Oj,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em,em];var Za=[fm,Ic,Lc,fm];var _a=[gm,Eb,Wb,dc,ic,lc,Mc,gm];var $a=[hm,xc,yc,zc,Ac,Fc,Gc,Hc,Jc,Be,hm,hm,hm,hm,hm,hm];var ab=[im,Bc,te,ue];var bb=[jm,Kc];var cb=[km,Dc];var db=[lm,ph,rh,xb,Ab,Bb,yb,jc,uc,Sh,_i,$i,bj,aj,ej,lm];var eb=[mm,th,Sb,Zb,vc,wc,Ec,Ce,Fh,dj,cj,zj,Aj,mm,mm,mm];var fb=[nm,wh,om,pm,Yb,Pd,Rd,$d,df,gf,Ah,Th,Qj,nm,nm,nm];var gb=[qm,Ib,Jb,Lb,oc,_c,fd,kd,ld,ud,be,de,ve,xe,ye,ef,nh,zh,Ch,Eh,Kh,Mh,Ph,Rh,Vh,Xh,Vi,Xi,Zi,wj,yj,Dj,Fj,Hj,Jj,Lj,Nj,Pj,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm,qm];var hb=[rm,vh,Tc,bd,dd,Ee,rm,rm];var ib=[sm,zb];return{___divdi3:Bl,___emscripten_environ_constructor:sl,___muldi3:Dl,___remdi3:El,___udivdi3:Fl,___uremdi3:Gl,__get_daylight:ul,__get_timezone:vl,__get_tzname:tl,_bitshift64Ashr:Hl,_bitshift64Lshr:Il,_bitshift64Shl:Jl,_console_queue_char:qb,_display_key_event:rb,_display_mouse_event:sb,_display_wheel_event:tb,_free:Uj,_fs_import_file:id,_i64Add:xl,_i64Subtract:yl,_llvm_bswap_i32:Kl,_malloc:Tj,_memcpy:Ll,_memmove:Ml,_memset:Nl,_net_set_carrier:vb,_net_write_packet:ub,_sbrk:Ol,_vm_start:wb,dynCall_ii:Pl,dynCall_iii:Ql,dynCall_iiii:Rl,dynCall_iiiii:Sl,dynCall_iiiiii:Tl,dynCall_iiiiiii:Ul,dynCall_iiiiiiii:Vl,dynCall_iiiiiiiii:Wl,dynCall_iiiiiiiiiiiiiiiii:Xl,dynCall_vi:Yl,dynCall_vii:Zl,dynCall_viii:_l,dynCall_viiii:$l,dynCall_viiiii:am,dynCall_viiiiii:bm,establishStackSpace:mb,getTempRet0:pb,runPostSets:wl,setTempRet0:ob,setThrew:nb,stackAlloc:jb,stackRestore:lb,stackSave:kb}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___divdi3=Module["___divdi3"]=asm["___divdi3"];var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=asm["___emscripten_environ_constructor"];var ___muldi3=Module["___muldi3"]=asm["___muldi3"];var ___remdi3=Module["___remdi3"]=asm["___remdi3"];var ___udivdi3=Module["___udivdi3"]=asm["___udivdi3"];var ___uremdi3=Module["___uremdi3"]=asm["___uremdi3"];var __get_daylight=Module["__get_daylight"]=asm["__get_daylight"];var __get_timezone=Module["__get_timezone"]=asm["__get_timezone"];var __get_tzname=Module["__get_tzname"]=asm["__get_tzname"];var _bitshift64Ashr=Module["_bitshift64Ashr"]=asm["_bitshift64Ashr"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var _console_queue_char=Module["_console_queue_char"]=asm["_console_queue_char"];var _display_key_event=Module["_display_key_event"]=asm["_display_key_event"];var _display_mouse_event=Module["_display_mouse_event"]=asm["_display_mouse_event"];var _display_wheel_event=Module["_display_wheel_event"]=asm["_display_wheel_event"];var _free=Module["_free"]=asm["_free"];var _fs_import_file=Module["_fs_import_file"]=asm["_fs_import_file"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _net_set_carrier=Module["_net_set_carrier"]=asm["_net_set_carrier"];var _net_write_packet=Module["_net_write_packet"]=asm["_net_write_packet"];var _sbrk=Module["_sbrk"]=asm["_sbrk"];var _vm_start=Module["_vm_start"]=asm["_vm_start"];var establishStackSpace=Module["establishStackSpace"]=asm["establishStackSpace"];var getTempRet0=Module["getTempRet0"]=asm["getTempRet0"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var setTempRet0=Module["setTempRet0"]=asm["setTempRet0"];var setThrew=Module["setThrew"]=asm["setThrew"];var stackAlloc=Module["stackAlloc"]=asm["stackAlloc"];var stackRestore=Module["stackRestore"]=asm["stackRestore"];var stackSave=Module["stackSave"]=asm["stackSave"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_iiiiii=Module["dynCall_iiiiii"]=asm["dynCall_iiiiii"];var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=asm["dynCall_iiiiiii"];var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=asm["dynCall_iiiiiiii"];var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=asm["dynCall_iiiiiiiii"];var dynCall_iiiiiiiiiiiiiiiii=Module["dynCall_iiiiiiiiiiiiiiiii"]=asm["dynCall_iiiiiiiiiiiiiiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;if(memoryInitializer){if(!isDataURI(memoryInitializer)){memoryInitializer=locateFile(memoryInitializer)}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}var memoryInitializerBytes=tryParseAsDataURI(memoryInitializer);if(memoryInitializerBytes){applyMemoryInitializer(memoryInitializerBytes.buffer)}else if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];var response=request.response;if(request.status!==200&&request.status!==0){var data=tryParseAsDataURI(Module["memoryInitializerRequestURL"]);if(data){response=data.buffer}else{console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}}applyMemoryInitializer(response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + + @@ -3,4 +3,7 @@ Dumped from http://squoze.net/UNIX/v4/README Which itself is dumped from: https://archive.org/details/utah_unix_v4_raw +Also includes jslinux for running the image from a browser. +This a hacky and messy repo put together in just a few hours to let people +play around with Unix v4 in their web browser. |
